流水灯实验

罗大富 BigRich大约 3 分钟ESP32Python

上节课我们已经学习了如何点亮一颗 LED 并且让其闪烁,这节课我们学习如何制作流水灯。

硬件电路设计

物料清单(BOM 表):

材料名称数量
直插式 LED5
1kΩ 电阻5
杜邦线(跳线)若干
面包板1

每一个 LED 的正极与开发板一个 GPIO 引脚相连,并串联一个电阻,负极接 GND,如下图:

当然你也可以选择只使用一个电阻:

软件程序设计

1. 正常流水灯

设计这个程序时,我们需要使用的 Python 中的 列表 list循环嵌套,以及 MicroPython 的延时模块。

列表用于存储所有用到的输出引脚以及所有的 LED Pin 对象。

循环嵌套的作用也很容易理解,外层的 while True 表示永真循环,可以让这个程序一直执行下去。但是,在每一次的时候,需要依次点亮对应的 LED,然后再依次熄灭对应的 LED。

'''
该程序作用是让 LED 依次点亮后依次熄灭
在线文档:https://docs.geeksman.com/
'''

import time
from machine import Pin

# 定义 LED 控制引脚
pin_index_list = [13, 12, 14, 27, 26]

# 定义 led_pin_list 列表,保存 LED 管脚配置对象
led_pin_list = []

# 循环给 led_pin_list 列表添加对象
for i in pin_index_list:
    led_pin_list.append(Pin(i, Pin.OUT))

# LED全熄灭
for led_pin in led_pin_list:
    led_pin.value(0)

while True:

    # LED逐个点亮
    for led_pin in led_pin_list:
        led_pin.value(1)
        time.sleep(0.05)

    # LED逐个熄灭
    for led_pin in led_pin_list:
        led_pin.value(0)
        time.sleep(0.05)

value 方法除了可以赋值外,也可以在不传递参数的时候,获取当前值的状态,比如:

from machine import Pin

led_pin = Pin(12, Pin.OUT)  # 创建一个 LED Pin 对象
led_pin.value()  # 获取该引脚的逻辑电平

因此,我们可以通过 led_pin.value(not led_pin.value()) 的方式,依次修改当前 LED 对象的状态。

提示

在逻辑值中 1 == True, 0 == False。

将:

while True:

    # LED逐个点亮
    for led_pin in led_pin_list:
        led_pin.value(1)
        time.sleep(0.05)

    # LED逐个熄灭
    for led_pin in led_pin_list:
        led_pin.value(0)
        time.sleep(0.05)

替换为


while True:

    # 逐个改变 LED 状态
    for led_pin in led_pin_list:
        led_pin.value(not led_pin.value())
        time.sleep(0.05)

2. 反复流水灯

我们还可以对该程序进行微调,比如之前是依次改变流水灯的状态,现在,修改为让流水灯往复亮。

'''
该程序作用是实现反复流水灯
在线文档:https://docs.geeksman.com/
'''

import time
from machine import Pin

# 定义 LED 控制引脚
pin_index_list = [13, 12, 14, 27, 26]

# 定义 led_pin_list 列表,保存 LED 管脚配置对象
led_pin_list = []

# 循环给 led_pin_list 列表添加对象
for i in pin_index_list:
    led_pin_list.append(Pin(i, Pin.OUT))

# LED全熄灭
for led_pin in led_pin_list:
    led_pin.value(0)

while True:

    # LED逐个点亮
    for led_pin in led_pin_list:
        led_pin.value(1)
        time.sleep(0.1)

    # LED逐个熄灭
    for led_pin in reversed(led_pin_list):
        led_pin.value(0)
        time.sleep(0.1)

3. LED 移动

让 LED 实现平移的效果是这样实现的,每次在我点亮这颗 LED 的时候,同时把上一颗 LED 的状态改为低电平,代码如下:

'''
该程序作用是实现 LED 的移动
在线文档:https://docs.geeksman.com/
'''

import time
from machine import Pin

# 定义 LED 控制引脚
pin_index_list = [13, 12, 14, 27, 26]

# 定义 led_pin_list 列表,保存 LED 管脚配置对象
led_pin_list = []

# 循环给 led_pin_list 列表添加对象
for i in pin_index_list:
    led_pin_list.append(Pin(i, Pin.OUT))

# 获取 LED_Pin_list 的长度
num = len(led_pin_list)

# LED全熄灭
for led_pin in led_pin_list:
    led_pin.value(0)

while True:

    for i in range(num):
        # LED逐个点亮
        led_pin_list[i].value(1)
        # 如果这颗 LED 是第一个,则需要改变最后一颗 LED 的状态
        if i == 0:
            led_pin_list[num - 1].value(0)
        # 如果这颗 LED 不是第一个,则需要改变它之前一颗 LED 的状态
        else:
            led_pin_list[i - 1].value(0)

        # 延时 0.2 秒
        time.sleep(0.1)

快去自己的开发板上测试一下吧。

上次编辑于:
贡献者: Luo