บทความ: สอนใช้ ESP32 Deep Sleep Mode ประหยัดแบตเตอรี่สูงสุด

เรียนรู้วิธีใช้งาน ESP32 Deep Sleep Mode เพื่อลดการใช้พลังงานลงเหลือเพียง 10-100 µA เหมาะสำหรับโปรเจกต์ IoT ที่ใช้แบตเตอรี่ พร้อมโค้ดตัวอย่างและคำอธิบายภาษาไทย

20 มีนาคม 2026 อ่าน 15 นาที ระดับ: เริ่มต้น - กลาง

ภาพรวม 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 ที่รองรับ:

T0 (GPIO 4)T2 (GPIO 2)T3 (GPIO 15)T4 (GPIO 13)T5 (GPIO 12)T6 (GPIO 14)T7 (GPIO 27)T8 (GPIO 33)T9 (GPIO 32)
#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
  • การแก้ปัญหาที่พบบ่อย