交通信号控制灯
1 项目介绍
在板卡上面有3个不同颜色的LED模拟交通灯,通过利用程序轮流切换切换三个灯的状态实现信号灯的基本功能。然后在行人按键时,根据按键的输入(中断或查询机制)调整交通灯的切换。
2 项目要求
仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,行人按键时,具有优先功能。
3 设计思路
· 循环使程序轮流切换三种信号灯
通过循环,不断点亮和关闭三种led灯,实现模拟交通信号灯,且其顺序为红、黄、绿、黄,而红灯保持5秒,在正常情况下,黄灯保持3秒,绿灯保持5秒。
· 利用显示屏来显示交通灯的信号
利用显示屏,在交通灯某一个状态下,使oled显示屏能够显示出此时的状态。例如,在绿灯时oled显示屏会显示‘’green‘’;黄灯时显示‘’yellow‘’;红灯时有两种情况,一种时正常显示,oled上为‘’red‘’,另一种是行人按下按键时,oled显示屏会显示‘’k1 press‘’。
· 利用按键控制信号灯的转换使行人优先通过
在本项目中,行人具有优先通过的权限,即行人在黄灯和绿灯的情况下,可以按下k1按键,此时,led灯会从黄绿灯的情况下立马转换为红灯,让车辆停止行驶,以便行人通过。
4 实现的功能及图片展示
实现的功能:
① 三个不同颜色的led灯轮流出现。将某一颜色led灯点亮,在保持一定时间’亮‘的状态后,在熄灭,然后点亮另一led灯,不断循环,使红黄绿不断交替出现。
②行人按下按键后可使信号灯变为红灯然后通行。按下板卡上的k1按键,信号灯在任何状态下都会变为红灯,并保持一定时间,让行人能够通过。
③oled显示信号灯的状态以及按键是否按下。当信号灯亮起时,oled屏会显示此时信号灯的颜色及给出该颜色的英文表示,在按下按键后也会进行提示按键按下然后红灯亮起。
图片展示:
红灯时oled显示状态及led灯的显示:
行人按下按钮后时oled显示状态及led灯变为红灯:
绿灯时oled显示状态及led灯的显示:
黄灯时oled显示状态及led灯的显示:
5 主要代码片段:
1)中断函数(控制交通灯的切换):
利用两个循环,将函数形参定义为信号灯保持亮的时间。在第一层循环内判断中止变量的值来确定是否可以结束这个函数的运行;第二个循环内判断行人是否按下按键,以及黄灯和绿灯的状态,如果判断成功,则将此时的led灯关闭,再切换为红灯,同时,还给中止变量赋值,并在红灯显示结束后,切换为下一个信号灯。同时,控制两个循环通过执行的次数使执行时间无限接近此时信号灯不改变情况下所需要保持的时间,以实现交通灯需要保持的状态。
def sleep_stopable(sleep_time):
stop_value=0
k_value=0
for i in range (sleep_time):
if stop_value==1:
stop_value=0
break
for j in range(33333):
k_value=k1.value()
if k_value==1:
if y.value() == 1:
y.off()
if g.value() == 1:
g.off()
r.on()
oled_show("k1 press")
time.sleep(5)
r.off()
stop_value=1
break
2)三种led灯的点亮及oled显示
将三个led灯点亮,并维持一定的时间,在点亮三个led灯的同时再oled屏幕上显示此时交通灯的状态以方便人读取信息。另外在黄灯和绿灯时,利用中断函数对k1按键状态进行判断来实现行人优先通过的功能。
def oled_show(colour):
oled.fill(0)
oled.text(colour, 45, 32)
oled.show()
def g_light():
g.on()
oled_show("green")
sleep_stopable(5)
g.off()
def y_light():
y.on()
oled_show("yellow")
sleep_stopable(3)
y.off()
def r_light():
r.on()
oled_show("red")
time.sleep(5)
r.off()
6 程序流程图
7 遇到的难题
中断与保持的关系
我在项目中构建的中断函数只能实现行人具有优先通过权,并未考虑到车辆通过的问题,也就是在行人通过后,车辆也许只能继续等待下一个绿灯。
解决:目前暂未有好的想法。
8 未来的计划建议
这个项目已经实现了交通信号灯的轮流切换,并满足了行人按下按键后对于信号灯的控制然后切换到下一个次序的信号灯,但这可以更改为行人按下按键后,交通信号灯在变更为红灯,结束红灯的时间后并继续保持上一个状态,即将上一个信号灯时间暂停来让红灯保持一定的时间后再继续上一个信号灯未完的时间让车辆通过活着让车辆继续等待黄灯时间。