เนื้อหาในบทความ
ภาพรวม Deep Sleep Mode
Deep Sleep Mode เป็นฟีเจอร์สำคัญของ ESP32 ที่ช่วยลดการใช้พลังงานลงอย่างมหาศาล โดยปิดการทำงานของ CPU และหน่วยความจำส่วนใหญ่ เหลือไว้เฉพาะ RTC Memory และ RTC Peripherals ทำให้ใช้กระแสไฟเพียง 10-100 µA เท่านั้น
ทำไมต้องใช้ Deep Sleep?
- ประหยัดแบตเตอรี่: ใช้แบตนานขึ้น 10-20 เท่า
- เหมาะกับ Sensor Node: ติดตั้งในที่เข้าถึงยาก
- ลดค่าไฟ: เหมาะกับโปรเจกต์ขนาดใหญ่
- ยั่งยืน: เป็นมิตรกับสิ่งแวดล้อม
โหมดพลังงานของ ESP32
ESP32 มี 5 โหมดพลังงานหลักๆ ที่ควรรู้จัก:
| โหมด | กระแสไฟ | การใช้งาน |
|---|---|---|
| Active | 240 mA | WiFi/Bluetooth เปิด |
| Modem Sleep | 20-68 mA | WiFi ปิดชั่วคราว |
| Light Sleep | 0.8 mA | CPU หยุดทำงาน |
| Deep Sleep ⭐ | 10-100 µA | ประหยัดสุด! |
| Hibernation | 2.5 µA | ปิดทุกอย่าง |
ตื่นด้วย Timer (Timer Wakeup)
วิธีที่ง่ายที่สุดในการใช้ Deep Sleep คือการตั้งเวลาให้ ESP32 ตื่นขึ้นมาทำงานเป็นระยะๆ เช่น ทุกๆ 5 นาที หรือ 1 ชั่วโมง เหมาะสำหรับ Sensor Node
#include <WiFi.h>
#include <HTTPClient.h>
// ข้อมูล WiFi
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
// เวลานอนหลับ (หน่วย: วินาที)
#define TIME_TO_SLEEP 300 // 5 นาที
// ตัวแปรนับจำนวนการตื่น
RTC_DATA_ATTR int bootCount = 0;
void setup() {
Serial.begin(115200);
// เพิ่มจำนวนการตื่น
bootCount++;
Serial.println("Boot number: " + String(bootCount));
// เชื่อมต่อ WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected!");
// อ่านค่าเซ็นเซอร์ (ตัวอย่าง)
float temperature = readTemperature();
float humidity = readHumidity();
// ส่งข้อมูลไป CynoIoT
sendToCynoIoT(temperature, humidity);
// ตัดการเชื่อมต่อ WiFi
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
// เข้าสู่โหมด Deep Sleep
Serial.println("Entering Deep Sleep...");
esp_deep_sleep_start();
}
void loop() {
// ไม่มีการทำงานใน loop เพราะใช้ Deep Sleep
}
// ฟังก์ชันตัวอย่างการอ่านค่าเซ็นเซอร์
float readTemperature() {
// เพิ่มโค้ดอ่านค่าเซ็นเซอร์จริงที่นี่
return 28.5; // ค่าตัวอย่าง
}
float readHumidity() {
// เพิ่มโค้ดอ่านค่าเซ็นเซอร์จริงที่นี่
return 65.0; // ค่าตัวอย่าง
}
// ฟังก์ชันส่งข้อมูลไป CynoIoT
void sendToCynoIoT(float temp, float humi) {
// เพิ่มโค้ดส่งข้อมูลจริงที่นี่
Serial.println("Sending data to CynoIoT...");
Serial.println("Temperature: " + String(temp) + " C");
Serial.println("Humidity: " + String(humi) + " %");
}ข้อควรระวัง: ตัวแปรที่ประกาศด้วย RTC_DATA_ATTR จะยังคงค่าอยู่แม้ ESP32 จะเข้า Deep Sleep แต่ตัวแปรปกติจะถูกรีเซ็ตทุกครั้งที่ตื่น
ตื่นด้วย Touch Pin (Touch Wakeup)
ESP32 มี Touch Pin 10 ขาที่สามารถใช้เป็นปุ่มตื่นได้ เหมาะสำหรับทำปุ่มกดที่ใช้พลังงานต่ำมากๆ
Touch Pin ที่รองรับ:
#define THRESHOLD 40 // ค่า Touch threshold (ปรับแต่งได้)
void setup() {
Serial.begin(115200);
// ตั้งค่า Touch Pin ที่ต้องการใช้ตื่น
touchSleepWakeUpEnable(T0, THRESHOLD);
Serial.println("Touch the pin to wake up!");
Serial.println("Entering Deep Sleep...");
esp_deep_sleep_start();
}
void loop() {
// ไม่มีการทำงานใน loop
}ตื่นด้วย External Wakeup
ใช้สัญญาณภายนอกเพื่อตื่น ESP32 เช่น PIR Motion Sensor, Magnetic Door Sensor, หรือปุ่มกดธรรมดา
#define BUTTON_PIN_BITMASK 0x200000000 // GPIO 33
void setup() {
Serial.begin(115200);
// ตั้งค่าให้ตื่นเมื่อมีการกดปุ่มที่ GPIO 33
esp_sleep_enable_ext0_wakeup(GPIO_NUM_33, 0); // 1 = HIGH, 0 = LOW
Serial.println("Press the button to wake up!");
Serial.println("Entering Deep Sleep...");
esp_deep_sleep_start();
}
void loop() {
// ไม่มีการทำงานใน loop
}หมายเหตุ: RTC GPIO ที่รองรับ: GPIO 0, 2, 4, 12-15, 25-27, 32-39 สำหรับ ext0 wakeup
ULP Coprocessor (Ultra Low Power)
ULP Coprocessor เป็นชิปเล็กๆ ที่ทำงานแยกจาก CPU สามารถอ่านค่าเซ็นเซอร์และตัดสินใจได้โดยไม่ต้องตื่น CPU ทำให้ประหยัดแบตเตอรี่ได้มากขึ้น
ข้อดี
- • ใช้กระแสเพียง ~150 µA
- • อ่านเซ็นเซอร์ได้ขณะหลับ
- • ประมวลผลข้อมูลเบื้องต้น
- • เหมาะกับโปรเจกต์ Battery-powered
ข้อจำกัด
- • เขียนโค้ดยากกว่า
- • ใช้ Assembly หรือ ULP พิเศษ
- • หน่วยความจำจำกัด
- • Debug ยาก
ULP Programming เป็นหัวข้อขั้นสูงที่ต้องการความเข้าใจเชิงลึก แนะนำให้ศึกษาเพิ่มเติมจาก ESP-IDF ULP Documentation
เทคนิคประหยัดแบตเตอรี่เพิ่มเติม
1. ลดความถี่ในการตื่น
อ่านค่าเซ็นเซอร์บ่อยเท่าที่จำเป็น เช่น อุณหภูมิในบ้านอ่านทุก 5-10 นาทีก็พอ ไม่ต้องอ่านทุกวินาที
2. ปิด WiFi/Bluetooth ทันทีที่ใช้เสร็จ
WiFi ใช้กระแสไฟมาก (~240 mA) จึงควรเปิดเฉพาะตอนส่งข้อมูล แล้วปิดทันที
3. ใช้ Voltage Regulator ที่มีประสิทธิภาพสูง
เลือกใช้ LDO หรือ Buck Converter ที่มี quiescent current ต่ำ เช่น HT7333, ME6211 หรือ TP4054 สำหรับ charging
4. ลดแรงดันไฟ (Undervolting)
ลดแรงดันไฟเหลือ 3.3V หรือ 3.0V สามารถลดการใช้พลังงานลงได้ ถึง 30% แต่ต้องระวังเรื่องความเสถียร
เชื่อมต่อกับ CynoIoT Platform
CynoIoT รองรับ Deep Sleep Mode อย่างสมบูรณ์ เพียงแค่ส่งข้อมูลเข้ามาแล้วกลับไปนอนต่อได้เลย
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char* cynoiotApiUrl = "https://www.cynoiot.com/api/v1/data";
const char* deviceToken = "YOUR_DEVICE_TOKEN";
void sendToCynoIoT(float temp, float humi, float voltage) {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(cynoiotApiUrl);
http.addHeader("Content-Type", "application/json");
http.addHeader("Authorization", "Bearer " + String(deviceToken));
// สร้าง JSON payload
StaticJsonDocument<200> doc;
doc["temperature"] = temp;
doc["humidity"] = humi;
doc["battery_voltage"] = voltage;
doc["boot_count"] = bootCount;
doc["sleep_mode"] = "deep_sleep";
String payload;
serializeJson(doc, payload);
// ส่งข้อมูล
int httpResponseCode = http.POST(payload);
if (httpResponseCode > 0) {
Serial.println("Data sent successfully!");
} else {
Serial.println("Error sending data");
}
http.end();
}
}ปัญหาที่พบบ่อยและวิธีแก้ไข
ปัญหา: ESP32 ตื่นทันทีที่เข้า Deep Sleep
สาเหตุ: อาจมีสัญญาณ wake-up ที่ trigger อยู่ตลอดเวลา
วิธีแก้: ตรวจสอบสายสัญญาณ external wakeup, ใช้ pull-up/pull-up resistor, ตรวจสอบ threshold ของ touch pin
ปัญหา: RTC_DATA_ATTR ค่าหายไป
สาเหตุ: อาจเกิดจาก Power-on reset ไม่ใช่ Deep Sleep wakeup
วิธีแก้: ใช้ esp_sleep_get_wakeup_cause() เพื่อตรวจสอบสาเหตุการตื่น
ปัญหา: WiFi เชื่อมต่อไม่ได้หลังตื่น
สาเหตุ: WiFi module ต้องการเวลา initialize ใหม่
วิธีแก้: เพิ่ม delay หรือ retry logic หลังจากตื่นจาก Deep Sleep
สรุป
Deep Sleep Mode เป็นฟีเจอร์ที่ทรงพลังของ ESP32 ที่ช่วยให้โปรเจกต์ IoT ของคุณใช้แบตเตอรี่ได้นานขึ้นอย่างมหาศาล ด้วยการลดการใช้พลังงานลงเหลือเพียง 10-100 µA เหมาะสำหรับ Sensor Node, Smart Home Devices, และโปรเจกต์อื่นๆ ที่ต้องการทำงานด้วยแบตเตอรี่
สิ่งที่คุณได้เรียนรู้:
- วิธีตั้งค่า Deep Sleep ด้วย Timer
- การใช้ Touch Pin และ External Wakeup
- เทคนิคการประหยัดแบตเตอรี่เพิ่มเติม
- การเชื่อมต่อกับ CynoIoT Platform
- การแก้ปัญหาที่พบบ่อย