【雕爷学编程】MicroPython手册之 ESP8266 计时器

在这里插入图片描述
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、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述

ESP8266是一种低成本的Wi-Fi芯片,它可以用于开发物联网、智能家居、网络控制等应用。不同的ESP8266芯片或模块可能有不同的参数,因此在使用或购买时,需要注意选择合适的型号和版本。以下是一些常见的ESP8266参数:

1、尺寸:ESP8266芯片的尺寸为5x5 mm,ESP8266模块的尺寸根据外围电路和天线的不同而有所差异,一般在10x15 mm到25x50 mm之间。
2、工作温度:ESP8266芯片的工作温度范围为-40125℃,ESP8266模块的工作温度范围一般为-4085℃。
3、处理器:ESP8266芯片内置了一个32位的Tensilica L106 RISC处理器,最高时钟频率为160 MHz,支持实时操作系统和Wi-Fi协议栈。
4、内存:ESP8266芯片内置了64 KB的指令RAM和96 KB的数据RAM,以及64 KB的boot ROM。ESP8266模块还需要外接一个Flash存储器,一般为512 KB到16 MB之间。
5、电源:ESP8266芯片的供电电压为3.0~3.6 V,最大功耗为170 mA,最小功耗为20 uA。ESP8266模块的供电电压一般为3.3 V或5 V,最大功耗一般为200~300 mA,最小功耗一般为10~20 uA。
6、通信协议:ESP8266芯片支持IEEE 802.11 b/g/n标准的Wi-Fi协议,支持Station、SoftAP和Station+SoftAP三种模式。ESP8266芯片还支持多种数字外设接口,如GPIO、PWM、ADC、UART、I2C、SPI等。ESP8266芯片还可以使用socket模块或其他协议库来实现TCP/IP、UDP、HTTP、MQTT等协议。
在这里插入图片描述
MicroPython的ESP8266计时器,是一种可以使用MicroPython语言来实现ESP8266芯片或模块的计时器功能,它可以用于定时执行一些任务或事件,或者测量一些操作的时间。MicroPython的ESP8266计时器的主要特点、应用场景,以及需要注意的事项如下:

主要特点:

MicroPython的ESP8266计时器可以使用time模块来实现不同精度的延迟和计时功能,包括秒级、毫秒级和微秒级。
MicroPython的ESP8266计时器可以使用machine模块来实现基于硬件的定时器功能,支持周期性和单次执行两种模式。
MicroPython的ESP8266计时器可以使用utime模块来获取和设置系统时间,或者使用ntptime模块来同步网络时间。

应用场景:

MicroPython的ESP8266计时器可以用于实现一些基于延迟的控制逻辑,例如点亮LED灯、控制舵机、读取传感器等。
MicroPython的ESP8266计时器可以用于实现一些基于定时器的事件触发,例如定期发送数据、定时唤醒设备、定时执行任务等。
MicroPython的ESP8266计时器可以用于实现一些基于时间的应用,例如显示时间、记录日志、设置闹钟等 。

需要注意的事项:

MicroPython的ESP8266计时器的运行环境和资源是有限的,并且与标准的Python语言有一些差异和兼容性问题。因此,在使用MicroPython时,需要注意选择合适的库和模块,并避免使用过多的内存和CPU。
MicroPython的ESP8266计时器的精度和稳定性是不保证的,并且可能会受到系统或外部因素的影响。因此,在使用MicroPython时,需要注意校准和测试时间,以及处理异常情况。
MicroPython的ESP8266计时器的功能是阻塞式的,即在延迟或定时器期间,CPU无法执行其他任务。因此,在使用MicroPython时,需要注意优化程序结构,以及使用异步或多线程方式。

实际运用程序参考代码案例:

案例1:使用time模块实现一个简单的秒表功能,每隔一秒打印一次经过的时间。代码如下:

import time
# 获取开始时间
start = time.time()
# 定义一个变量,记录经过的秒数
seconds = 0
# 主循环
while True:
    # 获取当前时间
    now = time.time()
    # 如果当前时间与开始时间之差大于等于秒数加一
    if now - start >= seconds + 1:
        # 秒数加一
        seconds += 1
        # 打印秒数
        print(seconds)
    # 延迟10毫秒,避免占用过多CPU资源
    time.sleep_ms(10)

案例2:使用machine模块实现一个简单的闹钟功能,每隔10秒响铃一次,并显示当前时间。代码如下:

from machine import Timer, Pin
import utime
# 创建LED对象,连接到GPIO2引脚,用于作为铃声指示
led = Pin(2, Pin.OUT)
# 创建定时器对象,使用虚拟ID -1
tim = Timer(-1)
# 定义一个回调函数,用于在定时器触发时执行
def ring(t):
    # 切换LED的状态
    led.value(not led.value())
    # 获取当前时间,返回一个元组,包含年、月、日、时、分、秒等信息
    tm = utime.localtime()
    # 格式化时间,只显示时、分、秒
    fmt = "%02d:%02d:%02d" % (tm[3], tm[4], tm[5])
    # 打印时间
    print(fmt)
# 初始化定时器,设置周期为10000毫秒,模式为周期性,回调函数为ring
tim.init(period=10000, mode=Timer.PERIODIC, callback=ring)

案例3:使用ntptime模块实现一个简单的网络时间同步功能,每隔一小时从网络服务器获取一次时间,并设置到系统时间。代码如下:

import ntptime
import utime
# 定义一个变量,记录上一次同步的时间戳
last_sync = 0
# 主循环
while True:
    # 获取当前时间戳
    now = utime.time()
    # 如果当前时间戳与上一次同步的时间戳之差大于等于3600秒(一小时)
    if now - last_sync >= 3600:
        # 调用ntptime模块的settime函数,从网络服务器获取并设置时间
        ntptime.settime()
        # 更新上一次同步的时间戳
        last_sync = now
        # 打印同步成功的信息
        print("Time synchronized")
    # 延迟一秒,避免占用过多CPU资源
    utime.sleep(1)

案例4:定时执行任务:

import machine
import time

led_pin = machine.Pin(2, machine.Pin.OUT)  # 初始化引脚对象,设置为输出模式

# 定时器触发执行任务的回调函数
def timer_callback(timer):
    led_pin.toggle()  # 切换LED灯状态

# 创建定时器对象
timer = machine.Timer(-1)

# 每隔1秒触发一次定时器回调函数
timer.init(period=1000, mode=machine.Timer.PERIODIC, callback=timer_callback)

# 等待一段时间后停止定时器
time.sleep(10)

# 停止定时器
timer.deinit()

在上述示例中,我们使用machine.Pin()初始化一个引脚对象,将引脚设置为输出模式。然后,定义一个定时器触发执行任务的回调函数timer_callback(),在回调函数中切换LED引脚的状态。接下来,使用machine.Timer()创建一个定时器对象。通过调用定时器对象的init()方法,设置定时器的周期为1秒(1000毫秒),模式为周期性触发,并将回调函数传递给定时器。在示例中,定时器将每隔1秒触发一次回调函数,从而实现LED灯的周期性闪烁。使用time.sleep()函数等待10秒后,调用定时器对象的deinit()方法停止定时器。

案例5:计时器测量时间间隔::

import machine
import time

# 计时器触发计算时间间隔的回调函数
def timer_callback(timer):
    global start_time
    end_time = time.ticks_us()  # 获取当前时间的微秒数
    elapsed_time = time.ticks_diff(end_time, start_time)  # 计算时间间隔(微秒)
    print("Time interval:", elapsed_time, "us")
    start_time = end_time  # 更新计时器起始时间

# 创建计时器对象
timer = machine.Timer(-1)

# 定时器回调函数触发计算时间间隔
timer.init(period=1000, mode=machine.Timer.PERIODIC, callback=timer_callback)

# 等待一段时间后停止计时器
time.sleep(10)

# 停止计时器
timer.deinit()

在上述示例中,我们定义一个计时器触发计算时间间隔的回调函数timer_callback()。在回调函数中,首先获取当前时间的微秒数,然后使用time.ticks_diff()函数计算时间间隔(微秒)。在示例中,我们将每隔1秒触发一次回调函数,计算并打印输出时间间隔。使用time.sleep()函数等待10秒后,停止计时器。

案例6:周期性更新计数器::

import machine

counter_pin = machine.Pin(5, machine.Pin.IN)  # 初始化引脚对象,设置为输入模式

# 计数器回调函数
def counter_callback(pin):
    global counter
    counter += 1

# 创建计数器对象
counter = 0
counter_pin.irq(trigger=machine.Pin.IRQ_RISING, handler=counter_callback)

# 等待一段时间后读取计数器值
machine.deepsleep(10000)  # 休眠10秒

# 读取计数器值
print("Counter value:", counter)

在上述示例中,我们使用machine.Pin()初始化一个引脚对象,将引脚设置为输入模式。然后,定义一个计数器回调函数counter_callback(),在回调函数中将计数器值加1。接下来,使用counter_pin.irq()方法注册中断处理函数,当引脚检测到上升沿时触发计数器回调函数。在示例中,每次引脚检测到上升沿时,计数器值加1。使用machine.deepsleep()函数让ESP8266进入休眠状态,休眠10秒后,通过打印输出计数器值来读取计数器值。这些示例提供了使用MicroPython实现ESP8266计时器的实际运用程序参考代码案例。请注意,具体的计时器设置和功能可以根据实际需求进行调整和配置。

案例7:周期性执行任务:

import machine

# 定义计时器回调函数
def timer_callback(timer):
    print('Timer expired')

# 初始化计时器
timer = machine.Timer(-1)

# 设置计时器定时时间为1秒,并注册回调函数
timer.init(period=1000, mode=machine.Timer.PERIODIC, callback=timer_callback)

# 执行其他任务

这个程序使用 MicroPython 在 ESP8266 上实现周期性执行任务。定义回调函数 timer_callback(timer),当计时器到达设定的时间时会调用该函数,在本例中只是简单地打印一条消息。

使用 machine.Timer() 初始化一个计时器对象 timer,参数 -1 表示使用任意可用的计时器。

使用 timer.init() 方法设置计时器的定时时间和模式。period 参数指定定时时间,单位为毫秒;mode 参数为计时器模式,machine.Timer.PERIODIC 表示周期性触发计时器;callback 参数为回调函数。

在示例中,设置计时器定时时间为1秒,并注册回调函数。然后可以继续执行其他任务,计时器将会每隔1秒触发一次回调函数。

案例8:倒计时器::

import machine
import time

# 定义倒计时时间(秒)
countdown_time = 10

# 定义计时器回调函数
def timer_callback(timer):
    global countdown_time
    if countdown_time > 0:
        print('Countdown:', countdown_time)
        countdown_time -= 1
    else:
        print('Countdown finished')

# 初始化计时器
timer = machine.Timer(-1)

# 设置计时器定时时间为1秒,并注册回调函数
timer.init(period=1000, mode=machine.Timer.PERIODIC, callback=timer_callback)

# 等待倒计时结束
while countdown_time > 0:
    time.sleep(1)

# 执行其他任务

这个程序使用 MicroPython 在 ESP8266 上实现倒计时器功能。首先定义倒计时时间,将其存储在变量 countdown_time 中。

定义回调函数 timer_callback(timer),当计时器到达设定的时间时会调用该函数。在回调函数中,检查倒计时时间是否大于0,如果是则打印当前倒计时时间并将倒计时时间减1,否则打印倒计时结束的消息。

使用 machine.Timer() 初始化一个计时器对象 timer,参数 -1 表示使用任意可用的计时器。

使用 timer.init() 方法设置计时器的定时时间和模式。period 参数指定定时时间,单位为毫秒;mode 参数为计时器模式,machine.Timer.PERIODIC 表示周期性触发计时器;callback 参数为回调函数。

在示例中,设置计时器定时时间为1秒,并注册回调函数。然后使用一个循环来等待倒计时结束,每隔1秒调用一次 time.sleep() 函数进行延时。当倒计时时间为0时,跳出循环,执行其他任务。

案例9:精准计时::

import machine
import utime

# 定义计时器回调函数
def timer_callback(timer):
    elapsed_time = utime.ticks_diff(utime.ticks_ms(), start_time)
    print('Elapsed time:', elapsed_time, 'ms')

# 初始化计时器
timer = machine.Timer(-1)

# 设置计时器定时时间为1秒,并注册回调函数
timer.init(period=1000, mode=machine.Timer.PERIODIC, callback=timer_callback)

# 记录开始时间
start_time = utime.ticks_ms()

# 执行其他任务

这个程序使用 MicroPython 在 ESP8266 上实现精准计时功能。定义回调函数 timer_callback(timer),当计时器到达设定的时间时会调用该函数。在回调函数中,使用 utime.ticks_diff() 函数计算从开始时间到当前时间的时间差,得到经过的时间,单位为毫秒。

使用 machine.Timer() 初始化一个计时器对象 timer,表示使用任意可用的计时器。 timer.init() 方法设置计时器的定时时间和模式。period 参数指定定时时间,单位为毫秒;mode 参数为计时器模式,machine.Timer.PERIODIC 表示周期性触发计时器;callback 参数为回调函数。在示例中,设置计时器定时时间为1秒,并注册回调函数。然后使用 utime.ticks_ms() 函数记录当前时间为开始时间。接着可以执行其他任务,计时器将会每隔1秒触发一次回调函数,计算并打印出经过的时间。以上代码仅为示例,具体的计时器应用方式可能需要根据实际的需求进行调整。

请注意,以上示例仅供参考,具体的使用方法可能因不同的硬件平台和MicroPython版本而有所差异。在实际编程中,你需要根据你所使用的硬件和具体需求进行适当的调整。

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值