เนื้อหาในบทความ
ภาพรวมโปรเจกต์
ในบทความนี้ เราจะสร้างเซ็นเซอร์โหนด (Sensor Node) ที่ตรวจวัดอุณหภูมิและความชื้น โดยใช้ ESP32 ที่สามารถทำงานด้วยแบตเตอรี่ได้นานหลายเดือนถึงหนึ่งปี เหมาะสำหรับการนำไปใช้งานจริงใน:
- โรงเรือนหรือสวน
- คลังสินค้า
- ห้องเก็บของ
- บ้านอัจฉริยะ (Smart Home)
- โครงการ IoT ต่างๆ
💡 เคล็ดลับ: เซ็นเซอร์โหนดประหยัดไฟสามารถเชื่อมต่อกับ CynoIoT Platform เพื่อส่งข้อมูลและตรวจสอบผ่าน Dashboard ได้อย่างสะดวก
อุปกรณ์ที่ต้องใช้
Hardware
| อุปกรณ์ | รุ่น/ข้อมูล | ราคาโดยประมาณ |
|---|---|---|
| ESP32 Board | DevKit V1, NodeMCU, หรือ Wemos | ~฿150-200 |
| DHT22 Sensor | AM2302 (อุณหภูมิ + ความชื้น) | ~฿50-80 |
| Resistor | 10kΩ (สำหรับ DHT22) | ~฿1-2 |
| Li-Ion Battery | 18650 (2000-3000mAh) | ~฿80-150 |
| Battery Holder | ถาดแบต 18660 + TP4056 | ~฿30-50 |
⚠️ หมายเหตุ: ราคาอาจแตกต่างกันไปตามร้านค้าและยี่ห้อ ควรเลือกซื้อจากร้านที่เชื่อถือได้
Software
- Arduino IDE (รุ่นล่าสุด)
- ESP32 Board Support (ติดตั้งผ่าน Board Manager)
- ไลบรารี DHT sensor (Adafruit DHT library)
- CynoIoT Account (ฟรี - สำหรับเชื่อมต่อ Cloud)
การต่อวงจร
ต่อวงจรตามรายละเอียดด้านล่าง:
ขาต่อ DHT22:
- • Pin 1 (VCC) → 3.3V ของ ESP32
- • Pin 2 (DATA) → GPIO 4 ของ ESP32 (เชื่อมต่อผ่านตัวต้านทาน 10kΩ ไปยัง VCC)
- • Pin 3 (NC) → ไม่ต้องต่อ
- • Pin 4 (GND) → GND ของ ESP32
การต่อแบตเตอรี่:
- • ใช้ TP4056 Charger Module เพื่อชาร์จและคุ้มครองแบตเตอรี่
- • ออกจาก TP4056 จะได้แรงดันประมาณ 3.7V-4.2V
- • ต่อเข้า VIN ของ ESP32 (รับได้ 5V-12V) หรือใช้ Step-down converter ลดเป็น 3.3V
💡 เคล็ดลับ: เพื่อประหยัดไฟมากขึ้น ควรตัด LED บนบอร์ด ESP32 (ส่วนใหญ่มี LED บนขา GPIO 2) หรือใช้บอร์ดที่ไม่มี USB-to-UART บนบอร์ด
เขียนโปรแกรม
นี่คือโค้ดสำหรับเซ็นเซอร์โหนดที่ใช้ Deep Sleep Mode เพื่อประหยัดแบตเตอรี่:
#include <WiFi.h>
#include <HTTPClient.h>
#include <DHT.h>
// ข้อมูล WiFi
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";
// ข้อมูล CynoIoT API
const char* serverUrl = "https://www.cynoiot.com/api/sensor-data";
const char* apiKey = "YOUR_CYNOIOT_API_KEY";
// การตั้งค่าเซ็นเซอร์
#define DHTPIN 4 // GPIO 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// การตั้งค่า Deep Sleep
#define uS_TO_S_FACTOR 1000000 // แปลงไมโครวินาทีเป็นวินาที
#define TIME_TO_SLEEP 600 // นอน 10 นาที (600 วินาที)
// ตัวแปรสำหรับจัดการพลังงาน
RTC_DATA_ATTR int bootCount = 0; // เก็บจำนวนครั้งที่ boot ใน RTC memory
void setup() {
// เพิ่ม boot count
bootCount++;
// เปิด Serial Monitor (สำหรับ debug)
Serial.begin(115200);
delay(1000); // รอให้ Serial เริ่มทำงาน
Serial.println("\n\n Boot number: " + String(bootCount));
// เชื่อมต่อเซ็นเซอร์
dht.begin();
// เชื่อมต่อ WiFi
connectWiFi();
// อ่านค่าเซ็นเซอร์
readSensor();
// ปิด WiFi เพื่อประหยัดไฟ
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
// บอกว่าจะเข้า Deep Sleep
Serial.println("Going to deep sleep for " + String(TIME_TO_SLEEP) + " seconds");
// เข้าสู่ Deep Sleep Mode
esp_deep_sleep_start();
}
void loop() {
// ไม่ต้องใช้ loop เพราะจะเข้า Deep Sleep ใน setup
}
void connectWiFi() {
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password);
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 20) {
delay(500);
Serial.print(".");
attempts++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nWiFi connected!");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
} else {
Serial.println("\nFailed to connect to WiFi");
}
}
void readSensor() {
// อ่านค่าอุณหภูมิและความชื้น
float humidity = dht.readHumidity();
float temperature = dht.readTemperature(); // อ่านเป็นเซลเซียส
// ตรวจสอบว่าอ่านค่าได้หรือไม่
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// แสดงค่าใน Serial Monitor
Serial.println("Temperature: " + String(temperature) + "°C");
Serial.println("Humidity: " + String(humidity) + "%");
// ส่งข้อมูลไป CynoIoT Platform
sendToCynoIoT(temperature, humidity);
}
void sendToCynoIoT(float temperature, float humidity) {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi not connected. Cannot send data.");
return;
}
HTTPClient http;
http.begin(serverUrl);
http.addHeader("Content-Type", "application/json");
http.addHeader("Authorization", "Bearer " + String(apiKey));
// สร้าง JSON payload
String payload = "{\"temperature\":" + String(temperature) +
",\"humidity\":" + String(humidity) +
",\"bootCount\":" + String(bootCount) + "}";
// ส่งข้อมูล
int httpResponseCode = http.POST(payload);
if (httpResponseCode > 0) {
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
String response = http.getString();
Serial.println("Response: " + response);
} else {
Serial.print("Error on sending POST: ");
Serial.println(httpResponseCode);
}
http.end();
}✅ คำอธิบายโค้ด: โค้ดนี้จะทำงานดังนี้:
1. Boot และนับจำนวนครั้งที่ boot
2. เชื่อมต่อ WiFi
3. อ่านค่าจากเซ็นเซอร์ DHT22
4. ส่งข้อมูลไป CynoIoT Platform
5. ปิด WiFi และเข้า Deep Sleep 10 นาที
6. ตื่นขึ้นมาทำงานใหม่ทุก 10 นาที
เทคนิคการประหยัดพลังงานขั้นสูง
เพื่อให้แบตเตอรี่ใช้งานได้นานที่สุด นี่คือเทคนิคที่ควรใช้ร่วมกับ Deep Sleep:
1. ปิด LED บนบอร์ด
ส่วนใหญ่ ESP32 DevKit จะมี LED บนขา GPIO 2 ซึ่งใช้กระแส ~2-5mA ควรตัดหรือถอดออก
2. ใช้ LDO Regulator ที่มีประสิทธิภาพสูง
เลือกใช้ LDO ที่มี Quiescent Current (Iq) ต่ำ เช่น HT7333, AMS1117 รุ่นที่มี Iq ต่ำ
3. ปิด WiFi ทันทีที่ใช้งานเสร็จ
WiFi ใช้กระแส ~80-200mA เมื่อเชื่อมต่อ ควรเปิดเฉพาะตอนส่งข้อมูลแล้วปิดทันที
4. ปรับช่วงเวลาอ่านค่าเซ็นเซอร์
ยิ่งอ่านค่าบ่อย แบตเตอรี่ยิ่งเสียไว ปรับตามความต้องการ เช่น ทุก 10-30 นาที
5. ใช้เซ็นเซอร์ที่มี Quiescent Current ต่ำ
DHT22 ใช้กระแส ~0.5-2.5mA เมื่อทำงาน และ ~40-50µA เมื่อ Standby
6. ใช้ External Wake-up
ใช้ ext0 หรือ ext1 เพื่อตื่นจาก Deep Sleep เมื่อมีเหตุการณ์เฉพาะ (เช่น กดปุ่มหรือเซ็นเซอร์ตรวจจับ)
📊 การคำนวณอายุแบตเตอรี่:
หากใช้แบต 18650 2000mAh (2000mAh / 0.02mA = 100,000 ชั่วโมง ≈ 11 ปี ใน Deep Sleep)
แต่ในความเป็นจริง จะได้ราว 6-12 เดือน (ขึ้นกับช่วงเวลาที่ตื่นและใช้ WiFi)
ปัญหาที่พบบ่อยและวิธีแก้ไข
ปัญหา: ESP32 ไม่ยอมตื่นจาก Deep Sleep
อาการ: อุปกรณ์เข้า Deep Sleep แต่ไม่ตื่นขึ้นมาตามเวลา
สาเหตุ: อาจเป็นเพราะแรงดันแบตเตอรี่ต่ำเกินไป (< 2.3V)
วิธีแก้: ชาร์จหรือเปลี่ยนแบตเตอรี่ / เพิ่มระบบตรวจสอบแรงดันและส่งแจ้งเตือน
ปัญหา: WiFi เชื่อมต่อไม่ได้
อาการ: ESP32 พยายามเชื่อมต่อ WiFi แต่ไม่สำเร็จ
สาเหตุ: สัญญาณ WiFi อ่อน, รหัสผ่านผิด, หรือ Router จำกัดจำนวนอุปกรณ์
วิธีแก้: ย้ายโหนดให้ใกล้ Router มากขึ้น / ตรวจสอบรหัสผ่าน / เพิ่ม retry logic
ปัญหา: DHT22 อ่านค่าไม่ได้
อาการ: Serial Monitor แสดง "Failed to read from DHT sensor!"
สาเหตุ: ต่อสายผิด, ไม่มีตัวต้านทาน pull-up, หรือเซ็นเซอร์เสีย
วิธีแก้: ตรวจสอบการต่อสาย / เพิ่มตัวต้านทาน 10kΩ / ลองเปลี่ยนเซ็นเซอร์
ปัญหา: แบตเตอรี่หมดเร็วเกินไป
อาการ: แบตเตอรี่ใช้ได้เพียงไม่กี่วัน
สาเหตุ: ไม่ได้เข้า Deep Sleep หรือใช้ WiFi นานเกินไป
วิธีแก้: ตรวจสอบว่าโค้ดเรียก esp_deep_sleep_start() / ลดเวลาที่ WiFi เปิดอยู่ / ปิด LED บนบอร์ด
สรุป
ในบทความนี้ เราได้เรียนรู้วิธีสร้างเซ็นเซอร์โหนดที่ประหยัดพลังงานด้วย ESP32 โดยใช้ Deep Sleep Mode ซึ่งทำให้แบตเตอรี่สามารถใช้งานได้นานหลายเดือนถึงหนึ่งปี
สิ่งที่เราได้เรียนรู้:
- วิธีการเชื่อมต่อ DHT22 เซ็นเซอร์กับ ESP32
- การใช้ Deep Sleep Mode เพื่อประหยัดพลังงาน
- การส่งข้อมูลไปยัง CynoIoT Platform
- เทคนิคการประหยัดพลังงานขั้นสูง
- การแก้ปัญหาที่พบบ่อย
ถัดไป:
- • อ่าน คู่มือ Deep Sleep ฉบับสมบูรณ์ เพื่อเรียนรู้เพิ่มเติม
- • สร้าง โปรเจกต์ IoT ที่ซับซ้อนขึ้นบน CynoIoT Platform
- • ดู สเปค ESP32 เพื่อทำความเข้าใจความสามารถของบอร์ด