2021-11-24 micropython esp32休眠假死 唤醒 rtc nvs btree数据保持
首先本次记录时MICROPYTHON 在ESP32环境下的记录,这里需要声明你使用的micropython 的版本固件不应该太古老,根据我的经验,有些早期固件不支持以下测试,或者不具备相应功能,固件嘛一般都是新的好,新的功能以及更少的BUG, 不像语言,太新的版本反而会出现兼容问题。我本次的固件版本为2021年9月版本的固件,已经证实的是2018年的固件不能支持下面的内容。
本次记录是一些关于低功耗方面的偏向于底层控制,大量的使用了machine模块,以及如何唤醒与数据保持的零散记录。
- 命令重启指令,这个是遇到异常的补救手段,因主动性强放在首位
machine.reset() # 命令重启
machine.reset_cause() #复位原因:返回数字1-5 ,1-5意思见如下说明
复位原因 说明
1 machine.PWRON_RESET 电源复位
2 machine.HARD_RESET 硬重置(断电)
3 machine.WDT_RESET 看门狗复位
4 machine.DEEPSLEEP_RESET 深度睡眠
5 machine.SOFT_RESET 软复位
- 改变频率运行,在节省功耗的部分情况下可以调整CPU运行频率,但是也可能因为对频率调整后影响某些时序封装后的指令,所以可以尝试使用,有异常优先调整回默认频率~
machine.freq() #查询运行频率
#默认为160MHZ
machine.freq(160000000) #设置运行频率 可设定参数为 20MHz, 40MHz, 80Mhz, 160MHz ,240MHz
- 硬件休眠 ,分为假死状态和全死状态~~里面的参数是保持死状态的毫秒时间 ,5000就是5秒,不带参数就是死下去,等待设定好条件状态唤醒。
machine.sleep(5000) 停止CPU并禁用除了WLAN(如果存在)之外的全部外设。(不推荐)
machine.lightsleep (5000) 假死状态,随时唤醒,功耗大幅度降低(据说降低到百分之一不到),优点是保持了系统一定活性,不丢失运行数据也可以从睡眠点继续执行程序,类似假死
machine.deepsleep(5000) 停止 CPU 和所有外设 (包括网络)。全死状态(据说功耗和关机差不多),唤醒时类似复位一样从头运行,可以 reset_cause() 了解复位原因是不是深度睡眠
复活术:中断复活,可以复活两种低功耗的死状态,采用的是中断触发的方式,这个引脚可不是随便用的,不支持会报错的大约可用的引脚是 14 ,12 ,13,25啥的,自己测试,记得报错了就换引脚,程序肯定没问题
import esp32 , machine ,time
wake1 = machine.Pin(25, mode = machine.Pin.IN)
esp32.wake_on_ext0(pin = wake1, level = esp32.WAKEUP_ALL_LOW)
#esp32.wake_on_ext0 中断唤醒 ,这个比较常用
#esp32.wake_on_ext1 据说是WLAN唤醒。。。。没测试觉得没啥大用
#pin = 传入一个PIN输入对象
#level = esp32.WAKEUP_ALL_LOW 低电平唤醒
#level = esp32.WAKEUP_ANY_HIGH 高电平唤醒
print('10秒后失眠~')
time.sleep(10)
#主函数没有这个睡眠小心一睡不起只能刷固件~~~
machine.deepsleep() # machine.ligthsleep()
- RTC存储器,这是一个不断电就能持续保持数据的存储器,
尤其是其可以在deepsleep状态下保持数据
,只要不断电就能保持,但是板子的RST复位按钮引起的复位数据会丢失,它的用法如下,注意:只能接受字符串类型,我们可以用JSON把数据包装好给他,也很方便
import machine
import json
rtc = machine.RTC()
data=json.dumps([1,2,3,4,5])
rtc.memory(data) # 写入存储器
#rtc.memory('12345')
rec_data=rtc.memory() #从存储器读出数据
- NVS非易失存储
首先,这个是非易失存储也就是断电不掉的存储方式,这个方式可以长期保持数据,理论上可以存储数字和字符串但是~
import esp32
a=esp32.NVS('abc') # abc是命名空间,也就是实例化的开辟了一个叫abc的世界
a.set_i32('a1',1) # 在实例化的命名空间中存入一个键值对,值必须为32位有正负的整数 {'a1':1}
a.set_blob('a2','sdf') #存入一个字符串型的键值对
a.commit() #### 把存好的数据刷入实例化的命名空间,必须有这个否则不存
a.get_i32('a1') #在实例化的空间中取出'a1'的值
a.erase_key('a1') #删除这个键值
下面这部分是关于取出.set_blob()
这部分的,这部分资料比较少官方文档也说得不清不楚的,我就单独写一下取出字符串部分的具体流程,重点有俩,1、存的时候COMMIT()别忘记2、取字符串内容先建立缓冲区再去取,返回值是长度,内容在缓冲区里边,解码即可获取。
from esp32 import NVSnvs = NVS("abc")blob1 = "wo shi yi ge xiao niao " #要写入NVS的字符串nvs.set_blob("blob1", blob1) #写入方式nvs.commit() #刷入NVSbuf1 = bytearray(50) #准备缓冲区,大小为50len1 = nvs.get_blob("blob1", buf1) #取出blob1的内容,写入缓冲区buf1中,返回长度给len1print(len1,buf1.decode()) #打印下长度和内容,注意必须解码
- 然后,我平时断电保持一般会采用btree简单数据库的形式,下面这个是一次开发的读写封装的类,用它代替NVS就可以,如果要好好使用可以自行仔细改一改,这个数据库支持
import btree
class btree_r_w(object):def write_btree(self,b_id,b_name): #传入参数必须是二进制字符串例如 b'1',b'gao'try:f = open("mydb", "r+b")except OSError:f = open("mydb", "w+b")db = btree.open(f)db[b_id] =b_namedb.flush()db.close()f.close()def read_btree(self,b_id): #传入参数必须是二进制字符串例如 b'1',有返回值try:f = open("mydb", "r+b")except OSError:f = open("mydb", "w+b")db = btree.open(f)name = db.get(b_id)db.close()f.close()return name
if __name__=='__main__':a=btree_r_w()#实例化a.write_btree(b'1',b'gk')#写data= a.read_btree(b'1')#读print(data)
下面是官方的btree例程文档粘贴在下面便于查询
import btree# First, we need to open a stream which holds a database
# This is usually a file, but can be in-memory database
# using io.BytesIO, a raw flash partition, etc.
# Oftentimes, you want to create a database file if it doesn't
# exist and open if it exists. Idiom below takes care of this.
# DO NOT open database with "a+b" access mode.
try:f = open("mydb", "r+b")
except OSError:f = open("mydb", "w+b")# Now open a database itself
db = btree.open(f)# The keys you add will be sorted internally in the database
db[b"3"] = b"three"
db[b"1"] = b"one"
db[b"2"] = b"two"# Assume that any changes are cached in memory unless
# explicitly flushed (or database closed). Flush database
# at the end of each "transaction".
db.flush()# Prints b'two'
print(db[b"2"])# Iterate over sorted keys in the database, starting from b"2"
# until the end of the database, returning only values.
# Mind that arguments passed to values() method are *key* values.
# Prints:
# b'two'
# b'three'
for word in db.values(b"2"):print(word)del db[b"2"]# No longer true, prints False
print(b"2" in db)# Prints:
# b"1"
# b"3"
for key in db:print(key)db.close()# Don't forget to close the underlying stream!
f.close()
2021-11-24 micropython esp32休眠假死 唤醒 rtc nvs btree数据保持相关推荐
- 2021/11/24 微软亚州研究院游记
目录 文章目录 目录 微软亚州研究院游记 微软新视界 MSRA 宣讲会 晚餐 微软亚州研究院游记 微软新视界 微软亚州研究院(MSRA)无疑是声名远扬的,得益于 CSDN 举办的活动,有幸一同参观,感 ...
- java win10窗口启动假死_win10桌面假死如何解决
win10系统兼容性强,可以跨平台和设备操作,现在的电脑基本上都是预安装的win10系统,不过win10系统和win7系统相比也有不完善的地方.遇到桌面假死的朋友也不少.今天, 我就教大家如何解决wi ...
- 富文本解析 wxParse 解析数据造成页面假死
富文本解析 wxParse 解析数据造成页面假死 问题描述 小程序中总有富文本解析的场景,比如:头条的终端页.我们的终端页使用了 wxParse, 但是由于 wxParse有些小问题,并且项目使用 m ...
- 鼠标右键转圈圈_鼠标右键文件夹出现转圈圈假死机情况
问题描述: 2018年10月13日发现该问题,桌面除Administrator.计算机.回收站右键完好,其他任何文件都出现转圈圈假死机问题. 开始菜单-所有程序里文件.计算机硬盘内文件均出现此问题. ...
- 【MicroPython ESP32】1.8“tft ST7735驱动3Dcube图形显示示例
[MicroPython ESP32]1.8"tft ST7735驱动3Dcube图形显示示例 本实例基于Thonny平台开发 效果演示(Gif录制,帧率上不来,有重影,实际效果没有,很流畅 ...
- win7系统未响应卡住_系统经常假死怎么办|win7系统经常无响应|win10系统经常未响应怎么解决...
2016-12-09 10:51:44 电脑安装windows7操作系统后,难免会遇到一些故障问题,这不有位用户说打开应用程序经常出现未响应的情况,每次都要等待很久的时间,这可怎么办呢?有些用户尝试启 ...
- 启动一个java项目http状态 500 - 内部服务器错误_Java web服务器假死分析
问题现象: 服务端端口开着,客户端可以telnet 服务器上的端口,但访问服务时没有任何返回. 服务器环境 :Java 8 + linux CentOS release 6.5. 用apache ab ...
- 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析
文章目录 概述 jstack或者可视化工具检测是否死锁(没有) 原因分析 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信 - 遗留问题 我们看到了 应用卡住了 .... 怀疑是 ...
- Zookeeper和分布式环境中的假死脑裂问题(转)
Zookeeper和分布式环境中的假死脑裂问题 最近和同事聊天无意间发现他们的系统也存在脑裂的问题.想想当初在我们的系统中为了解决脑裂花了非常大的功夫,现在和大家一起讨论下脑裂,假死等等这些问题和解决 ...
最新文章
- 心脏病预测模型(基于Python的数据挖据)
- write solid code 零散(原文)
- php和python哪个用了开发web好-php web与python web哪个好
- MySQL为表和字段取别名
- 的g极串一个电阻_负载电阻的原理及应用
- hyperworks2019安装教程
- HTML期末作业-汽车奔驰4s店
- android get方法的使用方法,android之HttpPostHttpGet使用方法介绍
- java+jdk+1.6.0+45+64_jdk1.6.0_45.tar.gz
- 雪景特效制作软件JixiPix Snow Daze for Mac
- 复旦大学《高等代数学(第三版)》教材习题答案
- net 4.6.2安装不成功_源泉设计安装不成功的问题之解决办法
- node.js--尝试做一个crub
- 笔记本计算机怎么进入安全模式启动,笔记本电脑如何进入安全模式
- YARN 删除所有ACCEPTED任务的命令
- solidwork 侵权 证据_刑事案件辩护律师证据质证的“分层”模式
- S2ANet(Align Deep Features for Oriented Object Detection)解读
- 为什么有的域名需要加WWW才能访问?
- linux命令解压文件到指定目录并覆盖,linux当前目录下解压zip文件并覆盖原文件如何实现?...
- 大数据技术发展影响因素有哪些?