ESP32觸摸從沉睡中醒來

ESP32觸摸從沉睡中醒來


ESP32觸摸從沉睡中醒來


本指南介紹如何使用觸控式觸針將ESP32從深度睡眠中喚醒。ESP32將使用Arduino IDE編程。

ESP32可以從深度睡眠中喚醒,使用多種喚醒源:定時器、外部喚醒和觸摸喚醒。本文介紹如何使用觸摸喚醒。

寫一個深度睡眠的草圖

要寫一個草圖讓你的ESP32進入深度睡眠模式,然後喚醒它,你需要:

首先,配置喚醒源。這意味著配置什麼將喚醒ESP32。您可以使用一個或合併多個喚醒源。本教程介紹如何使用觸針作為喚醒源。

您可以決定在深度睡眠期間關閉或保持哪些外圍設備。但是,默認情況下,ESP32會自動關閉您定義的喚醒源不需要的外圍設備。

最後,使用esp_deep_sleep_start()函數將ESP32置於深度睡眠模式。

觸摸喚醒

ESP32有10個電容式觸摸GPIO。這些gpio可以感知任何帶電物質的變化,比如人類皮膚。因此,他們可以檢測到當用手指觸摸gpio時引起的變化。這些ESP32觸針可用於喚醒ESP32深度睡眠。

觸針

ESP32觸針在下圖中以針顏色突出顯示。


ESP32觸摸從沉睡中醒來


您可以看到觸摸傳感器0對應於GPIO 4,觸摸傳感器2對應於GPIO 2,依此類推。

注意:在編寫本教程時,Arduino IDE中的觸針分配存在問題。GPIO 33在分配中與GPIO 32交換。這意味著如果你想引用GPIO 32,你應該在代碼中使用T8。如果你想參考GPIO 33,你應該使用T9。如果你沒有這個問題,請忽略這張便條。

啟用觸摸喚醒

使用觸針喚醒ESP32非常簡單。在Arduino IDE中,需要使用以下函數:

esp_sleep_enable_touchpad_wakeup()

代碼-觸摸喚醒

要編程ESP32,我們將使用Arduino IDE。因此,您需要確保已安裝ESP32附加組件。如果尚未安裝ESP32附加組件,請按照正確的教程進行操作(請參考以前的文章)。

讓我們使用庫中的一個示例來看看touch wake-up是如何工作的。打開Arduino IDE,轉到File>Examples>ESP32>Deep Sleep,然後打開TouchWakeUp示例草圖。

/*

Deep Sleep with Touch Wake Up

=====================================

This code displays how to use deep sleep with

a touch as a wake up source and how to store data in

RTC memory to use it over reboots

This code is under Public Domain License.

Author:

Pranav Cherukupalli <cherukupallip>

*/

#define Threshold 40 /* Greater the value, more the sensitivity */

RTC_DATA_ATTR int bootCount = 0;

touch_pad_t touchPin;

/*

Method to print the reason by which ESP32

has been awaken from sleep

*/

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("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_TIMER : Serial.println("Wakeup caused by timer"); break;

case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("Wakeup caused by touchpad"); break;

case ESP_SLEEP_WAKEUP_ULP : Serial.println("Wakeup caused by ULP program"); break;

default : Serial.printf("Wakeup was not caused by deep sleep: %d\\n",wakeup_reason); break;

}

}

/*

Method to print the touchpad by which ESP32

has been awaken from sleep

*/

void print_wakeup_touchpad(){

touch_pad_t pin;

touchPin = esp_sleep_get_touchpad_wakeup_status();

switch(touchPin)

{

case 0 : Serial.println("Touch detected on GPIO 4"); break;

case 1 : Serial.println("Touch detected on GPIO 0"); break;

case 2 : Serial.println("Touch detected on GPIO 2"); break;

case 3 : Serial.println("Touch detected on GPIO 15"); break;

case 4 : Serial.println("Touch detected on GPIO 13"); break;

case 5 : Serial.println("Touch detected on GPIO 12"); break;

case 6 : Serial.println("Touch detected on GPIO 14"); break;

case 7 : Serial.println("Touch detected on GPIO 27"); break;

case 8 : Serial.println("Touch detected on GPIO 33"); break;

case 9 : Serial.println("Touch detected on GPIO 32"); break;

default : Serial.println("Wakeup not by touchpad"); break;

}

}

void callback(){

//placeholder callback function

}

void setup(){

Serial.begin(115200);

delay(1000); //Take some time to open up the Serial Monitor

//Increment boot number and print it every reboot

++bootCount;

Serial.println("Boot number: " + String(bootCount));

//Print the wakeup reason for ESP32 and touchpad too

print_wakeup_reason();

print_wakeup_touchpad();

//Setup interrupt on Touch Pad 3 (GPIO15)

touchAttachInterrupt(T3, callback, Threshold);

//Configure Touchpad as wakeup source

esp_sleep_enable_touchpad_wakeup();

//Go to sleep now

Serial.println("Going to sleep now");

delay(1000);

esp_deep_sleep_start();

Serial.println("This will never be printed");

}

void loop(){

//This will never be reached

}

設置閾值

首先要做的是設置觸針的閾值。在這種情況下,我們將閾值設置為40。可能需要根據項目更改閾值。

#define Threshold 40

當您觸摸觸摸式GPIO時,傳感器讀取的值會降低。因此,您可以設置一個閾值,在檢測到觸摸時使某些事情發生。

此處設置的閾值意味著,當觸摸式GPIO讀取的值低於40時,ESP32應喚醒。您可以根據所需的靈敏度相應地調整該值。

附加中斷

您需要將中斷連接到觸控插腳。當在指定的GPIO上檢測到touch時,將執行回調函數。例如,查看以下行:

touchAttachInterrupt(T3, callback, Threshold);

當在T3(GPIO 15)上讀取的值低於在閾值變量上設置的值時,ESP32將喚醒並執行回調函數。

只有在ESP32處於喚醒狀態時才會執行callback()函數。

如果ESP32處於睡眠狀態,並且您觸摸T3,ESP將喚醒–如果您只按下並釋放觸針,則不會執行callback()函數;

如果ESP32處於喚醒狀態並且您觸摸T3,則將執行回調函數。因此,如果要在喚醒ESP32時執行callback()函數,則需要按住該管腳一段時間,直到執行該函數。

在這種情況下,callback()函數為空。

void callback(){

//placeholder callback function

}

如果你想用不同的觸針喚醒ESP32,你只需要在觸針上附加中斷。

接下來,需要使用esp_sleep_enable_touchpad_wake up()函數將觸針設置為喚醒源。

esp_sleep_enable_touchpad_wakeup()

示意圖

要測試此示例,請將電纜連接到GPIO 15,如下圖所示。


ESP32觸摸從沉睡中醒來


(此示意圖使用帶有30個GPIO的ESP32 DEVKIT V1模塊版本-如果您使用的是另一個型號,請檢查您使用的板的插腳線。)

測試示例

將代碼上傳到ESP32,並以115200的波特率打開串行監視器。


ESP32觸摸從沉睡中醒來


ESP32進入深度睡眠模式。

你可以通過觸摸觸針3的連接線來喚醒它。


ESP32觸摸從沉睡中醒來


當您觸摸pin時,ESP32會顯示在串行監視器上:引導號、喚醒原因以及哪個觸控GPIO導致喚醒。


ESP32觸摸從沉睡中醒來


收尾

在本文中,我們向您展示瞭如何使用觸控gpio喚醒ESP32。當在指定的GPIO上檢測到觸摸時,ESP32將喚醒並運行回調函數。在那之後,它又回到了夢鄉。


分享到:


相關文章: