บทความ: ฟีเจอร์ใหม่! มีนาคม 2026 🔋

ใช้งาน ESP32 Deep Sleep สำหรับโปรเจกต์พลังงานแบตเตอรี่

เรียนรู้วิธีใช้งาน Deep Sleep Mode บน ESP32 เพื่อลดการใช้พลังงานลงเหลือไม่กี่ไมโครแอมป์ ทำให้แบตเตอรี่ใช้งานได้นานขึ้นหลายเดือน หรือแม้แต่หลายปี พร้อมโค้ดตัวอย่างและเทคนิคการประหยัดพลังงานขั้นสูง

20 นาที ระดับกลาง 10 มีนาคม 2026

ภาพรวม 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

คำนวณอายุแบตเตอรี่

สามารถคำนวณอายุแบตเตอรี่โดยประมาณได้จากสูตร:

📐 สูตรคำนวณ

Battery Life (hours) = (Battery Capacity in mAh) / (Average Current in mA)

ตัวอย่างการคำนวณ

สถานการณ์ที่ 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 ของคุณได้ง่ายยิ่งขึ้น!