项目介绍
仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,行人按键时,具有优先功能。按下行人按键后,在等待一段时间后切换为红灯并维持一段时间,从而允许行人通过。
设计思路
使用pico 板上的12个ws12812b LED灯分别亮起绿灯、黄灯、红灯来模拟马路上的交通灯工作状态切换。由于是仿真的重点不在于时间的持续时长,故本次仿真依次设置绿灯亮起10秒、黄灯亮起3秒、红灯亮起10秒来完成仿真;同时,在各个灯色状态下由oled显示屏显示当前灯色到下一灯色的切换倒计时时间。
由于在红灯和黄灯时,行人本就无需等待过长时间便可通过,没有使用行人按键的必要,故在红灯和黄灯的状态下按下行人按键不需要仿真作出任何反应;而在绿灯时,按下行人按键后,需给予行车保持一小段绿灯时长,再进入一段红灯时间给予行人通过,故本次仿真设置按下行人按键后,进入3秒的绿灯倒计时准备状态,并在倒计时完成后进入5秒的红灯行人通过状态。另外,在按下行人按键后,分别在绿灯和红灯倒计时的同时额外显示“PASS READY”和“PASSING”,以此来与正常红绿灯循环状态作区别。
框图
软件流程图
硬件介绍
树莓派Pico扩展板
板卡包括:
2个按键输入、4个单色LED、12个WS2812B RGB三色灯、1个姿态传感器、1个128*64 OLED显示屏、1个蜂鸣器、1个可调电位计(用于电压表)、1路音频信号输入(用于示波器)、8位R-2R电阻网络构成的DAC(用于DDS信号发生器)。
本次仿真使用到1个按键输入、12个WS2812B RGB三色灯和1个128*64 OLED显示屏。
实现的功能
通过12个WS2812B RGB三色灯分别亮起绿色、黄色、红色表示三种交通灯,并以绿灯10秒、黄灯3秒、红灯10秒进行循环。在绿灯亮起时,按下k1表示行人按键,进入3秒绿灯等待时间,接着进入5秒红灯时间。红灯结束后,返回按下k1之前的状态。
图片展示
主要代码片段及说明
def k1_callback(pin):#按下k1行人按键执行中断程序
if n == 1:#判断按下行人按键时是否为绿灯,若是则执行按键功能;若为黄灯或已为红灯,则不必执行
oled.fill(0)
for i in range (3,0,-1):#行人通过倒计时准备
oled.text("PASS Ready:",25,25)
oled.text(str(i) ,55,35)
oled.show()
time.sleep(1)
oled.fill(0)
oled.show()
ws2812b.on_all("#ff0000")#准备结束,亮起红灯
for i in range (5,0,-1):#行人通过,亮起红灯5秒
oled.text("PASSING:",25,25)
oled.text(str(i) ,55,35)
oled.show()
time.sleep(1)
oled.fill(0)
oled.show()
ws2812b.on_all("#00ff00")
遇到的主要难题及解决方法
在程序实现过程中遇到的难题主要是中断程序的实现和oled屏幕倒计时的显示。
起初原本打算直接在主循环程序中直接读取k1按键的输入,然后直接进入行人按键的切换状态,但是这样一来,在行人按键的红灯结束后,无论按下行人按键的状态为何,都会直接从一开始重新进入主循环,无法实现模拟设计的要求。最后,在搜索了相关资料后,在观看了往年直播回放的反应测试器的制作后,学习了其中中断程序的用法,最终使用callback来读取k1按键上升沿的信号,完成中断程序的实现。
另外,由于没有详细学过microPython的语法,一开始想要使用计时器进行倒计时的表示,遭遇了困难。在经过思考后,决定采用for循环进行整数递减以及time.sleep进行逐秒延迟相结合的方法。具体来说,如对10秒倒计时,即用for循环对i进行从10到-1的递减,在每一步循环中,使用oled.text读取当前i的数值并使用oled.show()显示出来,接着使用time.sleep进行一秒的延迟,在延迟过后,使用oled.fill(0)晴空当前oled所记录的文本,并重复上述步骤,最终实现oled屏幕倒计时。
未来的计划或建议
本程序在绿灯状态下按下行人按键后会进行3秒绿灯等待和5秒红灯通行,在黄灯和红灯按下则无反应。但是,在绿灯剩余时间少于3秒时,按下行人按键反而要等待足够3秒,反而浪费时间,而且通行结束后,又会回到少于3秒的绿灯状态,紧接着又进入黄灯和红灯,这在现实中会造成交通的混乱。因此,该程序可进一步优化,在绿灯时间少于一定时长时,按下行人按键会发出提示,并不再对行人按键作出绿灯等待和红灯通行的反应。
总结
由于本人以往没有进行过Python的学习,所接触过的编程也只是简单地使用C语言在电脑上完成一些程序的实现,因此本次基于树莓派Pico的嵌入式系统学习平台可以说是头一次让我将程序编写和实物操作相结合起来,是一次相当有意义的学习体验。而且,由于本次学习主要通过个人自主网上学习,而不是以往传统的系统教室教学,因此,大量的网上自主学习也给我带来了很大的收获。本次自主完成的交通灯控制器虽然只是简单的程序实现,没有涉及到太多复杂深入的技术应用,但是也大大激发了我深入学习的兴趣,今后也想更进一步地学习和应用嵌入式系统的相关知识。总之,很高兴能参加本次2023寒假在家练活动项目!