创客孙老师
创客孙老师
发布于 2024-05-19 / 26 阅读
0
0

使用MicroPython和pyboard开发板(5):点亮LED

使用MicroPython和pyboard开发板(5):点亮LED

pyb_v1.1.png

对于嵌入式开发,点亮pyboard开发板的板载LED就像写HelloWorld一样,只需要几行代码。连接到开发板,在解释器中键入下面的代码,就可以成功点亮pyboard上的LED:

myled = pyb.LED(1)
myled.on()
myled.off()

上面的命令先创建了一个led对象,随后点亮,然后关闭。

如果要让开发板自动运行,就需要编写一个名为main.py的文件,可以已使用任何文本编辑软件进行编写,当然更推荐使用micropython的集成开发环境,比如:thonny、vscode等等。可以把下面的代码直接粘贴进去,如果新手自己敲的话,要注意缩进,因为python的语法是有缩进要求的,缩进相当于java和c语言里的大括号{}

led = pyb.LED(2)
while True:
    led.toggle()
    pyb.delay(1000)

将文件保存到开发板上的时候,pyboard上的红色led应该会亮一下。可以通过软重启(Ctrl+D)来运行刚刚保存的脚本,可以看到绿灯不停地闪烁。如果要终止程序运行可以按(Ctrl+C)。

在解释上面代码用途之前,先了解下Python的一些基本概念。Python是面向对象的语言,在Python中几乎所有东西都是一个类,创建类的一个实例可以得到一个对象。与类相关的方法(也叫类的成员函数)用于与对象交互或控制对象。

上面的代码的第一行创建了一个LED对象,并将其赋予一个名为led的变量,也就是说led这个对象就是LED类的一个实例。创建对象的时候,需要一个参数,用来指定使用板载的哪个led,开发板一共有4个led,所以参数的范围就是1~4。py.LED类有三个经常使用的成员函数,分别是on()、off()和toggle()。代码中使用的另一个函数pyb.delay()的用途是等待以毫秒为单位的时间。创建LED对象后,while True:会进入到一个无限循环,这就会让while循环内部的代码一直执行下去,结果就是LED在开关之间切换并等待1秒。

可以尝试修改LED创建时的参数和delay的参数来观察点亮不同的LED并让它们闪烁的时间不同。

实现板载流水灯

上面的例子只使用了一个LED,但是pyboard有四颗LED可以用,下面把这四颗LED都用上,先给每个LED创建一个对象,并用一个leds的列表(数组)来存放(引用)它们。

leds = [pyb.LED(i) for i in range(1,5)]

这段代码除了创建一个Led对象列表外,还演示了python的列表表达式的写法:[每一个元素或则和元素相关的操作 for 元素 in 可迭代数据类型] 遍历后挨个处理,只需要一行代码就搞定了。上面的代码等价于:

leds = []
for i in range(1,5):
    leds.append(pyb.LED(i))

如果调用的 pyb.LED() 数字不是 1、2、3、4,则会显示错误信息。接下来,建立一个无限循环,循环打开和关闭每个LED:

n = 0
while True:
  n = (n + 1) % 4
  leds[n].toggle()
  pyb.delay(50)

在这里,n 代表当前的 LED,每次执行循环时,都会循环到下一个 n(% 符号是一个取模运算符,可将 n 保持在 0 到 3 之间),然后访问第 n 个 LED 并toggle()它,运行这个程序,会看到四个LED依次打开,然后又依次全部关闭。

上面的代码有一个问题,如果停止脚本,然后再次启动,LED 灯就会停留在上次运行时的状态,从而破坏了想要达到的效果。可以在初始化脚本时关闭所有 LED 灯,然后使用 try/finally 块来解决这个问题。按下 CTRL-C 时,MicroPython 会产生一个 VCPInterrupt 异常。异常通常意味着出错了,可以使用 try: 命令来 "捕获 "异常。在本例中,只是用户中断了脚本,所以不需要捕获错误,只需告诉 MicroPython 退出时该怎么做。可以使用 finally 代码块来确保所有 LED 灯都已关闭。完整代码如下:

leds = [pyb.LED(i) for i in range(1,5)]
for l in leds:
    l.off()

n = 0
try:
   while True:
      n = (n + 1) % 4
      leds[n].toggle()
      pyb.delay(50)
finally:
    for l in leds:
        l.off()

特殊的LED

黄色和蓝色LED比较特别。除了打开和关闭它们之外,还可以使用intensity()方法控制它们的亮度,可以使用0到255之间的数字来确定它的亮度。以下脚本使蓝色LED逐渐变亮,然后再次将其关闭。

led = pyb.LED(4)
intensity = 0
while True:
    intensity = (intensity + 1) % 255
    led.intensity(intensity)
    pyb.delay(20)

可以在LED 1 和 2上调用intensity(),但它们只能处于关闭或打开状态。0 设置为关闭,任何其他数字(最大 255)都会将其打开。


评论