0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

唤醒ESP32的三种不同方法

454398 来源:wv 2019-10-12 11:00 次阅读

步骤1:简介

ESP32具有以下功能:省电模式,称为“深度睡眠”。在这种模式下,CPU,大多数RAM和所有数字时钟外围设备都将关闭。芯片上唯一仍可连接的部分是RTC控制器,RTC外设(包括ULP协处理器)和RTC存储器。

我们有几种方法可以在睡眠时唤醒ESP32。进入深度睡眠模式之前,可以随时设置唤醒源。

步骤2:唤醒ESP32的方法

唤醒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

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ESP32
    +关注

    关注

    18

    文章

    971

    浏览量

    17218
收藏 人收藏

    评论

    相关推荐

    【代码分享】基于乐鑫ESP32的串口不定长数据接收方法

    【代码分享】基于乐鑫ESP32的串口不定长数据接收方法
    的头像 发表于 11-15 01:02 423次阅读
    【代码分享】基于乐鑫<b class='flag-5'>ESP32</b>的串口不定长数据接收<b class='flag-5'>方法</b>

    简述三种esp32的开发方式是什么

    ESP32是一款由乐鑫(Espressif)推出的低功耗、高性能的Wi-Fi和蓝牙双模无线通信芯片,广泛应用于物联网、智能家居、智能硬件等领域。本文将详细介绍三种ESP32的开发方式:Arduino
    的头像 发表于 08-20 09:11 2915次阅读

    esp32esp8266代码共用吗

    本文将介绍ESP32ESP8266两款流行的微控制器在代码共用性方面的可能性与差异性。 一、引言 随着物联网技术的飞速发展,越来越多的智能设备开始进入我们的生活。其中,ESP32ESP
    的头像 发表于 08-19 18:23 1120次阅读

    esp8266和esp32区别是什么

    以下是关于ESP8266和ESP32的主要区别: 处理器和架构 : ESP8266 :使用一个Tensilica L106 80MHz的处理器,属于Xtensa架构。 ESP32 :使
    的头像 发表于 08-19 18:16 5320次阅读

    esp32用什么软件编程

    ESP32是一款由乐鑫(Espressif)推出的低功耗、高性能的Wi-Fi和蓝牙双模微控制器,广泛应用于物联网、智能家居、智能穿戴等领域。要对ESP32进行编程,需要选择合适的编程软件和开发环境
    的头像 发表于 08-19 17:24 3453次阅读

    ESP32-WROOM-32E、ESP32-WROOM-32D、ESP32-WROOM-32U 有什么区别?ESP32-WROOM-32 后缀字母代表的意思是?

    Wi-Fi+BT+BLE MCU模组,它们各自具有一些特点和区别,以下是对这款模组的详细比较和区分方法: 核心功能与用途 共同点 : 款模组都是基于ESP32系列芯片设计的,具有强
    的头像 发表于 07-17 10:09 9495次阅读
    <b class='flag-5'>ESP32</b>-WROOM-32E、<b class='flag-5'>ESP32</b>-WROOM-32D、<b class='flag-5'>ESP32</b>-WROOM-32U  有什么区别?<b class='flag-5'>ESP32</b>-WROOM-32 后缀字母代表的意思是?

    ESP32能取代STM32吗?哪个更好?

    STM32,以及在何种情况下选择哪个更好。对比一下ESP32和STM32两单片机ESP32ESP32是由乐鑫公司(EspressifSystems)推出的一款集
    的头像 发表于 07-06 08:04 1.1w次阅读
    <b class='flag-5'>ESP32</b>能取代STM32吗?哪个更好?

    请问ESP32-LyraTD-MSC开发板能访问自建的ASR/TTS服务吗?

    ESP32-LyraTD-MSC 支持的SDK有三种ESP-ADF、ESP-VA-SDK、ESP-Skainet),能不能基于其中一
    发表于 06-28 06:48

    请问如何获取ESP32 deepsleep休眠的时长?

    如果ESP32可以被 定时器 和 按键 唤醒, 如果它被按键唤醒, 有没有方法获取\"定时器的计数\", 从而判断按键时ESP32已经休眠
    发表于 06-24 08:09

    ESP32的Station模式SoftAP模式BLE模式,三种模式可以共存吗?

    现在ESP32三种模式能够共存吗? 以前了解,不是很稳定,现在改善了吗?
    发表于 06-24 06:40

    乐鑫esp32系列在睡眠模式下保持蓝牙连接的功耗测试

    本教程适用于ESP32-S3、ESP32-C3、ESP32-C6睡眠模式介绍ESP32系列常见的休眠方式有三种,分别为Modem-sleep
    的头像 发表于 06-21 08:04 2707次阅读
    乐鑫<b class='flag-5'>esp32</b>系列在睡眠模式下保持蓝牙连接的功耗测试

    请问ESP32是否支持GPIO边缘触发唤醒

    请问ESP32是否支持GPIO边缘触发唤醒,例如GPIO下降沿触发或者上升沿触发。
    发表于 06-18 08:09

    请问esp32唤醒功能能否自行开启和关闭?

    在这里请教下各位前辈,关于esp32 唤醒功能能否自行开启和关闭? 本人查阅了esp-idf,C语言是有相关库函数帮助处理,但是Micropython只是讲了开启的语句,我有设置标志为进行判断,但是
    发表于 06-07 08:14

    ESP32-S3-BOX-3B和ESP32-S3-USG-OTG和ESP32-S3-DevKitC-1三种开发板都可以使用USB插头的摄像头吗?

    ESP32-S3-BOX-3B和ESP32-S3-USG-OTG和ESP32-S3-DevKitC-1三种开发板都可以使用USB插头的摄像头吗 USB-OTG是否可以插杜邦线? Dev
    发表于 06-05 06:36

    浅析ESP32运行MQTT客户端进行主题的发布和订阅的方法

    ESP32 MQTT的库有很多,凌顺实验室(lingshunlab.com)这次主要使用AsyncMQTT_ESP32,以后有机会再更多的MQTT其他库的使用方法
    的头像 发表于 03-18 10:05 3904次阅读
    浅析<b class='flag-5'>ESP32</b>运行MQTT客户端进行主题的发布和订阅的<b class='flag-5'>方法</b>