ในระบบปรับอากาศ (HVAC) หัวใจสำคัญไม่ใช่แค่การทำให้เย็น แต่คือการ “เลี้ยงอุณหภูมิ” ให้คงที่เพื่อประหยัดไฟ ในบทนี้เราจะจำลองระบบ Smart Thermostat โดยใช้เซ็นเซอร์วัดอุณหภูมิยอดฮิตอย่าง DHT11/DHT22 มาอ่านค่าส่งขึ้น Cloud (Blynk) และเขียนโปรแกรมให้ ESP32 ตัดสินใจเปิด-ปิดพัดลม (จำลองด้วย LED) เองเมื่ออากาศร้อนเกินกำหนด โดยไม่ต้องรอให้เรากดสั่งครับ
1. จุดประสงค์การเรียนรู้ (Objectives)
- เข้าใจการใช้งานเซ็นเซอร์วัดอุณหภูมิและความชื้น (DHT Sensor)
- สามารถส่งค่าจากเซ็นเซอร์ขึ้นไปแสดงผลเป็นกราฟบนแอปฯ Blynk ได้
- เขียนโปรแกรมควบคุมแบบอัตโนมัติ (Automation Logic) โดยใช้เงื่อนไข
if-else
2. อุปกรณ์ที่ต้องเตรียม (Hardware)
- บอร์ด ESP32 : 1 บอร์ด
- เซ็นเซอร์ DHT11 หรือ DHT22 : 1 ตัว (แนะนำ DHT22 เพราะแม่นยำกว่า)
- LED 1 หลอด (ใช้จำลองคอมเพรสเซอร์แอร์ หรือพัดลม)
- ตัวต้านทาน 220 โอห์ม : 1 ตัว (สำหรับ LED)
- ตัวต้านทาน 10k โอห์ม : 1 ตัว (Pull-up resistor สำหรับ DHT ถ้าใช้โมดูลสำเร็จรูปไม่ต้องใช้)
- สาย 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
- ไปที่ Template เดิม (Smart Plug) หรือสร้างใหม่
- เพิ่ม Datastream ใหม่ 2 ตัว:
- Virtual Pin V1: Name =
Temperature, Data Type =Double, Units =Celsius - Virtual Pin V2: Name =
Humidity, Data Type =Double, Units =%
- Virtual Pin V1: Name =
- (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)
- Gauge (เกจวัด): เลือก Datastream
Temperature (V1)เพื่อดูเข็มวัดอุณหภูมิสวยๆ - Labeled Value: เลือก Datastream
Humidity (V2)เพื่อดูตัวเลขความชื้น - SuperChart (กราฟ): เลือก V1 และ V2 เพื่อดูแนวโน้มอุณหภูมิย้อนหลัง
7. ผลลัพธ์การทดลอง
- เปิด Serial Monitor ดูค่าอุณหภูมิปัจจุบัน
- ทดสอบความร้อน: ลองใช้ไดร์เป่าผมเป่าห่างๆ หรือใช้นิ้วถูที่ตัวเซ็นเซอร์ให้อุ่นขึ้น
- เมื่ออุณหภูมิพุ่งเกิน 30°C -> ไฟ LED จะต้อง “ติดเอง” ทันที
- เมื่อปล่อยให้เย็นลงต่ำกว่า 28°C -> ไฟ LED จะต้อง “ดับเอง”
- ดูกราฟในมือถือ จะเห็นเส้นกราฟอุณหภูมิขยับขึ้นลงตามเวลาจริง
เกร็ดความรู้สำหรับช่าง:
- Hysteresis (ฮิสเตอรีซิส): สังเกตว่าในโค้ดผมตั้งเปิดที่ 30 แต่ปิดที่ 28 (ไม่ใช่ 30) ทำไม?
- คำตอบ: เพื่อป้องกัน Short Cycling ครับ ถ้าเราตั้งเปิด/ปิดที่ 30 เท่ากัน เป๊ะๆ เวลาอุณหภูมิอยู่ที่ 29.9 <> 30.1 แอร์จะตัด-ต่อ ถี่รัวๆ จนคอมเพรสเซอร์พัง การเว้นระยะ (Gap) ตรงนี้คือเทคนิควิศวกรรมที่สำคัญมากครับ
