สวัสดีครับนักศึกษาทุกคน ยินดีต้อนรับสู่ Workshop แรกของเรา! วันนี้เราจะไม่เรียนทฤษฎีใหม่ แต่เราจะมา “ประกอบร่าง” ความรู้เดิมให้เป็นชิ้นงานที่ใช้งานได้จริง

โจทย์ของเราวันนี้: เราจะจำลองระบบห้องนอนอัจฉริยะที่มีความสามารถดังนี้:

  1. Monitor: ดูค่าอุณหภูมิและความชื้นในห้องผ่านมือถือได้ (ใช้ DHT11)
  2. Control: สั่งเปิด-ปิด “ไฟเพดาน” ผ่านมือถือได้ (ใช้ LED สีแดง แทนหลอดไฟ)
  3. Automation: ถ้าอากาศร้อนเกิน 30°C ให้ “พัดลม” เปิดเองอัตโนมัติ (ใช้ LED สีน้ำเงิน แทนพัดลม)

1. เตรียมอุปกรณ์และการต่อวงจร

เราจะใช้อุปกรณ์ทั้งหมด 3 ส่วนหลัก ต่อเข้ากับ ESP32 ดังนี้ครับ:

  1. เซนเซอร์ DHT11 (ขา Data) -> ต่อเข้า GPIO 15
  2. หลอดไฟ (LED สีแดง) -> ต่อเข้า GPIO 23 (อย่าลืม R 220Ω)
  3. พัดลม (LED สีน้ำเงิน/เขียว) -> ต่อเข้า GPIO 22 (อย่าลืม R 220Ω)

[Image Suggestion: Diagram of ESP32 connected to DHT11 on pin 15, Red LED on pin 23, Blue LED on pin 22]


2. ตั้งค่า Blynk (Template & Datastream)

ให้เข้าไปที่ blynk.cloud หรือแอป Blynk แล้วตั้งค่าตามนี้:

1. สร้าง Datastream 4 ตัว:

  • V0 (Switch): สำหรับปุ่มเปิด-ปิดไฟ (Integer, 0-1)
  • V1 (Temp): สำหรับโชว์อุณหภูมิ (Double, 0-50, หน่วย °C)
  • V2 (Hum): สำหรับโชว์ความชื้น (Double, 0-100, หน่วย %)
  • V3 (Fan Status): สำหรับโชว์สถานะพัดลม (Integer, 0-1) เอาไว้ดูว่าพัดลมทำงานอยู่ไหม

2. สร้าง Dashboard บนมือถือ:

  • Button: เชื่อมกับ V0 (Mode: Switch) -> ตั้งชื่อว่า “Light Switch”
  • Gauge: เชื่อมกับ V1 -> ตั้งชื่อว่า “Temperature”
  • Gauge: เชื่อมกับ V2 -> ตั้งชื่อว่า “Humidity”
  • LED / Indicator: เชื่อมกับ V3 -> ตั้งชื่อว่า “Fan Status”

3. เขียนโค้ดควบคุม (The Logic)

โค้ดนี้จะใช้ BlynkTimer ในการอ่านค่าเซนเซอร์และตัดสินใจ (Automation Logic) ทุกๆ 2 วินาที เพื่อไม่ให้ระบบรวนครับ

C++
#define BLYNK_TEMPLATE_ID "TMPLxxxxxx"      // **แก้ไขเป็นของตัวเอง**
#define BLYNK_TEMPLATE_NAME "Smart Bedroom"
#define BLYNK_AUTH_TOKEN "YourAuthToken"    // **แก้ไขเป็นของตัวเอง**

#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include "DHT.h"

// --- ตั้งค่า WiFi ---
char ssid[] = "YOUR_WIFI_NAME";
char pass[] = "YOUR_WIFI_PASS";

// --- ตั้งค่าขาอุปกรณ์ ---
#define DHTPIN 15
#define DHTTYPE DHT11
#define LIGHT_PIN 23  // ไฟเพดาน
#define FAN_PIN 22    // พัดลม

DHT dht(DHTPIN, DHTTYPE);
BlynkTimer timer;

// --- ฟังก์ชันรับคำสั่งเปิด-ปิดไฟจากมือถือ (Manual Control) ---
BLYNK_WRITE(V0) {
  int pinValue = param.asInt(); // รับค่า 0 หรือ 1
  digitalWrite(LIGHT_PIN, pinValue); // สั่งงาน LED สีแดง
  
  if(pinValue == 1) Serial.println("Light ON");
  else Serial.println("Light OFF");
}

// --- ฟังก์ชันอ่านค่าและทำงานอัตโนมัติ (Automation Logic) ---
void myTimerEvent() {
  // 1. อ่านค่าจากเซนเซอร์
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  // เช็คว่าอ่านค่าได้จริงไหม
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // 2. ส่งค่าขึ้น Blynk
  Blynk.virtualWrite(V1, t); // ส่งอุณหภูมิไป V1
  Blynk.virtualWrite(V2, h); // ส่งความชื้นไป V2
  
  Serial.print("Temp: "); Serial.print(t);
  Serial.print(" | Hum: "); Serial.println(h);

  // 3. ระบบควบคุมพัดลมอัตโนมัติ (Smart Fan Logic)
  if (t > 30.0) { // ถ้าร้อนกว่า 30 องศา
    digitalWrite(FAN_PIN, HIGH); // เปิดพัดลม (LED น้ำเงิน)
    Blynk.virtualWrite(V3, 1);   // ส่งสถานะไปบอกแอปว่า "พัดลมทำงาน"
    Serial.println("Auto Fan: ON (Too Hot!)");
  } 
  else { // ถ้าเย็นลงแล้ว
    digitalWrite(FAN_PIN, LOW);  // ปิดพัดลม
    Blynk.virtualWrite(V3, 0);   // ส่งสถานะไปบอกแอปว่า "พัดลมหยุด"
    Serial.println("Auto Fan: OFF");
  }
}

void setup() {
  Serial.begin(115200);

  // กำหนดโหมดขา
  pinMode(LIGHT_PIN, OUTPUT);
  pinMode(FAN_PIN, OUTPUT);
  
  dht.begin();
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);

  // ตั้งเวลาให้ฟังก์ชัน myTimerEvent ทำงานทุกๆ 10 วินาที (10000ms)
  timer.setInterval(10000L, myTimerEvent);
}

void loop() {
  Blynk.run();
  timer.run();
}

4. ขั้นตอนการทดสอบ

  1. Upload Code: ตรวจสอบความถูกต้องของ Template ID และ WiFi ก่อนอัปโหลด
  2. เปิด Serial Monitor: ดูว่าเชื่อมต่อ WiFi ได้แล้ว และเริ่มอ่านค่า Temp/Hum ได้หรือไม่
  3. ทดสอบ Manual: กดปุ่ม Light Switch บนมือถือ -> LED สีแดงต้องติด/ดับ ทันที
  4. ทดสอบ Auto:
    • ลองเอาไฟแช็ค (ลนห่างๆ) หรือไดร์เป่าผม เป่าที่ DHT11 ให้อุณหภูมิขึ้นเกิน 30°C
    • ผลลัพธ์: LED สีน้ำเงิน (พัดลม) ต้องติดเอง และในแอปช่อง Fan Status ต้องสว่างขึ้น
    • ปล่อยให้เย็นลงต่ำกว่า 30°C -> พัดลมต้องดับเอง

5. โจทย์ท้าทาย (Challenge) สำหรับนักศึกษา

เพื่อให้ได้คะแนนเต็มใน Workshop นี้ ให้นักศึกษาเพิ่มเติมฟีเจอร์ดังนี้:

  1. เพิ่มปุ่ม “Auto/Manual Mode” (V4):
    • ถ้ากดเปิดโหมด Auto -> ให้พัดลมทำงานตามอุณหภูมิ (เหมือนโค้ดข้างบน)
    • ถ้ากดปิดโหมด Auto -> ให้เราสามารถกดปุ่มสั่งเปิด-ปิดพัดลมเองได้ (Manual Override)
  2. เพิ่มการแจ้งเตือน: ถ้าอุณหภูมิสูงเกิน 35°C ให้แจ้งเตือนเข้ามือถือว่า “ร้อนตับแลบแล้ว!” (ใช้ Blynk.logEvent)

สรุปท้ายบท

ยินดีด้วยครับ! ถ้านักศึกษาทำ Workshop นี้สำเร็จ แปลว่าตอนนี้นักศึกษามีทักษะพื้นฐานครบถ้วนที่จะไปสร้างโปรเจกต์ IoT จริงๆ ได้แล้ว เพราะหลักการของ Smart Farm หรือ Smart Factory ก็ใช้ Logic แบบเดียวกันนี้ครับ (แค่เปลี่ยน LED เป็น Relay คุมปั๊มน้ำ หรือแมกเนติกคอนแทคเตอร์)

ภารกิจต่อไป: ใน Workshop ถัดไป เราจะขยับไปทำระบบที่ “จับต้องได้” มากขึ้น เหมาะสำหรับสายเกษตร นั่นคือ Workshop 2: ระบบ Smart Farm รดน้ำต้นไม้อัตโนมัติ (วัดความชื้นดิน) ซึ่งเป็นโปรเจกต์ยอดฮิตตลอดกาลครับ!


หมายเหตุสำหรับคุณครู:

  • ใน Workshop นี้ ผมใช้ LED แทน Relay เพื่อความปลอดภัยในการทดลองครับ แต่คุณครูสามารถอธิบายเสริมได้ว่าถ้าจะใช้งานจริง แค่เปลี่ยนจาก LED เป็น Relay Module ก็คุมไฟบ้าน 220V ได้เลย (แต่ต้องระวังเรื่องไฟดูด)
  • โค้ดส่วน Automation (if t > 30) เป็นตัวอย่าง Logic Control แบบพื้นฐานที่สุดที่นักศึกษาต้องเข้าใจครับ