电子说
步骤1:简介
ESP32具有以下功能:省电模式,称为“深度睡眠”。在这种模式下,CPU,大多数RAM和所有数字时钟外围设备都将关闭。芯片上唯一仍可连接的部分是RTC控制器,RTC外设(包括ULP协处理器)和RTC存储器。
我们有几种方法可以在睡眠时唤醒ESP32。进入深度睡眠模式之前,可以随时设置唤醒源。
步骤2:唤醒ESP32的方法
有五种唤醒ESP32的方法:
•计时器
•外部唤醒(ext0)
•外部唤醒(ext1)
•ULP协处理器唤醒
•触摸板
步骤3:计时器
RTC控制器具有内置的计时器,在预定的时间段后,可用于激活芯片。时间以微秒精度指定。
esp_deep_sleep_enable_timer_wakeup( uint64_t time_in_us )
time_in_us》是以微秒为单位的时间
步骤4:外部唤醒(ext0)
当RTC GPIO之一进入预定义的逻辑级别时,RTC IO模块包含触发警报的逻辑。 RTC IO是RTC外设电源域的一部分,因此,如果请求此激活源,则在深度睡眠期间RTC外设将保持活动状态。
esp_deep_sleep_enable_ext0_wakeup( gpio_num_t gpio_num , int level)
gpio_num》使用的GPIO编号作为激活源。只能使用RTC功能的GPIO:0,2,4,12-15,25-27,32-39。
level》输入级别将触发警报(0 = LOW,1 =高)
步骤5:外部唤醒(ext1)
RTC控制器包含使用多个RTC GPIO触发闹钟的逻辑。
esp_deep_sleep_enable_ext1_wakeup(uint64_t mask, esp_ext1_wakeup_mode_t mode)
mask》会导致激活的GPIO编号的位掩码。此位图中只能使用启用RTC的GPIO:0,2,4,12-15,25-27,32-39。
mode》选择用于确定激活条件的逻辑功能:
•ESP_EXT1_WAKEUP_ALL_LOW:在所有选定的GPIO都为LOW时唤醒
•ESP_EXT1_WAKEUP_ANY_HIGH:在任何选定的GPIO为HIGH时唤醒
步骤6 :ULP协处理器唤醒
当芯片处于深度睡眠状态时,ULP协处理器可以运行,并且可以用于搜索传感器,监视ADC或电容式触摸传感器的值,并在特定事件发生时激活芯片
ULP协处理器是RTC外围设备电源域的一部分,并运行存储在慢速存储器RTC中的程序。因此,如果请求此激活模式,则在深度睡眠期间将激活RTC外设和RTC慢速存储器。
步骤7:触摸板
RTC控制器包含使用电容式触摸传感器触发警报的逻辑。但是,触针的定义不同。我们必须对每个所需的引脚使用触摸中断。
设置中断后,我们启用唤醒模式以使用传感器。
//Configure Touchpad as wakeup source
esp_sleep_enable_touchpad_wakeup();
步骤8:进入深度睡眠模式
设置唤醒模式后,只需一个命令即可将ESP32置于深度睡眠模式(花费2.5μA或更小)。我在这里强调,这笔费用来自ESP芯片,而不是印版,因为后者花费更多。
esp_deep_sleep_start();
从该命令开始,ESP32进入睡眠状态,并且不执行下一行重要说明:必须在执行上述命令之前进行所有唤醒设置。
步骤9:以下是一些重要信息
下面的调用返回ESP32唤醒的原因。
1:EXT0 2:EXT1 3:计时器4:TOUCHPAD 5:ULP
esp_sleep_get_wakeup_cause();
如果通过触摸板设置唤醒功能,我们可以通过命令恢复触摸发生的GPIO
esp_sleep_get_touchpad_wakeup_status();
每次ESP32唤醒时,
它将再次循环进行设置。因此,所有未在RTC内存中定义的变量都将返回其原始状态。
要即使在入睡后仍将变量保留在内存中,请在以下示例中使用变量声明:
//RTC_DATA_ATTR aloca a variável na memória RTC
RTC_DATA_ATTR int bootCount = 0;
第10步:演示
视频根据图像显示了程序的工作。
步骤11:WiFi NodeMCU-32S ESP-WROOM-32
步骤12:组装
步骤13:程序
我们现在将创建一个程序,在其中将ESP32配置为进入深度睡眠模式。这将以三种不同的方式唤醒:一种用于外部唤醒(ext0),一种用于定时器,另一种用于触摸板。它们不能一起工作,因此我们将使用一个变量作为计数器,表示ESP32引导Boot的次数以配置唤醒方式。
步骤14:需要使用库
要控制OLED显示,我们需要一个外部库。为此,我们将下载U8g2库。
在Arduino IDE中,转到“草图”菜单》》“包括库” 》》“管理库。..”。
第15步:库和变量
我们包括了用于控制OLED显示的库,以及显示控制器实例的构造函数。另外,我们在RTC内存中分配变量。我们设置触摸接受的灵敏度,毫秒转换因子(以秒为单位)以及ESP32进入睡眠模式的时间(以秒为单位)。
#include //biblioteca para controle do display oled
//construtor da instancia do controlador do display
//SDA = 21 e SCL = 22
U8X8_SSD1306_128X64_NONAME_SW_I2C display(SCL, SDA, U8X8_PIN_NONE);
//RTC_DATA_ATTR aloca a variável na memoria RTC
RTC_DATA_ATTR int bootCount = 0;
//sensibilidade para aceitação do toque
#define Threshold 40
//fator de conversão de microsegundos para segundos
#define uS_TO_S_FACTOR 1000000
//tempo que o ESP32 ficará em modo sleep (em segundos)
#define TIME_TO_SLEEP 3
步骤16:设置
在安装程序中,我们增加启动发生的次数。我们调用该函数来打印Boot主题。如果引导编号为PAR,则将ESP32设置为通过(EXT0)按钮唤醒。如果是3的倍数,我们将ESP32设置为在设置的时间后唤醒。否则,我们将设置电容式触摸引脚来唤醒ESP32。最后,我们将触摸板设置为唤醒源,并强制ESP32进入睡眠模式。
void setup() {
Serial.begin(115200);
delay(1000);
//incrementa o numero de vezes que o BOOT ocorreu
++bootCount;
configureDisplay();
//chama a função para imprimir o motivo do BOOT
print_wakeup_reason();
//se o numero de boot for PAR configuramos o ESP32 para despertar através do botão (EXT0)
if(bootCount % 2 == 0) {
esp_sleep_enable_ext0_wakeup(GPIO_NUM_39,1); //1 = High, 0 = Low
}
//se for multiplo de 3 configuramos o ESP32 para despertar depois de um tempo definido
else if(bootCount % 3 == 0) {
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
}
//caso contrario configuramos os pinos de touch capacitivo para despertar o ESP32
else {
//Setup interrupt on Touch Pad 5 (GPIO12)
touchAttachInterrupt(T5, callback, Threshold);
//Configure Touchpad as wakeup source
esp_sleep_enable_touchpad_wakeup();
}
Serial.println(“entrando em modo sleep“);
esp_deep_sleep_start(); //força o ESP32 entrar em modo SLEEP
}
步骤17:循环,回调和ConfigureDisplay
在循环中,我们无事可做。然后,如果发生中断,我们有事可做时,我们将继续中断回调。关于configureDisplay,我们初始化显示并配置一些参数。我们在屏幕上打印引导发生的次数。
//nada a se fazer no loop
void loop() {
}
//callback das interrupções
void callback(){
//caso queira fazer algo ao ocorrer a interrupção
}
void configureDisplay()
{
//inicializa o display e configura alguns parametros
display.begin();
display.setPowerSave(0); //modo powerSave (0-Off ? 1-On)
display.setFont(u8x8_font_torussansbold8_u); //fonte utilizada
//imprime no display os numero de vezes que aconteceu o BOOT
display.drawString(0,0, ”BOOT NUM:“);
display.drawString(0,2,String(bootCount).c_str());
display.drawString(0,4, ”MOTIVO:“);
}
步骤18:Print_wakeup_reason(知道唤醒的原因)
这里,我们具有打印ESP32唤醒原因的功能。
//função para imprimir a causa do ESP32 despertar
void print_wakeup_reason( ){
esp_sleep_wakeup_cause_t wakeup_reason;
String reason = ”“;
wakeup_reason = esp_sleep_get_wakeup_cause(); //recupera a causa do despertar
switch(wakeup_reason)
{
case 1 :reason = ”EXT0 RTC_IO BTN“; break;
case 2 :reason = ”EXT1 RTC_CNTL“; break;
case 3 :reason = ”TIMER“; break;
case 4 :reason = ”TOUCHPAD“; break;
case 5 :reason = ”ULP PROGRAM“; break;
default :reason = ”NO DS CAUSE“; break;
}
Serial.println(reason);
display.clearLine(6); //apaga a linha 6 do display
display.drawString(0,6, reason.c_str()); //imprime a causa do despertar no display
//se despertou por TOUCHPAD, então vamos verificar em qual dos pinos ocorreu
if(wakeup_reason == 4) {
print_wakeup_touchpad(); //verifica o pino e imprime no display
}
}
步骤19:Print_wakeup_touchpad(知道GPIO触摸)
现在,在此步骤中,我们具有打印被触摸的图钉的功能。我们恢复了唤醒ESP32的GPIO并将其打印在显示屏上。
//função para imprimir o pino que foi tocado
void print_wakeup_touchpad() {
touch_pad_t touchPin;
touchPin = esp_sleep_get_touchpad_wakeup_status(); //recupera o GPIO que despertou o ESP32
String GPIO = ”“;
switch(touchPin)
{
case 0 : GPIO = ”4“; break;
case 1 : GPIO = ”0“; break;
case 2 : GPIO = ”2“; break;
case 3 : GPIO = ”15“; break;
case 4 : GPIO = ”13“; break;
case 5 : GPIO = ”12“; break;
case 6 : GPIO = ”14“; break;
case 7 : GPIO = ”27“; break;
case 8 : GPIO = ”33“; break;
case 9 : GPIO = ”32“; break;
default : Serial.println(”Wakeup not by touchpad“); break;
}
Serial.println(”GPIO: “+GPIO);
display.clearLine(7);//apaga a linha 7 do display
display.drawString(0,7, ”GPIO: “);
display.drawString(6,7, GPIO.c_str()); //imprime o GPIO
}
全部0条评论
快来发表一下你的评论吧 !