天天看點

Arduino ESP32深度睡眠觸摸喚醒(觸摸喚醒)

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深度睡眠觸摸喚醒(觸摸喚醒)