micropython esp32 睡眠与唤醒 (含esp32 c3 的按键唤醒办法)

博主分享了关于ESP32的睡眠模式和唤醒机制的研究,特别是针对light-sleep和deep-sleep的低功耗特性。文章提供了Micropython的睡眠唤醒代码示例,并指出在C3芯片上官方固件无法正常唤醒,需要修改源码。博主给出了修改后的测试程序和唤醒原因的解释,强调了按键唤醒的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近想要研究一下esp32的睡眠与唤醒,原因很简单,看图:
在这里插入图片描述
如图可见,light-sleep的电流只有平常工作的150分之一!!!,而deep-sleep都几乎可以跟关机持平了,如果是采用电池的项目又对续航有要求的话,那么对睡眠的需求可以说是非常高了,不过前提是工作时有长时间的休眠等待状态,一直在跑的不用考虑这个功能了。
于是上网搜了一下,esp32睡眠,又全是c的,几乎没有micropython的,直接去micropython官网查了docs,结果只有睡眠的,唤醒只给了理论没有具体代码。。。micropython国内的资源真是太少了,从事这个的很少吗?还是大佬都很低调不发博呢?
求人不如求己,翻遍全网找了方法并且实验成功,上代码:

#by:jd3096 20210722
import machine,esp32
from machine import Pin
import time

wake1 = Pin(14, mode = Pin.IN)
#level parameter can be: esp32.WAKEUP_ANY_HIGH or esp32.WAKEUP_ALL_LOW
esp32.wake_on_ext0(pin = wake1, level = esp32.WAKEUP_ALL_LOW)

print('Im awake. Going to sleep in 2 seconds')
time.sleep(2)
print('Going to sleep now')
time.sleep_ms(100)     #这里不加延迟的话打印到一半就睡了。。。真羡慕esp32的睡眠速度
machine.lightsleep()        #OR machine.deepsleep()

简单讲解:
1.睡眠 分为 lightsleep 和 deepsleep 层级不一样
2.唤醒方式 ext0 ext1环境 RTC唤醒 WLAN唤醒
ext0 ext1的区别是 ext0是单pin ext1是多pin 而且这个pin是有要求的不是随便一个Pin都可以,多试几个吧
3.可以获取唤醒原因,有5个常量表示

2023.2.2更新

继续深入研究:
C3用官方的固件是没法正常按键唤醒的,需要改源码,经我研究后,改好了!
上一个贼好用的测试程序:

import esp32
import machine
from time import sleep_ms

rc2str = {getattr(machine, i): i for i in ('PWRON_RESET',
                                           'HARD_RESET',
                                           'WDT_RESET',
                                           'DEEPSLEEP_RESET',
                                           'SOFT_RESET')}

ws2str = {getattr(machine, i): i for i in ('EXT0_WAKE',
                                           'EXT1_WAKE',
                                           'TIMER_WAKE',
                                           'TOUCHPAD_WAKE',
                                           'ULP_WAKE')}


wake1 = machine.Pin(2, machine.Pin.IN, machine.Pin.PULL_DOWN)
wake2 = machine.Pin(3, machine.Pin.IN, machine.Pin.PULL_DOWN)

esp32.wake_on_ext1(pins=(wake1,wake2), level=esp32.WAKEUP_ANY_HIGH)

print('sleep ...')
sleep_ms(100)

#machine.deepsleep(10000)
machine.lightsleep(10000)


rc = machine.reset_cause()
ws = machine.wake_reason()

print('Woken-up',
      rc2str.get(rc, str(rc)),
      ws2str.get(ws, str(ws)))

按键唤醒貌似只有ALL LOW & ANY HIGH
别踩坑哦

2023.2.22 更新
C3的sleep源码在此:
pull9583
其实就改了三个文件,核心的就一个文件,哎自己啥时候才能掌握核心技术嘞

官方也是够懒,啥时候更新,啥时候合并啊

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值