【雕爷学编程】MicroPython手册之 ESP32-S2 深度睡眠模式

在这里插入图片描述
MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

在这里插入图片描述
ESP32-S2是一款低功耗且集成多种功能的WiFi微控制器芯片,其主要参数如下:
使用Xtensa单核32位LX7 CPU,主频高达240MHz
320KB SRAM、2M PSRAN (板载)
集成802.11b/g/n HT40 Wi-Fi
支持Bluetooth 5.0 BR/EDR 和Bluetooth Low Energy
丰富外设接口:SPI、SPI Slave、SDIO Slave、I2C、I2S、RMT等
USB OTG 接口,可配置为host或device
支持时钟和功耗管理,节能模式功耗仅2uA
内置安全启动和flash 加密功能
工作温度范围:-40°C到105°C
封装规格:QFN48 7x7 mm
综上,ESP32-S2集成度高,有更好的功耗性能,非常适合物联网和可穿戴应用。相比ESP32,该款芯片在无线网络和功耗管理方面进行了优化。

在这里插入图片描述
MicroPython的ESP32-S2支持深度睡眠模式(Deep Sleep Mode),下面从专业的视角详细解释其主要特点、应用场景以及需要注意的事项。

主要特点:

极低功耗:深度睡眠模式是一种极低功耗的工作模式,可以大幅降低ESP32-S2的功耗。在深度睡眠模式下,大部分系统电路将被关闭或处于低功耗状态,从而显著减少能耗。

快速唤醒:尽管处于深度睡眠模式,ESP32-S2仍然可以通过外部触发事件快速唤醒。例如,可以通过外部引脚的电平变化、定时器或其他外部设备的触发信号来唤醒系统。

保留状态:在深度睡眠模式下,ESP32-S2的部分状态和寄存器信息可以被保留。这意味着在唤醒后,系统可以从先前的状态继续执行,而不需要完全重新初始化。

应用场景:

电池供电设备:深度睡眠模式非常适用于依赖电池供电的设备。例如,无线传感器网络、远程监测设备等可以利用深度睡眠模式来延长电池寿命,减少能耗。

周期性任务:深度睡眠模式可以用于周期性执行任务的应用。通过设置定时器或外部触发器,可以在指定的时间间隔内唤醒系统执行任务,以达到节能的目的。

事件驱动系统:深度睡眠模式适用于需要根据外部事件进行响应的系统。例如,通过监听外部传感器的状态变化或接收通信模块的数据包等,可以在需要时唤醒系统进行处理。

需要注意的事项:

唤醒源选择:在使用深度睡眠模式时,需要选择合适的唤醒源。根据实际需求,可以选择定时器、外部中断、引脚电平变化或其他外部事件作为唤醒触发器。

电源管理:在进入深度睡眠模式之前,需要确保外部设备和电路的电源管理正确。例如,关闭不必要的电路和模块,以避免功耗浪费。

状态保存:在深度睡眠模式下,某些状态和寄存器信息可能会被保留。确保需要保留的状态得到正确保存,以便在唤醒后能够继续正常运行。

总之,MicroPython的ESP32-S2的深度睡眠模式具有极低功耗、快速唤醒和状态保留的特点。它适用于电池供电设备、周期性任务和事件驱动系统等应用场景。在使用深度睡眠模式时,需要注意选择适当的唤醒源、电源管理和状态保存等方面的问题,以确保系统能够正常工作并实现节能的目标。通过ESP32-S2的深度睡眠模式,可以实现低功耗、高效能耗的应用,并延长设备的电池寿命。

案例一:使用深度睡眠模式进行低功耗

from machine import deepsleep
import time

while True:
    print("ESP32-S2正在运行...")
    time.sleep(1)

    deepsleep(10000)  # 进入深度睡眠模式,持续10秒

要点解读:
导入machine模块中的deepsleep函数。
使用一个无限循环模拟ESP32-S2的正常运行。
在循环中,使用time.sleep()函数让程序暂停1秒。
使用deepsleep()函数将ESP32-S2进入深度睡眠模式,持续10秒。

案例二:使用深度睡眠模式进行定时唤醒

from machine import deepsleep
import time

while True:
    print("ESP32-S2正在运行...")
    time.sleep(1)

    deepsleep(60000)  # 进入深度睡眠模式,持续60秒
    print("ESP32-S2已唤醒!")

要点解读:
导入machine模块中的deepsleep函数。
使用一个无限循环模拟ESP32-S2的正常运行。
在循环中,使用time.sleep()函数让程序暂停1秒。
使用deepsleep()函数将ESP32-S2进入深度睡眠模式,持续60秒。
当ESP32-S2从深度睡眠模式唤醒时,打印一条提示信息。

案例三:使用深度睡眠模式进行定时唤醒并执行特定任务

from machine import deepsleep
import time

def do_something():
    print("执行特定任务...")

while True:
    print("ESP32-S2正在运行...")
    time.sleep(1)

    deepsleep(60000)  # 进入深度睡眠模式,持续60秒
    print("ESP32-S2已唤醒!")
    do_something()  # 执行特定任务

要点解读:
导入machine模块中的deepsleep函数。
定义一个名为do_something的函数,用于执行特定任务。
使用一个无限循环模拟ESP32-S2的正常运行。
在循环中,使用time.sleep()函数让程序暂停1秒。
使用deepsleep()函数将ESP32-S2进入深度睡眠模式,持续60秒。
当ESP32-S2从深度睡眠模式唤醒时,打印一条提示信息。
调用do_something()函数执行特定任务。

案例四:使用深度睡眠模式实现定时唤醒

import time  
import machine  
  
# 初始化RTC  
rtc = machine.RTC()  
  
# 设置唤醒时间,例如每天早上7点唤醒设备  
wake_time = (7, 0, 0)  # 时, 分, 秒  
rtc.irq(trigger=rtc.ALARM0, handler=lambda t: machine.deepsleep(t))  # 设置唤醒时间,并进入深度睡眠模式  
rtc.alarm(rtc.ALARM0, wake_time)  # 设置唤醒时间  
  
while True:  
    print("Device is sleeping...")  
    time.sleep(1)  # 等待唤醒

解读:在此程序中,我们使用machine.RTC()函数初始化了RTC,并使用rtc.irq()函数设置了唤醒时间。当到达唤醒时间时,设备会进入深度睡眠模式,并使用rtc.alarm()函数设置唤醒时间。在设备被唤醒后,程序会继续执行并打印出"Device is sleeping…"。这个程序可以帮助我们实现设备的定时唤醒,并保证设备的低功耗。需要注意的是,我们需要谨慎处理唤醒时间,确保设备在正确的时机被唤醒。同时,我们也需要避免在设备唤醒后执行过多的任务,以避免影响设备的响应速度和性能。

案例五:使用深度睡眠模式实现低功耗

import time  
import machine  
  
# 初始化RTC和传感器  
rtc = machine.RTC()  
sensor = machine.AnalogSensor(pin=0)  # 假设使用模拟输入0连接传感器  
  
# 设置唤醒时间,例如每分钟唤醒一次设备  
wake_time = (0, 1, 0)  # 分, 秒, 微秒  
rtc.irq(trigger=rtc.ALARM0, handler=lambda t: machine.deepsleep(t))  # 设置唤醒时间,并进入深度睡眠模式  
rtc.alarm(rtc.ALARM0, wake_time)  # 设置唤醒时间  
  
while True:  
    print("Device is sleeping...")  
    time.sleep(1)  # 等待唤醒  
      
    # 在设备唤醒后,执行一些传感器读取的任务  
    sensor_value = sensor.value()  # 读取传感器值  
    print("Sensor value:", sensor_value)  # 打印传感器值  
    time.sleep(1)  # 等待1秒后再次进入深度睡眠模式

解读:在此程序中,我们使用machine.RTC()函数初始化了RTC,并使用machine.AnalogSensor()函数初始化了传感器。然后,我们使用rtc.irq()函数设置了唤醒时间,并进入深度睡眠模式。当设备被唤醒后,程序会执行一些传感器读取的任务,并打印出传感器值。然后,设备会再次进入深度睡眠模式。这个程序可以帮助我们实现设备的低功耗,并保证设备的响应速度和性能。需要注意的是,我们需要谨慎处理唤醒时间和传感器读取的任务,以避免影响设备的响应速度和性能。同时,我们也需要避免在设备唤醒后执行过多的任务,以避免影响设备的功耗和寿命。

案例六:使用深度睡眠模式实现远程唤醒

import time  
import machine  
import network  
  
# 初始化网络模块  
wlan = network.WLAN(network.STA_IF)  # 初始化网络接口  
wlan.active(True)  # 激活网络接口  
  
# 设置唤醒时间,例如每天早上7点唤醒设备  
wake_time = (7, 0, 0)  # 时, 分, 秒  
  
while True:  
    print("Device is sleeping...")  
    time.sleep(1)  # 等待唤醒  
      
    # 在设备唤醒后,执行一些网络连接的任务  
    if not wlan.isconnected():  # 如果设备未连接网络  
        print("Connecting to network...")  # 打印连接网络的信息  
        wlan.connect('your_network_SSID', 'your_network_password')  # 连接网络  
        while not wlan.isconnected():  # 等待连接成功  
            pass  # 等待连接成功,不进行任何操作  
        print("Network connected!")  # 打印网络连接成功的信息  
      
    # 在设备连接网络后,执行一些远程唤醒的任务  
    print("Sending wake-on signal to remote device...")  # 发送唤醒信号给远程设备  
    machine.deepsleep(wake_time)  # 进入深度睡眠模式,等待唤醒时间到达

解读:在此程序中,我们使用network.WLAN()函数初始化了网络接口,并使用wlan.active()函数激活了网络接口。然后,我们使用while循环等待设备被唤醒。当设备被唤醒后,程序会执行一些网络连接的任务,并连接到一个指定的网络。如果连接成功,程序会执行一些远程唤醒的任务,并发送一个唤醒信号给远程设备。然后,设备会再次进入深度睡眠模式。这个程序可以帮助我们实现设备的远程唤醒,并保证设备的低功耗和响应速度。需要注意的是,我们需要谨慎处理网络连接和远程唤醒的任务,以避免影响设备的响应速度和性能。同时,我们也需要避免在设备唤醒后执行过多的任务,以避免影响设备的功耗和寿命。

案例七:基本的深度睡眠模式:

import machine

# 进入深度睡眠模式
machine.deepsleep()

这个示例代码非常简单,只需导入machine模块并调用deepsleep()函数即可进入ESP32-S2的深度睡眠模式。在深度睡眠模式下,ESP32-S2将关闭大部分的电源以节省能量,并暂停程序的执行。要唤醒ESP32-S2,可以使用外部中断引脚、定时器或其他唤醒源。

案例八:定时唤醒:

import machine
import time

# 设置唤醒时间为10秒后
machine.deepsleep(10000)

# 执行一些需要在唤醒后立即处理的代码
# ...

这个示例代码在进入深度睡眠模式之前,使用deepsleep()函数的参数设置唤醒时间为10秒后。在睡眠期间,ESP32-S2会进入低功耗状态并暂停程序的执行,直到设定的唤醒时间到达。一旦ESP32-S2被唤醒,它会继续执行接下来的代码。

案例九:外部中断唤醒:

import machine
import time

# 配置外部中断引脚
wake_pin = machine.Pin(12, machine.Pin.IN)
wake_pin.irq(trigger=machine.Pin.IRQ_FALLING, handler=lambda pin: machine.reset())

# 进入深度睡眠模式
machine.deepsleep()

# 执行一些需要在唤醒后立即处理的代码
# ...

这个示例代码演示了如何利用外部中断来唤醒ESP32-S2。首先,使用machine.Pin()函数配置一个外部中断引脚,并在引脚的下降沿上触发中断。中断处理函数lambda pin: machine.reset()会在引脚触发中断时被调用,并重置ESP32-S2。然后,调用deepsleep()函数将ESP32-S2置于深度睡眠模式。当外部中断引脚触发中断时,ESP32-S2将被唤醒并重置,然后继续执行接下来的代码。

总结:
这些示例代码演示了如何在MicroPython的ESP32-S2上利用深度睡眠模式来降低功耗。关键的要点包括:
使用machine.deepsleep()函数进入深度睡眠模式。
可以设置唤醒时间来指定在何时唤醒ESP32-S2。
可以使用外部中断引脚或其他唤醒源来触发ESP32-S2的唤醒。
在唤醒后,ESP32-S2将继续执行接下来的代码。
这些要点可以帮助有效管理ESP32-S2的功耗,并在需要时进行唤醒,以实现延长电池寿命的应用场景。

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。需要正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。对于涉及到硬件操作的代码,请确保在使用之前充分了解和确认所使用的引脚和电平等参数的正确性和安全性。

在这里插入图片描述

  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值