最近想要研究一下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
其实就改了三个文件,核心的就一个文件,哎自己啥时候才能掌握核心技术嘞
官方也是够懒,啥时候更新,啥时候合并啊