【微蓝课堂】机器人编程|树莓派系列|14-仅十行代码实现红绿信号灯
一、课堂目标
- 了解生活中红绿灯的亮灯规则
- 掌握交通信号灯的控制方法
二、知识引入
生活中的交通信号灯
交通信号灯是指挥交通运行的信号灯,一般由红灯、绿灯、黄灯组成。红灯表示禁止通行,绿灯表示准许通行,黄灯表示警示。
信号灯有三种状态:亮灯、熄灭、闪烁;变灯顺序为:红→绿→黄→红,红灯直接变绿灯,而绿灯变红灯中间有黄灯过渡。
认识交通信号灯元件


本课程用交通信号灯元件和tm1637数码管来模拟生活中红绿灯:
- 1. 红灯持续亮灯10秒后熄灭,
- 2. 然后绿灯持续亮灯7秒,再闪烁3秒后熄灭
- 3. 最后黄灯亮灯3秒
- 执行步骤1,不断循环……
三、接线图
元件引脚与树莓派GPIO的连接如下表:
|
元器件 |
引脚 |
树莓派GPIO |
功能说明 |
|
数码管 |
VCC |
5V |
电源 |
|
GND |
GND |
接地 |
|
|
CLK |
GPIO14 |
时钟信号 |
|
|
DIO |
GPIO15 |
数据输入输出 |
|
|
交通信号灯 |
GND |
GND |
接地 |
|
R |
GPIO16 |
红色 |
|
|
Y |
GPIO20 |
黄色 |
|
|
G |
GPIO21 |
绿色 |

四、交通信号灯的使用
4.1 使用LED对象控制
from gpiozero import LED
from time import sleep
red = LED(16)
amber = LED(20)
green = LED(21)
green.on() # 绿灯亮起
sleep(1)
green.off() # 绿灯熄灭
red.on() # 红灯亮起
sleep(1)
red.off() # 红灯熄灭
amber.on() # 黄灯亮起
sleep(1)
amber.off() # 黄灯熄灭
程序解释:和前面课程LED灯使用一样,三个LED灯分别连接GPIO16、GPIO20、GPIO21,可以继续使用LED对象的on()方法和off()方法控制每个灯的亮起和熄灭。
4.2 使用TrafficLights对象控制
from gpiozero import TrafficLights
from time import sleep
lights = lights = TrafficLights(red=16, amber=20, green=21)
lights.green.on()
sleep(1)
lights.green.off()
lights.red.on()
sleep(1)
lights.red.off()
lights.amber.on()
sleep(1)
lights.amber.off()
程序解释:使用gpiozero的TrafficLights类对红绿灯元件进行封装,设置红黄绿的引脚创建TrafficLights对象后,它的red、amber、green属性分别对应红灯、黄灯、绿灯,调用on()和off()就可以控制对应的灯。
4.3 使用source方式控制
from gpiozero import TrafficLights
from time import sleep
from signal import pause
lights = TrafficLights(red=16, amber=20, green=21)
def traffic_light_sequence():
yield (0, 0, 1) # green
sleep(1)
yield (0, 1, 0) # amber
sleep(1)
yield (1, 0, 0) # red
sleep(1)
lights.source = traffic_light_sequence()
pause()
程序解释:
source与value是gpiozero提供的一种声明式编程范式,用于将一个设备的值输入到另一个设备,例如将按钮的值输入到 LED。
我们也可以使用yield生成器人工提供数值。
如果迭代器是无限的(即无限生成器),则会一直处理元素,直到 source 被更改或设置为 None 为止。
如果迭代器是有限的(例如一个列表),则会在处理完所有元素后终止(将设备值保留在最后一个元素上)
五、综合应用
pip install micro-blue
from micro_blue.gpiozero_lib.tm1637 import TM1637
from micro_blue.gpiozero_lib.traffic_light import TrafficLight
number = TM1637(clk=14, dio=15)
def countdown(color, seconds):
print(f'{color} light on')
number.countdown(seconds)
light = TrafficLight(red=16, amber=20, green=21)
light.when_light_change = countdown
light.start(background=False)
程序解释:先创建TM1637数码管对象和TrafficLight交通灯对象,设置交通灯颜色变化的回调,将倒计时时间传给数码管。
六、效果展示
微蓝课堂|树莓派|交通灯
这里没有展示倒计时和交通灯的内部实现,有兴趣的可以公众号给我留言!
更多推荐
所有评论(0)