前面我们通过控制LED灯和读取按钮状态,简单演示了树莓派如何通过GPIO来与外部世界沟通。今天我们要用树莓派模拟一个控制交通的红绿灯,让大家进一步学习如何通过程序和计算机的I/O来解决实际问题。
今天要做的红绿灯是简洁版,我们今后还会讲它的进阶版(高级版)。简洁版的红绿灯有一个开关控制按钮和红黄绿三色交通控制灯。当程序启动时,只有黄灯处于闪烁状态,提醒来往车辆注意其他路口的车辆,当第一次按下按钮后,则进入红绿灯交替开关的状态,和大家日常在路口看到的类似,再次按下按钮,则重新恢复到黄灯闪烁状态。这是大部分路口自动控制红绿灯的逻辑。(如果大家不明白红绿灯相关的交规,可以咨询父母或者上网搜索,这里不说了)。
需要的元器件
本次的红绿灯需要如下的元器件
红绿灯电路
在前面控制发光二极管时,我们知道发光二极管需要连接一个1K欧姆的电阻来起到限制电流的保护作用。所以电路如下图。
从电路可以看到,控制按钮连接了GPIO17,红色LED连接了GPIO26,黄色LED连接了GPIO5,绿色LED连接了GPIO27。
最终的元器件连接如下图:
Python控制程序
在我们实际进行电路或程序设计时,一般都会采取循序渐进的方式,先从简单的设计开始,然后一步一步加入更复杂的逻辑,直到最终实现我们需要的效果。这在电路或程序较复杂时尤其重要。
首先,我们需要确保电路连接都是正确的,有一个简单的验证方法,在前面的发光二极管控制一讲也提到过,就是在发光二极管连接到GPIO之前,先直接连接GPIO的第一引脚,也就是3.3V的电源,此时LED会亮,则说明连接正确无误。
其次,我们要确保各器件连接了正确的GPIO引脚,因为有些GPIO引脚紧挨着(如GPIO17,27,22),如果连接错了,也是没法成功控制电路的。按我的电路,先用下面的程序运行一下看,3个LED都应该亮1秒,灭1秒,同时按钮按下超过1秒,可以看到打印输出Pressed。
fromgpiozero import LEDfromtime import sleepred= LED(26) #红灯链接了GPIO26yellow= LED(5) #黄灯链接了GPIO5green= LED(22) #绿灯连接了GPIO22control= Button(17) #按钮连接了GPIO17whileTrue:red.on()yellow.on()green.on()ifcontrol.is_pressed:print("Pressed") #保持按钮按下超过1秒,可以看到打印输出sleep(1)#先让LED亮1秒red.off()yellow.off()green.off()sleep(1)#再让LED灭1秒接下来我们加入更多的逻辑。只让黄灯闪烁,还是红绿灯交替控制,需要有一个变量来进行判断,因为非此即彼,所以可以把这个变量设置为布尔型(True或False),我们把它命名为kaiguan。代码先改为如下:
fromgpiozero import LED,Buttonfromtime import sleepkaiguan= False #控制变量默认设置为False,此时黄灯闪烁red= LED(26) #红灯链接了GPIO26yellow= LED(5) #黄灯链接了GPIO5green= LED(22) #绿灯连接了GPIO22control= Button(17) #按钮连接了GPIO17whileTrue:ifkaiguan == False: #当kaiguan变量为False时,黄灯闪烁yellow.on()sleep(0.5)yellow.off()sleep(0.5)else:red.on()yellow.on()green.on()ifcontrol.is_pressed:print("Pressed")sleep(1)red.off()yellow.off()green.off()sleep(1)