Arduino ESP32深度睡眠觸摸喚醒(觸摸喚醒)
通過D4–GPIO4引腳觸摸感應,觸發喚醒功能。
- 睡眠模式下,觸摸中斷響應流程圖
Arduino ESP32深度睡眠觸摸喚醒(觸摸喚醒)
執行個體代碼
/*
深度睡眠觸摸喚醒(觸摸T0喚醒)
*/
#define Threshold 40 //數值越大,靈敏度更高
RTC_DATA_ATTR int bootCount = 0;
touch_pad_t touchPin;
//列印 ESP32 從深度睡眠中醒來的原因
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_EXT0 : Serial.println("使用 RTC_IO 的外部信号引起的喚醒"); break;
case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("使用 RTC_CNTL 的外部信号引起的喚醒"); break;
case ESP_SLEEP_WAKEUP_TIMER : Serial.println("定時器引起的喚醒"); break;
case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("觸摸闆引起的喚醒"); break;
case ESP_SLEEP_WAKEUP_ULP : Serial.println("ULP 程式引起的喚醒"); break;
default : Serial.printf("喚醒不是由深度睡眠引起的: %d\n", wakeup_reason); break;
}
}
//列印 ESP32 從深度睡眠中醒來的原因
void print_wakeup_touchpad() {
touchPin = esp_sleep_get_touchpad_wakeup_status();
switch (touchPin)
{
case 0 : Serial.println("在 GPIO 4 上檢測到觸摸"); break;
case 1 : Serial.println("在 GPIO 0 上檢測到觸摸"); break;
case 2 : Serial.println("在 GPIO 2 上檢測到觸摸"); break;
case 3 : Serial.println("在 GPIO 15 上檢測到觸摸"); break;
case 4 : Serial.println("在 GPIO 13 上檢測到觸摸"); break;
case 5 : Serial.println("在 GPIO 12 上檢測到觸摸"); break;
case 6 : Serial.println("在 GPIO 14 上檢測到觸摸"); break;
case 7 : Serial.println("在 GPIO 27 上檢測到觸摸"); break;
case 8 : Serial.println("在 GPIO 33 上檢測到觸摸"); break;
case 9 : Serial.println("在 GPIO 32 上檢測到觸摸"); break;
default : Serial.println("喚醒不是通過觸摸闆"); break;
}
}
void callback() {
//占位符回調函數
}
void setup() {
Serial.begin(115200);
delay(1000); //花一些時間打開串行螢幕
//增加引導編号并在每次重新開機時列印
++bootCount;
Serial.println("Boot number: " + String(bootCount));
//也列印 ESP32 和觸摸闆的喚醒原因
print_wakeup_reason();
print_wakeup_touchpad();
//在觸摸闆D4 (GPIO4) 上設定中斷,用于觸摸喚醒
touchAttachInterrupt(T0, callback, Threshold);
//将觸摸闆配置為喚醒源
esp_sleep_enable_touchpad_wakeup();
//現在去睡覺
Serial.println(" 要休眠了");
esp_deep_sleep_start();
Serial.println("這永遠不會被列印");
}
void loop() {
//這永遠不會到達
}
Arduino ESP32深度睡眠觸摸喚醒(觸摸喚醒)