เนื้อหาในบทความ
ภาพรวม Deep Sleep Mode
Deep Sleep Mode เป็นเทคนิคสำคัญในการพัฒนาอุปกรณ์ IoT ที่ใช้พลังงานแบตเตอรี่ โดย ESP32 สามารถลดการใช้กระแสไฟลงเหลือเพียง 10-20 μA เมื่ออยู่ในโหมด Deep Sleep เปรียบเทียบกับ 150-200 mA ในโหมด Active หรือประหยัดพลังงานได้มากกว่า 10,000 เท่า
💡 เหตุใดต้องใช้ Deep Sleep?
- ✅ ทำให้แบตเตอรี่ใช้งานได้นานหลายเดือนหรือหลายปี
- ✅ เหมาะสำหรับโปรเจกต์ Sensor Node ที่ส่งข้อมูลน้อยครั้ง
- ✅ ประหยัดค่าไฟฟ้าและเป็นมิตรกับสิ่งแวดล้อม
- ✅ ลดความร้อนและเพิ่มอายุการใช้งานของชิป
การทำงานของ Deep Sleep
เมื่อ ESP32 เข้าสู่ Deep Sleep Mode:
- CPU: หยุดทำงานทั้งสอง cores
- WiFi/BT: ปิดการทำงานทั้งหมด
- RAM: เก็บข้อมูลใน RTC Memory เท่านั้น
- Peripherals: ส่วนใหญ่จะปิดการทำงาน
- RTC: ยังทำงานเพื่อรองรับการ wake up
อุปกรณ์ที่ต้องใช้
🔧 Hardware
- • ESP32 Board (DevKit หรือ Wroom)
- • USB Cable สำหรับ Programming
- • Battery (Li-Ion 18650 หรือ Lipo)
- • (Optional) Solar Panel + TP4056
💻 Software
- • Arduino IDE หรือ PlatformIO
- • ESP32 Core (v2.0.11+)
- • Serial Monitor
- • (Optional) CynoIoT Account
⚠️ ข้อควรระวัง
บาง ESP32 DevKit มี Power LED และ USB-to-UART Chip ที่ใช้กระแสไฟ 10-30 mA อยู่ตลอดเวลา แนะนำให้ใช้บอร์ดแบบ Bare Module หรือตัด Power LED สำหรับโปรเจกต์ที่ต้องการประหยัดพลังงานสูงสุด
โหมดพลังงานของ ESP32
ESP32 มี 5 โหมดพลังงานหลักที่ควรรู้จัก:
1. Active Mode (Modem Sleep)
การใช้พลังงาน: 150-240 mA
การใช้งาน: WiFi/Bluetooth เปิดอยู่ CPU ทำงานเต็มสปีด
2. Light Sleep
การใช้พลังงาน: 0.8 mA - 15 mA
การใช้งาน: CPU หยุด แต่ WiFi ยังเชื่อมต่ออยู่ ตื่นเร็ว
3. Deep Sleep ⭐
การใช้พลังงาน: 10-20 μA (0.01-0.02 mA)
การใช้งาน: CPU/WiFi ปิดหมด RTC เท่านั้น เหมาะกับแบตเตอรี่
4. Hibernation
การใช้พลังงาน: 2.5 μA (0.0025 mA)
การใช้งาน: ปิดทุกอย่างรวม RTC memory หลัง wake up เริ่มใหม่ทั้งหมด
เริ่มต้นใช้งาน Deep Sleep
ตัวอย่างที่ 1: Deep Sleep เบื้องต้น
โค้ดพื้นฐานที่ทำให้ ESP32 เข้า Deep Sleep และตื่นขึ้นมาทุก 20 วินาที
/*
* ESP32 Deep Sleep Example 1: Basic Deep Sleep
* ทำให้ ESP32 เข้า Deep Sleep และตื่นทุก 20 วินาที
*/
#define uS_TO_S_FACTOR 1000000 // แปลงไมโครวินาทีเป็นวินาที
#define TIME_TO_SLEEP 20 // เวลานอน (วินาที)
RTC_DATA_ATTR int bootCount = 0; // ตัวแปรเก็บใน RTC memory
void setup() {
Serial.begin(115200);
delay(1000); // รอให้ Serial เปิด
// เพิ่มจำนวนครั้งที่ boot
bootCount++;
Serial.println("Boot number: " + String(bootCount));
// แสดงเหตุผลการ wake up
print_wakeup_reason();
// ตั้งค่าเวลานอน
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
Serial.println("Setup ESP32 to sleep for every " + String(TIME_TO_SLEEP) +
" Seconds");
// เข้า Deep Sleep
Serial.println("Going to sleep now");
Serial.flush();
esp_deep_sleep_start();
}
void loop() {
// ไม่มีการทำงานใน loop เพราะเข้า deep sleep แล้ว
}
// ฟังก์ชันแสดงเหตุผลการ wake up
void print_wakeup_reason() {
esp_sleep_wakeup_cause_t wakeup_reason;
wakeup_reason = esp_sleep_get_wakeup_cause();
switch(wakeup_reason) {
case ESP_SLEEP_WAKEUP_TIMER:
Serial.println("Wakeup caused by timer");
break;
case ESP_SLEEP_WAKEUP_TOUCHPAD:
Serial.println("Wakeup caused by touchpad");
break;
case ESP_SLEEP_WAKEUP_EXT0:
Serial.println("Wakeup caused by external signal using RTC_IO");
break;
case ESP_SLEEP_WAKEUP_EXT1:
Serial.println("Wakeup caused by external signal using RTC_CNTL");
break;
case ESP_SLEEP_WAKEUP_ULP:
Serial.println("Wakeup caused by ULP program");
break;
default:
Serial.println("Wakeup was not caused by deep sleep");
break;
}
}📝 คำอธิบายโค้ด
- RTC_DATA_ATTR: เก็บตัวแปรใน RTC memory ข้อมูลไม่หายเมื่อ deep sleep
- esp_sleep_enable_timer_wakeup(): ตั้งเวลา wake up ด้วยตัวจับเวลาฮาร์ดแวร์
- esp_deep_sleep_start(): เริ่ม deep sleep หลังจากนี้โปรแกรมจะหยุด
- esp_sleep_get_wakeup_cause(): เช็คว่าตื่นเพราะอะไร
Wake-up Sources
ESP32 สามารถตื่นจาก Deep Sleep ได้หลายวิธี:
1. Timer Wake-up (นาฬิกา)
ตื่นอัตโนมัติตามเวลาที่กำหนด เหมาะกับ Sensor Node ที่ต้องส่งข้อมูลเป็นระยะ
2. Touch Wake-up (สัมผัส)
ตื่นเมื่อมีการสัมผัสที่ขา Touch Pin ต่างๆ เหมาะกับปุ่มกดแบบประหยัดพลังงาน
/*
* ESP32 Touch Wake-up Example
* ตื่นเมื่อสัมผัสที่ Touch Pin 0 (GPIO 4)
*/
#define TOUCH_PIN T0 // GPIO 4
RTC_DATA_ATTR int bootCount = 0;
// ฟังก์ชัน interrupt เมื่อมีการสัมผัส
void callback() {
// -placeholder- ไม่ต้องทำอะไร
}
void setup() {
Serial.begin(115200);
delay(1000);
bootCount++;
Serial.println("Boot number: " + String(bootCount));
// ตั้งค่า touch interrupt
touchAttachInterrupt(TOUCH_PIN, callback, 40);
// ตั้งค่าให้ตื่นด้วย touch
esp_sleep_enable_touchpad_wakeup();
Serial.println("Going to sleep now");
Serial.flush();
esp_deep_sleep_start();
}
void loop() {
// ไม่มีการทำงานใน loop
}3. External Wake-up (สัญญาณภายนอก)
ตื่นเมื่อมีสัญญาณจากภายนอก เช่น PIR Motion Sensor, Magnetic Reed Switch
EXT0 (Single Pin)
ใช้กับ 1 Pin ทำงานร่วมกับ RTC IO
เหมาะกับ PIR Sensor, Button
EXT1 (Multiple Pins)
ใช้กับหลาย Pins พร้อมกัน
เหมาะกับ Multiple Sensors
/*
* ESP32 External Wake-up Example (EXT0)
* ตื่นเมื่อมีสัญญาณ HIGH ที่ GPIO 35
*/
#define WAKEUP_PIN 35
RTC_DATA_ATTR int bootCount = 0;
void setup() {
Serial.begin(115200);
delay(1000);
bootCount++;
Serial.println("Boot number: " + String(bootCount));
// ตั้งค่า pin เป็น input พร้อม pull-down
pinMode(WAKEUP_PIN, INPUT_PULLDOWN);
// ตั้งค่าให้ตื่นด้วย external signal
esp_sleep_enable_ext0_wakeup(
GPIO_NUM_35, // Pin number
1 // 1 = HIGH, 0 = LOW
);
Serial.println("Going to sleep now");
Serial.flush();
esp_deep_sleep_start();
}
void loop() {
// ไม่มีการทำงานใน loop
}เทคนิค Ultra-Low Power
หากต้องการให้ใช้พลังงานน้อยที่สุด เราสามารถปรับปรุงโค้ดได้ดังนี้:
1. ปิด WiFi และ Bluetooth ทันทีที่ไม่ใช้งาน
// ปิด WiFi
WiFi.mode(WIFI_OFF);
// หรือ
esp_wifi_deinit();
// ปิด Bluetooth
esp_bt_controller_disable();
esp_bt_controller_deinit();
esp_bt_mem_release(ESP_BT_MODE_BTDM);2. ลด Clock Speed
// ลด CPU frequency เหลือ 80 MHz
setCpuFrequencyMhz(80);
// หรือ 40 MHz (ประหยัดกว่า)
setCpuFrequencyMhz(40);3. ปิด Peripherals ที่ไม่ใช้
// ปิด ADC, DAC, Touch
adc_power_off();
dac_output_disable(DAC_CHANNEL_1);
dac_output_disable(DAC_CHANNEL_2);
// ปิด Serial
Serial.end();4. ใช้ Linear Regulator ที่มีประสิทธิภาพสูง
ESP32 DevKit ส่วนใหญ่ใช้ AMS1117 ซึ่งสูญเสียพลังงานมาก แนะนำให้ใช้ Hi-Link HLK-PM01 หรือ ME6211
คำนวณอายุแบตเตอรี่
สามารถคำนวณอายุแบตเตอรี่โดยประมาณได้จากสูตร:
📐 สูตรคำนวณ
ตัวอย่างการคำนวณ
สถานการณ์ที่ 1: ไม่ใช้ Deep Sleep
- • แบตเตอรี่: 2000 mAh (18650)
- • กระแสเฉลี่ย: 150 mA
- • อายุการใช้งาน: 2000 / 150 = 13.3 ชั่วโมง
สถานการณ์ที่ 2: ใช้ Deep Sleep + WiFi 30 วินาที
- • Active: 150 mA × 30 วินาที = 1.25 mAh
- • Sleep: 0.01 mA × 570 วินาที = 0.002 mAh
- • กระแสเฉลี่ยต่อรอบ 10 นาที: 1.252 mAh
- • อายุการใช้งาน: 2000 / (1.252/10) = 133 วัน
สถานการณ์ที่ 3: Ultra-Low Power 10 นาที
- • Active: 100 mA × 5 วินาที = 0.14 mAh
- • Sleep: 0.01 mA × 595 วินาที = 0.002 mAh
- • กระแสเฉลี่ยต่อรอบ 10 นาที: 0.142 mAh
- • อายุการใช้งาน: 2000 / (0.142/10) = 936 วินาที (2.6 ปี!)
ปัญหาที่พบบ่อยและวิธีแก้ไข
❓ ปัญหา: ESP32 ตื่นทันทีที่เข้า Deep Sleep
สาเหตุ: Touch pin หรือ External pin ที่ตั้งค่าไว้ มีสัญญาณรบกวน
วิธีแก้: ตรวจสอบสายไฟ ใช้ pull-up/pull-down และเช็คว่ามี wake-up source อื่นๆ ที่เปิดอยู่หรือไม่
❓ ปัญหา: อายุแบตเตอรี่สั้นกว่าที่คำนวณ
สาเหตุ: Power LED, USB-to-UART chip, หรือ Voltage Regulator ที่ไม่มีประสิทธิภาพ
วิธีแก้: ใช้ bare module ตัด Power LED, ใช้ LDO ที่มีประสิทธิภาพสูง (>90%)
❓ ปัญหา: RTC Memory หายเมื่อ wake up
สาเหตุ: ไม่ได้ใช้ RTC_DATA_ATTR
วิธีแก้: ประกาศตัวแปรด้วย RTC_DATA_ATTR เพื่อเก็บใน RTC memory
❓ ปัญหา: WiFi เชื่อมต่อไม่ได้หลัง wake up
สาเหตุ: WiFi ยังไม่พร้อมหลังจาก wake up
วิธีแก้: เพิ่ม delay หรือรอให้ WiFi.begin() สำเร็จก่อนส่งข้อมูล
ไอเดียโปรเจกต์ Deep Sleep
🌡️ Weather Station
ส่งอุณหภูมิ/ความชื้นทุก 5-15 นาที
อายุแบตเตอรี่: 6-12 เดือน
🚨 PIR Security Sensor
ตื่นเมื่อตรวจจับการเคลื่อนไหว
อายุแบตเตอรี่: 12-24 เดือน
💧 Soil Moisture Monitor
วัดความชื้นดินทุก 1 ชั่วโมง
อายุแบตเตอรี่: 3-6 เดือน
📦 Smart Mailbox
แจ้งเตือนเมื่อมีจดหมาย
อายุแบตเตอรี่: 12+ เดือน
🔋 Battery Monitor
วัดแรงดันแบตเตอรี่และแจ้งเตือน
อายุแบตเตอรี่: 24+ เดือน
🚪 Door/Window Sensor
ตรวจจับการเปิดปิดประตู
อายุแบตเตอรี่: 24+ เดือน
สรุป
Deep Sleep Mode เป็นเครื่องมือสำคัญในการสร้างโปรเจกต์ IoT ที่ใช้พลังงานแบตเตอรี่ ด้วยการลดการใช้กระแสไฟลงเหลือไม่กี่ไมโครแอมป์ ทำให้อุปกรณ์สามารถทำงานได้นานหลายเดือนหรือหลายปี
- ✅ เรียนรู้วิธีใช้งาน Deep Sleep Mode พื้นฐาน
- ✅ ทำความเข้าใจ Wake-up Sources ต่างๆ
- ✅ ปรับปรุงให้ใช้พลังงานน้อยลงด้วยเทคนิคต่างๆ
- ✅ คำนวณอายุแบตเตอรี่ได้อย่างแม่นยำ
ถัดไป: ลองประยุกต์ใช้กับโปรเจกต์ของคุณ และเชื่อมต่อกับ CynoIoT Platform เพื่อติดตามข้อมูลและจัดการอุปกรณ์ IoT ของคุณได้ง่ายยิ่งขึ้น!