/*
ESP32 Complete Deep Sleep Example
รวม Wake-up Sources ทั้งหมด: Timer, External, Touch
*/
#include "esp_sleep.h"
// Pin definitions
#define BUTTON_PIN 33
#define TOUCH_PIN T0 // GPIO 4
#define LED_RED 25
#define LED_GREEN 26
#define LED_BLUE 27
// Sleep settings
#define SLEEP_TIME_SECONDS 30
#define TOUCH_THRESHOLD 40
// RTC Memory
RTC_DATA_ATTR int bootCount = 0;
RTC_DATA_ATTR int timerWakeups = 0;
RTC_DATA_ATTR int buttonWakeups = 0;
RTC_DATA_ATTR int touchWakeups = 0;
void setup() {
Serial.begin(115200);
delay(1000);
++bootCount;
// ตั้งค่า pins
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
Serial.println("=========================================");
Serial.println("ESP32 Complete Deep Sleep Example");
Serial.println("=========================================");
Serial.println("Boot count: " + String(bootCount));
// แสดงสถิติการตื่น
Serial.println("Wake-up Statistics:");
Serial.println("- Timer wakeups: " + String(timerWakeups));
Serial.println("- Button wakeups: " + String(buttonWakeups));
Serial.println("- Touch wakeups: " + String(touchWakeups));
// แสดงสาเหตุที่ตื่นและนับสถิติ
handleWakeupReason();
// ทำงานปกติ 10 วินาที
Serial.println("Running active mode for 10 seconds...");
for(int i = 10; i > 0; i--) {
Serial.println("Countdown: " + String(i));
// กระพริบ LED ตามสาเหตุที่ตื่น
blinkStatusLED();
delay(1000);
}
// เตรียมเข้า Deep Sleep
setupDeepSleep();
Serial.println("Entering Deep Sleep...");
Serial.flush();
esp_deep_sleep_start();
}
void loop() {
// ไม่ทำงาน
}
void handleWakeupReason() {
esp_sleep_wakeup_cause_t wakeup_reason;
wakeup_reason = esp_sleep_get_wakeup_cause();
switch(wakeup_reason) {
case ESP_SLEEP_WAKEUP_EXT0:
Serial.println("Wakeup: Button pressed!");
buttonWakeups++;
blinkLED(LED_GREEN, 3);
break;
case ESP_SLEEP_WAKEUP_TIMER:
Serial.println("Wakeup: Timer expired");
timerWakeups++;
blinkLED(LED_RED, 2);
break;
case ESP_SLEEP_WAKEUP_TOUCHPAD:
Serial.println("Wakeup: Touch detected!");
touchWakeups++;
touch_pad_t touchPin = esp_sleep_get_touchpad_wakeup_status();
Serial.println("Touch pad: " + String(touchPin));
blinkLED(LED_BLUE, 4);
break;
default:
Serial.println("Wakeup: Power on or reset");
// กระพริบทุก LED
blinkLED(LED_RED, 1);
blinkLED(LED_GREEN, 1);
blinkLED(LED_BLUE, 1);
break;
}
}
void setupDeepSleep() {
Serial.println("Setting up Deep Sleep wake-up sources:");
// 1. Timer Wake-up (30 วินาที)
esp_sleep_enable_timer_wakeup(SLEEP_TIME_SECONDS * 1000000ULL);
Serial.println("- Timer: " + String(SLEEP_TIME_SECONDS) + " seconds");
// 2. External Wake-up (Button)
esp_sleep_enable_ext0_wakeup(GPIO_NUM_33, 0);
Serial.println("- Button: GPIO 33 (press to wake)");
// 3. Touch Wake-up
touchSleepWakeUpEnable(TOUCH_PIN, TOUCH_THRESHOLD);
Serial.println("- Touch: GPIO 4 (touch to wake)");
Serial.println("Wake up using any of the above methods!");
}
void blinkLED(int ledPin, int times) {
for(int i = 0; i < times; i++) {
digitalWrite(ledPin, HIGH);
delay(200);
digitalWrite(ledPin, LOW);
delay(200);
}
}
void blinkStatusLED() {
// กระพริบ LED ตามสาเหตุที่ตื่นล่าสุด
esp_sleep_wakeup_cause_t wakeup_reason = esp_sleep_get_wakeup_cause();
switch(wakeup_reason) {
case ESP_SLEEP_WAKEUP_EXT0:
digitalWrite(LED_GREEN, HIGH);
delay(100);
digitalWrite(LED_GREEN, LOW);
break;
case ESP_SLEEP_WAKEUP_TIMER:
digitalWrite(LED_RED, HIGH);
delay(100);
digitalWrite(LED_RED, LOW);
break;
case ESP_SLEEP_WAKEUP_TOUCHPAD:
digitalWrite(LED_BLUE, HIGH);
delay(100);
digitalWrite(LED_BLUE, LOW);
break;
default:
// กระพริบทุก LED
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_BLUE, HIGH);
delay(100);
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, LOW);
break;
}
}