流水灯实验
大约 3 分钟ESP32Python
上节课我们已经学习了如何点亮一颗 LED 并且让其闪烁,这节课我们学习如何制作流水灯。
硬件电路设计
物料清单(BOM 表):
材料名称 | 数量 |
---|---|
直插式 LED | 5 |
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)
快去自己的开发板上测试一下吧。