一、课堂目标

  • 了解生活中红绿灯的亮灯规则
  • 掌握交通信号灯的控制方法

二、知识引入

生活中的交通信号灯

交通信号灯是指挥交通运行的信号灯,一般由红灯、绿灯黄灯组成。红灯表示禁止通行,绿灯表示准许通行,黄灯表示警示

信号灯有三种状态:亮灯、熄灭、闪烁;变灯顺序为:红→绿→黄→红,红灯直接变绿灯,而绿灯变红灯中间有黄灯过渡。

认识交通信号灯元件

本课程用交通信号灯元件和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交通灯对象,设置交通灯颜色变化的回调,将倒计时时间传给数码管。

六、效果展示

微蓝课堂|树莓派|交通灯


这里没有展示倒计时和交通灯的内部实现,有兴趣的可以公众号给我留言!

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐