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将唤醒并运行回调函数。在那之后,它又回到了梦乡。


分享到:


相關文章: