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进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
pyboard是一个紧凑而强大的电子开发板,运行MicroPython。它通过USB连接到您的PC,为您提供一个USB闪存驱动器来保存Python脚本,以及用于即时编程的串行Python提示符(REPL)。需要微型 USB 电缆。适用于 Windows、Mac 和 Linux。
MicroPython是对Python(版本3.4)编程语言的完全重写,因此它适合并在微控制器上运行。它包括许多优化,因此它可以高效运行并使用很少的 RAM。
MicroPython在pyboard上运行裸机,本质上是一个Python操作系统。内置 pyb 模块包含用于控制板上可用外设的函数和类,例如 UART、I2C、SPI、ADC 和 DAC。观看此视频,了解 pyboard 的概述。
MicroPython的pyboard特定端口库pyb.delay(ms)是一个用来延迟程序执行的函数。
它的主要特点、应用场景和需注意事项如下:
主要特点:pyb.delay(ms)函数可以让程序暂停执行指定的毫秒数,参数ms应该是一个正数或0。在延迟期间,CPU不会执行任何其他任务,只会等待延迟结束。
应用场景:pyb.delay(ms)函数可以用来控制程序的执行速度,或者在需要等待一段时间的情况下使用。例如,可以使用pyb.delay(ms)函数来实现LED灯的闪烁效果,或者在发送和接收数据之间添加一定的延迟时间。
需注意事项:pyb.delay(ms)函数会占用CPU资源,不适合用来实现长时间的延迟。如果需要长时间的延迟,可以使用time.sleep()函数,它会让CPU进入低功耗模式,等待外部中断唤醒2。另外,pyb.delay(ms)函数的精度受到硬件和软件的影响,可能不是非常准确。
下面给出几个使用pyb.delay(ms)函数的实际运用程序案例:
案例一:使用内部LED灯实现闪烁效果
# 导入所需模块
import pyb
# 创建内部LED灯对象,选择第1个(红色)LED灯
led = pyb.LED(1)
# 循环开关LED灯,并添加延迟时间
while True:
led.on() # 打开LED灯
pyb.delay(500) # 延迟500毫秒
led.off() # 关闭LED灯
pyb.delay(500) # 延迟500毫秒
案例二:使用UART通信发送和接收数据,并添加延迟时间
# 导入所需模块
import pyb
# 创建UART对象,连接到Y1(TX)和Y2(RX)引脚,波特率为9600
uart = pyb.UART(6, 9600)
# 循环发送和接收数据
while True:
# 发送数据"Hello"到另一个设备,并添加延迟时间
uart.write("Hello")
pyb.delay(1000) # 延迟1000毫秒
# 如果有数据可读,则读取并打印数据,并添加延迟时间
if uart.any():
data = uart.read()
print(data)
pyb.delay(1000) # 延迟1000毫秒
案例三:使用ADC(模拟数字转换)测量电压,并添加延迟时间:
# 导入所需模块
import pyb
# 创建ADC对象,连接到X1引脚
adc = pyb.ADC(pyb.Pin('X1'))
# 循环测量电压并打印结果
while True:
# 读取ADC的值,范围为0到4095
value = adc.read()
# 计算电压值,单位为伏特,假设参考电压为3.3伏
voltage = value * 3.3 / 4095
# 打印电压值,保留两位小数
print('Voltage: {:.2f} V'.format(voltage))
# 延迟500毫秒
pyb.delay(500)
案例四:延迟执行其他操作:
import pyb
# 执行一些操作
print("开始执行操作...")
# 延迟1秒钟
pyb.delay(1000)
# 继续执行其他操作
print("延迟结束,继续执行其他操作...")
在这个例子中,我们使用pyb.delay函数在执行一些操作后添加了一个1秒钟的延迟。这可以用于控制程序的执行顺序或在需要一定等待时间的情况下进行操作。
案例五:创建定时器:
import pyb
# 创建一个1秒钟的定时器
timer = pyb.Timer(1, freq=1)
# 定时器回调函数
def callback(timer):
print("定时器触发")
# 设置定时器回调函数
timer.callback(callback)
# 开始定时器
timer.start()
# 延迟5秒钟
pyb.delay(5000)
# 停止定时器
timer.stop()
在这个例子中,我们使用pyb.Timer来创建一个定时器,并设置其频率为1Hz(每秒触发一次)。然后,我们定义了一个回调函数,在每次定时器触发时执行。通过使用pyb.delay函数,在定时器触发前延迟了5秒钟。最后,我们停止了定时器的运行。
案例六:控制LED灯的闪烁:
import pyb
# 获取LED对象
led = pyb.LED(1)
# 闪烁LED灯5次
for i in range(5):
# 打开LED灯
led.on()
# 延迟500毫秒
pyb.delay(500)
# 关闭LED灯
led.off()
# 延迟500毫秒
pyb.delay(500)
在这个例子中,我们使用pyb.LED来控制板载LED灯的闪烁。通过使用pyb.delay函数,在LED灯打开和关闭之间添加了500毫秒的延迟,使LED灯以一定的频率闪烁。
案例七:LED闪烁:使用pyb.delay(ms)函数实现LED灯的闪烁效果。
import pyb
led = pyb.LED(1) # 使用LED 1
while True:
led.on() # 打开LED
pyb.delay(1000) # 延迟1秒
led.off() # 关闭LED
pyb.delay(1000) # 延迟1秒
这个程序将LED灯设置为1秒钟的开启时间和1秒钟的关闭时间,实现了一个简单的LED闪烁效果。
案例八:按键延迟响应:使用pyb.delay(ms)函数在按下按钮后添加延迟响应。
import pyb
button = pyb.Switch() # 使用按钮
while True:
if button(): # 按钮按下
print("Button pressed")
pyb.delay(500) # 延迟500毫秒
else:
print("Button released")
在这个程序中,当按钮被按下时,会打印"Button pressed"并添加500毫秒的延迟,以防止意外的多次触发。
案例九:定时任务调度:使用pyb.delay(ms)函数实现简单的定时任务调度。
import pyb
def task1():
print("Task 1 executed")
def task2():
print("Task 2 executed")
while True:
task1()
pyb.delay(1000) # 延迟1秒
task2()
pyb.delay(2000) # 延迟2秒
在这个程序中,task1()函数和task2()函数交替执行,并使用pyb.delay(ms)函数在它们之间添加了1秒和2秒的延迟。
这些案例展示了pyb.delay(ms)函数在不同情况下的实际运用。请注意,pyb.delay(ms)函数会阻塞当前线程的执行,因此在某些应用中可能需要考虑使用其他机制来实现非阻塞的延迟。