玩转 ESP32 + Arduino (十七) deepsleep深睡眠模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了玩转 ESP32 + Arduino (十七) deepsleep深睡眠模式相关的知识,希望对你有一定的参考价值。

参考技术A

ESP32 有强大的超低功耗协处理器 (ULP co-processor)

ULP 协处理器是一个功耗极低的协处理器设备,无论主 CPU 是处于正常运行模式还是 Deep-sleep 模式,ULP 协处理器都可以独立运行。超低功耗协处理器的补充使得 ESP32 能够胜任一些对低功耗要求较高的应用场合。

ULP 协处理器的主要特性有:

采用 8 MHz 频率和 8 KB 内存
内建 ADC 和 I2C 接口
支持正常模式和 Deep-sleep 模式
可唤醒主 CPU 或向主 CPU 发送中断
能够访问主 CPU 的外围设备、内部传感器及 RTC 寄存器

鉴于以上的特性,ULP 协处理器能够在消耗较低电流的情况下,完成 ADC 采样,进行 I2C Sensor 的读写,驱动 RTC GPIO 口动作,可以在某些超低功耗场景中完全替代主 CPU。

参考文档: https://blog.csdn.net/espressif/article/details/79131076

可以看到ESP32在深睡眠模式下可以启动或停止ULP协处理器

这是一个ESP-IDF的原生方法, 如果我们想用, 需要引入头文件

注意: #include <esp_deep_sleep.h> 即将被弃用, 所以不要再用这个头文件了

返回: 被唤醒原因码:

ESP32有8KB的RTC存储器
在RTC memory里的变量不会因为deepsleep被清除, 创建方法:

注意, RTC memory会被硬件reset清除

参数:

例子:

首先,并不是每个GPIO都是RTC_GPIO, 详见下表

注意: 我们填写的GPIO引脚号是真正的引脚号 不是其RTC_GPIO编号

思考一个问题, 如果我们有8个GPIO引脚想唤醒ESP32, 难道要用上一节的方法操作8遍吗?

当然不是, 我们可以直接操作引脚集合, (我们用一个mask片选想操作的引脚,然后这些引脚都具有了唤醒ESP32的能力)

我们可以设置这些引脚是 每个都能触发(每个葫芦娃都能自己去救爷爷), 还是一起共同发力才能触发(集齐七龙珠??)

参数:

如: 我们想让 32 33 35 39触发, 这样计算mask

注意: 我们不要使用 37 38

值得注意的是,

这个要做一个专门的ULP专题

玩转 ESP32 + Arduino (十三) 通过MQTTs协议上传数据至OneNet云平台

参考技术A

这里我们使用了一个库: PubSubClient

创建产品

创建新设备

(1). 产品ID, 用户ID,和登录key

(2). 设备名称, ID和 设备key

OneNet MQTTS用携带token的方式进行鉴权

访问者(可以为应用或者设备)固化访问密钥于软件中,在需要进行服务访问时,通过密钥计算临时token,通过临时token进行服务访问认证

访问者首先通过访问管理者获取临时访问token,访问管理者可根据需要自定义该token的访问有效期(即过期时间),访问者获取该token后方才能访问OneNET

访问管理者直接将密钥授权给访问者(例如,直接为设备烧写key),访问者通过密钥生成token进行访问

计算方法: https://open.iot.10086.cn/doc/mqtt/book/manual/auth/token.html
token生成工具: https://open.iot.10086.cn/doc/mqtt/book/manual/auth/tool.html

根据软件界面, 我们应提供 res et key method

格式为: products/产品ID/devices/设备名

以我们刚刚创建的产品和设备为例:

时间戳 (也叫:格林威治时间戳,或者UNIX时间戳)
计算地址:
https://tool.lu/timestamp/

我直接计算到了 2099年

设备的key (不是产品的access key)

相关文档: https://open.iot.10086.cn/doc/mqtt/book/device-develop/topics/introduce.html

MQTTS物联网套件中设备相关服务(存储、命令等)的面向设备的接口,均以 topic 的形式提供,设备可以通过 publish 消息到系统 topic 调用服务接口,也可以订阅系统 topic 用于接收服务消息通知,服务提供的系统 topic 的集合形成了 topic 簇

MQTTS物联网套件目前包含:数据点topic簇、命令topic簇、子设备topic簇、设备影子topic簇,如下图所示:

数据点topic簇

设备可以通过数据点 topic 簇上传数据存储并即时获取数据存储结果

簇中topic 以 $sys/pid/device-name/dp 开头
通过publish上传数据时,payload需要满足平台约定数据格式
支持一次上报多条数据,支持设备自带时间戳上报
即时通知数据处理结果(需订阅)

MQTT物联网套件支持用户以 数据流-数据点 模型( 模型详情 )将数据上传至平台并进行存储,设备可以通过数据点 topic 簇调用数据点存储服务存储数据,可以通过订阅系统 topic 获取数据处理结果通知,如下图所示:

对于本文中的例子, 应如下订阅:

上传的JSON数据必须采用以下规则

MQTT物联网套件支持应用通过API直接向设备发送单播命令,设备可以通过设备命令 topic 簇获取消息并进行消息应答

设备命令交互流程见下图:

topic中cmdid为变量,为每条命令的唯一id,可通过通配符的方式进行订阅,比如: $sys/pid/device-name/cmd/request/+ ,或者 $sys/pid/device-name/cmd/#

对于本位中 的例子,应如下订阅:

本连接实现了设备模拟上传温湿度数据, 设备接收平台下发的命令
(但没有给平台回复收到命令的消息)

老样子,写个小点灯.

以上是关于玩转 ESP32 + Arduino (十七) deepsleep深睡眠模式的主要内容,如果未能解决你的问题,请参考以下文章

玩转 ESP32 + Arduino (八) U8G2驱动OLED

玩转 ESP32 + Arduino(二十八) TFT_eSPI库驱动ST7789

掌控板IO接口编程入门 | 用Arduino玩转掌控板(ESP32)系列

玩转 ESP32 + Arduino (二十五) SSD1306库驱动OLED

玩转 ESP32 + Arduino (十六) 通过mqtt协议连接阿里云

玩转 ESP32 + Arduino (十九) SIM800L调试(基于TTGO T-CALL)