【雕爷学编程】MicroPython手册之 WiPy 特定端口库 wipy.machine.TimerWiPy()

在这里插入图片描述

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进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述

MicroPython 是一种适用于微控制器的 Python 语言的精简实现,它可以让开发者使用 Python 语法和标准库来编写嵌入式应用程序。WiPy 是一种基于 ESP32 芯片的无线开发板,它支持运行 MicroPython 固件。MicroPython 特定于 WiPy 的库是一组为 WiPy 设计的模块,它们提供了 WiPy 的特有功能和硬件接口的访问。MicroPython 特定于 WiPy 的库的主要特点如下:

1、它包含了一些与 WiPy 相关的模块,如 machine, network, pycom, uos 等,它们分别提供了 WiPy 的机器级别控制,网络连接,灯光控制,操作系统接口等功能。
2、它还包含了一些通用的 MicroPython 模块,如 binascii, hashlib, math, random, struct, time 等,它们提供了一些常用的数据处理,加密,数学,随机数,数据结构,时间等功能。
3、它遵循了 MicroPython 的设计原则,即简洁,高效,可移植和兼容。

在这里插入图片描述
MicroPython 的 wipy.machine.TimerWiPy() 是一个用于创建和控制硬件定时器的类,它可以让开发者使用 WiPy 开发板上的定时器功能来实现周期性或一次性的事件触发。

wipy.machine.TimerWiPy() 的主要特点如下:

它是一个非标准的定时器实现,它只适用于 WiPy 开发板,它在 WiPy 上可以直接使用 machine.Timer 来调用,但是在文档中为了区分于更通用的 machine.Timer 类,而命名为 machine.TimerWiPy。
它可以创建一个新的定时器对象,指定一个 id 来选择不同的定时器。id 为 -1 时可以创建一个虚拟定时器(如果开发板支持的话)。
它可以初始化定时器,指定模式、位宽等参数。模式可以是 TimerWiPy.ONE_SHOT(一次性运行)、TimerWiPy.PERIODIC(周期性运行)或 TimerWiPy.PWM(输出 PWM 信号)。位宽可以是 16 或 32(位)。
它可以创建和控制定时器通道,指定通道号、频率、周期、极性、占空比等参数。通道号可以是 TIMER.A, TIMER.B 或 TIMER.A | TIMER.B。频率和周期只能指定一个,极性和占空比只适用于 PWM 模式。
它可以禁用或重新初始化定时器或定时器通道,释放相关的资源。

wipy.machine.TimerWiPy() 的应用场景如下:

WiPy 开发板上有两个硬件定时器,它们可以用于实现一些需要精确控制时间的功能,如延时、计数、测量、调度等。123
WiPy 开发板上也有一个 DAC 输出引脚(GP25),它可以与定时器配合使用,输出一个 0 到 3.3V 的模拟信号,实现音乐播放、模拟控制等功能。
WiPy 开发板上还有一些 GPIO 引脚,它们可以与定时器配合使用,输出或输入 PWM 信号,实现 LED 灯光控制、电机速度控制、温度传感器读取等功能。

wipy.machine.TimerWiPy() 的需注意事项如下:

在使用 wipy.machine.TimerWiPy() 之前,需要先导入 machine 和 wipy 模块,并且创建一个 wipy.machine.ADCWiPy 对象,并且创建一个 wipy.machine.TimerWiPy 对象。
在使用 wipy.machine.TimerWiPy() 时,需要注意不要与其他模块或设备冲突,并且避免使用过多的内存和电源资源。
在使用 wipy.machine.TimerWiPy() 时,需要注意定时器回调函数的重要约束,例如不能在中断中分配内存、不能执行过长或过复杂的操作等。

以下是几个实际运用程序的代码:

案例1:使用 wipy.machine.TimerWiPy() 和 wipy.machine.Pin 来实现一个简单的闹钟功能,每隔一分钟就响铃一次。:

# 导入 machine 和 wipy 模块
import machine
import wipy

# 创建一个 Pin 对象并连接到蜂鸣器的引脚
p_buzzer = machine.Pin('GP25', mode=Pin.OUT)

# 创建一个 Timer 对象并初始化为周期性模式,位宽为 16 位
tim = machine.Timer(0)
tim.init(TimerWiPy.PERIODIC, width=16)

# 创建一个 Timer 通道并指定频率为 1/60 Hz,即每隔一分钟触发一次
ch = tim.channel(Timer.A, freq=1/60)

# 定义一个回调函数,用于控制蜂鸣器的开关
def ring(arg):
    # 获取蜂鸣器的当前状态
    state = p_buzzer.value()
    # 如果蜂鸣器是关闭的,就打开它
    if state == 0:
        p_buzzer.value(1)
    # 如果蜂鸣器是打开的,就关闭它
    else:
        p_buzzer.value(0)

# 将回调函数绑定到 Timer 通道上
ch.irq(ring)

案例2:使用 wipy.machine.TimerWiPy() 和 wipy.machine.PWM 来实现一个简单的音乐播放器,可以播放一首简单的歌曲。

# 导入 machine 和 wipy 模块
import machine
import wipy

# 创建一个 PWM 对象并连接到扬声器的引脚
pwm = machine.PWM(0, freq=1000)
pwm.channel(Timer.A, pin='GP25')

# 定义一个函数来播放一段音符
def play_tone(freq, msec):
    # 设置 PWM 的频率和占空比
    pwm.freq(freq)
    pwm.duty_cycle(50)
    # 等待指定的毫秒数
    time.sleep_ms(msec)
    # 停止 PWM 输出
    pwm.duty_cycle(0)

# 定义一些音符的频率,单位是赫兹
NOTE_C4 = 262
NOTE_D4 = 294
NOTE_E4 = 330
NOTE_F4 = 349
NOTE_G4 = 392
NOTE_A4 = 440
NOTE_B4 = 494

# 定义一首简单的歌曲,每个元素是一个音符和一个时长的元组,单位是毫秒
song = [(NOTE_C4, 250), (NOTE_D4, 250), (NOTE_E4, 250), (NOTE_F4, 250),
        (NOTE_G4, 250), (NOTE_A4, 250), (NOTE_B4, 250), (NOTE_C4, 500)]

# 循环播放歌曲
for note, msec in song:
    # 播放音符和时长
    play_tone(note, msec)

案例3:使用 wipy.machine.TimerWiPy() 和 wipy.machine.Pin 来实现一个简单的 LED 灯光控制功能,可以让 LED 灯以不同的频率闪烁。:

# 导入 machine 和 wipy 模块
import machine
import wipy

# 创建一个 Pin 对象并连接到 LED 灯的引脚
p_led = machine.Pin('GP25', mode=Pin.OUT)

# 创建一个 Timer 对象并初始化为周期性模式,位宽为 16 位
tim = machine.Timer(0)
tim.init(TimerWiPy.PERIODIC, width=16)

# 创建一个 Timer 通道并指定频率为 2 Hz,即每隔 0.5 秒触发一次
ch = tim.channel(Timer.A, freq=2)

# 定义一个回调函数,用于控制 LED 灯的开关
def blink(arg):
    # 获取 LED 灯的当前状态
    state = p_led.value()
    # 如果 LED 灯是关闭的,就打开它
    if state == 0:
        p_led.value(1)
    # 如果 LED 灯是打开的,就关闭它
    else:
        p_led.value(0)

# 将回调函数绑定到 Timer 通道上
ch.irq(blink)

案例4:设置定时器周期调用函数:

from machine import Timer

def timer_callback(timer):
print('Tick')

t = Timer(Timer.PERIODIC, period=1000, callback=timer_callback)

案例5:设置单次定时器:

from machine import Timer

def timer_callback():
print('Timeout')

t = Timer(Timer.ONE_SHOT, period=2000, callback=timer_callback)

案例6:停止定时器:

from machine import Timer

def callback():
print('Timer stop')

t = Timer(Timer.PERIODIC, period=500, callback=callback)
t.deinit()

第一个例子设置周期调用函数。第二个例子设置单次超时调用。第三个例子关闭定时器。TimerWiPy用来实现函数定期或单次调用的功能,用于定时器和中断处理等场景。

案例7:延时执行任务:

from machine import Timer

# 创建一个定时器对象
timer = Timer(-1)

# 定义要执行的任务函数
def task():
    print("任务执行中...")

# 在500毫秒后执行任务
timer.init(mode=Timer.ONE_SHOT, period=500, callback=lambda t: task())

在这个例子中,我们使用machine.Timer()创建一个定时器对象,并指定编号为-1。然后,我们定义了一个名为task()的任务函数,该函数在执行时会打印一条消息。接着,我们使用init()方法初始化定时器,设置模式为Timer.ONE_SHOT,表示只执行一次,设置周期为500毫秒,并指定回调函数为task()。这样,定时器将在500毫秒后执行任务。

案例8:循环执行任务::

from machine import Timer

# 创建一个定时器对象
timer = Timer(-1)

# 定义要执行的任务函数
def task():
    print("任务执行中...")

# 每隔1秒执行任务
timer.init(mode=Timer.PERIODIC, period=1000, callback=lambda t: task())

在这个例子中,我们使用machine.Timer()创建一个定时器对象,并指定编号为-1。然后,我们定义了一个名为task()的任务函数,该函数在执行时会打印一条消息。接着,我们使用init()方法初始化定时器,设置模式为Timer.PERIODIC,表示循环执行,设置周期为1秒,并指定回调函数为task()。这样,定时器将每隔1秒执行一次任务。

案例9:延时执行任务并取消::

from machine import Timer

# 创建一个定时器对象
timer = Timer(-1)

# 定义要执行的任务函数
def task():
    print("任务执行中...")

# 在1秒后执行任务
timer.init(mode=Timer.ONE_SHOT, period=1000, callback=lambda t: task())

# 取消定时器
timer.deinit()

在这个例子中,我们使用machine.Timer()创建一个定时器对象,并指定编号为-1。然后,我们定义了一个名为task()的任务函数,该函数在执行时会打印一条消息。接着,我们使用init()方法初始化定时器,设置模式为Timer.ONE_SHOT,表示只执行一次,设置周期为1秒,并指定回调函数为task()。这样,定时器将在1秒后执行任务。最后,我们使用deinit()方法取消定时器,以防止任务执行。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值