ในระบบปรับอากาศ (HVAC) หัวใจสำคัญไม่ใช่แค่การทำให้เย็น แต่คือการ “เลี้ยงอุณหภูมิ” ให้คงที่เพื่อประหยัดไฟ ในบทนี้เราจะจำลองระบบ Smart Thermostat โดยใช้เซ็นเซอร์วัดอุณหภูมิยอดฮิตอย่าง DHT11/DHT22 มาอ่านค่าส่งขึ้น Cloud (Blynk) และเขียนโปรแกรมให้ ESP32 ตัดสินใจเปิด-ปิดพัดลม (จำลองด้วย LED) เองเมื่ออากาศร้อนเกินกำหนด โดยไม่ต้องรอให้เรากดสั่งครับ


1. จุดประสงค์การเรียนรู้ (Objectives)

  1. เข้าใจการใช้งานเซ็นเซอร์วัดอุณหภูมิและความชื้น (DHT Sensor)
  2. สามารถส่งค่าจากเซ็นเซอร์ขึ้นไปแสดงผลเป็นกราฟบนแอปฯ Blynk ได้
  3. เขียนโปรแกรมควบคุมแบบอัตโนมัติ (Automation Logic) โดยใช้เงื่อนไข if-else

2. อุปกรณ์ที่ต้องเตรียม (Hardware)

  1. บอร์ด ESP32 : 1 บอร์ด
  2. เซ็นเซอร์ DHT11 หรือ DHT22 : 1 ตัว (แนะนำ DHT22 เพราะแม่นยำกว่า)
  3. LED 1 หลอด (ใช้จำลองคอมเพรสเซอร์แอร์ หรือพัดลม)
  4. ตัวต้านทาน 220 โอห์ม : 1 ตัว (สำหรับ LED)
  5. ตัวต้านทาน 10k โอห์ม : 1 ตัว (Pull-up resistor สำหรับ DHT ถ้าใช้โมดูลสำเร็จรูปไม่ต้องใช้)
  6. สาย Jumper และ Breadboard

3. การต่อวงจร (Wiring Diagram)

  • ส่วน Input (DHT Sensor):
    • ขา 1 (VCC) -> ต่อ 3.3V หรือ 5V
    • ขา 2 (Data) -> ต่อ GPIO 4
    • ขา 4 (GND) -> ต่อ GND
    • (หมายเหตุ: ถ้าเป็นตัวเซ็นเซอร์เปล่าๆ ต้องต่อ R 10k คร่อมระหว่างขา 1 และ 2 ด้วย แต่ถ้าเป็น Module สำเร็จรูป เสียบสายได้เลย)
  • ส่วน Output (LED/AC):
    • ขาบวก LED -> ต่อ GPIO 2 (หรือใช้ไฟ LED บนบอร์ดก็ได้)
    • ขาลบ LED -> ต่อ R 220Ω ลง GND

4. การตั้งค่าบน Blynk Console

  1. ไปที่ Template เดิม (Smart Plug) หรือสร้างใหม่
  2. เพิ่ม Datastream ใหม่ 2 ตัว:
    • Virtual Pin V1: Name = Temperature, Data Type = Double, Units = Celsius
    • Virtual Pin V2: Name = Humidity, Data Type = Double, Units = %
  3. (Optional) เพิ่ม Virtual Pin V3: Name = AC Status, Data Type = Integer (เอาไว้โชว์สถานะว่าแอร์ทำงานอยู่ไหม)

5. การเขียนโปรแกรม (Source Code)

ต้องติดตั้ง Library เพิ่ม 2 ตัวคือ “DHT sensor library” (โดย Adafruit) และ “Adafruit Unified Sensor”

C++
#define BLYNK_TEMPLATE_ID "ใส่_Template_ID_เดิมหรือใหม่"
#define BLYNK_DEVICE_NAME "Smart HVAC"
#define BLYNK_AUTH_TOKEN "ใส่_Auth_Token"

#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>

char ssid[] = "ชื่อไวไฟ";
char pass[] = "รหัสผ่าน";

// กำหนดขาอุปกรณ์
#define DHTPIN 4      // ขา Data ของ DHT
#define DHTTYPE DHT22 // เลือกชนิดเซ็นเซอร์ (DHT11 หรือ DHT22)
#define LED_PIN 2     // ขา LED (จำลองแอร์)

DHT dht(DHTPIN, DHTTYPE);
BlynkTimer timer; // ตัวตั้งเวลาทำงาน (สำคัญมาก ห้ามใช้ delay ใน loop)

// --- ฟังก์ชันอ่านค่าเซ็นเซอร์และประมวลผล ---
void sendSensor() {
  float h = dht.readHumidity(); // อ่านความชื้น
  float t = dht.readTemperature(); // อ่านอุณหภูมิ (C)

  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // ส่งค่าขึ้น Blynk
  Blynk.virtualWrite(V1, t);
  Blynk.virtualWrite(V2, h);
  
  Serial.print("Temp: "); Serial.print(t);
  Serial.print(" C, Humidity: "); Serial.print(h); Serial.println(" %");

  // --- Automation Logic (หัวใจของ Smart Thermostat) ---
  // ตั้งเงื่อนไข: ถ้าร้อนกว่า 30 องศา ให้เปิดแอร์ (LED ติด)
  if (t > 30.0) {
    digitalWrite(LED_PIN, HIGH);
    Blynk.virtualWrite(V3, 1); // ส่งสถานะ ON ไปโชว์ในแอป
    Serial.println(" -> Too Hot! AC ON");
  }
  // ถ้าเย็นต่ำกว่า 28 องศา ให้ปิดแอร์ (LED ดับ) - เพื่อป้องกันแอร์ตัดต่อบ่อยเกินไป (Hysteresis)
  else if (t < 28.0) {
    digitalWrite(LED_PIN, LOW);
    Blynk.virtualWrite(V3, 0); // ส่งสถานะ OFF ไปโชว์ในแอป
    Serial.println(" -> Cool enough. AC OFF");
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);
  dht.begin();
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);

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

void loop() {
  Blynk.run();
  timer.run(); // สั่งให้ตัวตั้งเวลาทำงาน
}

6. การตั้งค่าหน้าจอแอป Blynk (Mobile App)

  1. Gauge (เกจวัด): เลือก Datastream Temperature (V1) เพื่อดูเข็มวัดอุณหภูมิสวยๆ
  2. Labeled Value: เลือก Datastream Humidity (V2) เพื่อดูตัวเลขความชื้น
  3. SuperChart (กราฟ): เลือก V1 และ V2 เพื่อดูแนวโน้มอุณหภูมิย้อนหลัง

7. ผลลัพธ์การทดลอง

  1. เปิด Serial Monitor ดูค่าอุณหภูมิปัจจุบัน
  2. ทดสอบความร้อน: ลองใช้ไดร์เป่าผมเป่าห่างๆ หรือใช้นิ้วถูที่ตัวเซ็นเซอร์ให้อุ่นขึ้น
  3. เมื่ออุณหภูมิพุ่งเกิน 30°C -> ไฟ LED จะต้อง “ติดเอง” ทันที
  4. เมื่อปล่อยให้เย็นลงต่ำกว่า 28°C -> ไฟ LED จะต้อง “ดับเอง”
  5. ดูกราฟในมือถือ จะเห็นเส้นกราฟอุณหภูมิขยับขึ้นลงตามเวลาจริง

เกร็ดความรู้สำหรับช่าง:

  • Hysteresis (ฮิสเตอรีซิส): สังเกตว่าในโค้ดผมตั้งเปิดที่ 30 แต่ปิดที่ 28 (ไม่ใช่ 30) ทำไม?
    • คำตอบ: เพื่อป้องกัน Short Cycling ครับ ถ้าเราตั้งเปิด/ปิดที่ 30 เท่ากัน เป๊ะๆ เวลาอุณหภูมิอยู่ที่ 29.9 <> 30.1 แอร์จะตัด-ต่อ ถี่รัวๆ จนคอมเพรสเซอร์พัง การเว้นระยะ (Gap) ตรงนี้คือเทคนิควิศวกรรมที่สำคัญมากครับ