2023寒假在家练活动:基于STEP Pico制作一个交通灯控制器
1.项目需求
使用STEP Pico开发板来仿真马路上的交通灯的的工作切换状态,利用开发板上的红、黄、绿三种颜色的LED灯珠显示交通道路状态的切换,并且再行人按下按键时,有优先功能。
2.完成的功能和达到的要求
通过利用STEP Pico开发板上的LED灯珠,通过让开发板上的LED灯显示不同的颜色进而来模拟交通灯状态的切换,即控制红、绿、黄三色LED灯按照我们所设置的时间间隔进行切换。为了实现行人优先的功能,我们设定k1键为行人按键,通过设置这一个按键,行人按下按键,来使交通灯先变成黄色来提醒路上车辆即将有行人通过马路,方便车辆快速驶离,之后LED灯变成红色,来禁止车辆通行,方便行人通过马路。通过这样的设计来实现行人优先这一功能。
3.项目设计思路
①:通过主循环程序来控制开发板12颗LED灯珠的三色循环,从而模拟出交通灯的工作状态
②:在程序正常工作状态时,三色灯珠会以一定的时间间隔进行循环,来模拟没有行人通过马路时候的状态。
③:当有行人按下按键时,程序进行中断,并且LED灯跳转到黄灯以通知车辆有行人即将通过,然后变成红灯,方便行人通过马路,通过中断实现了行人优先功能。
4.实现过程
①:程序流程框图如下
②:主要程序解释
第一段:
import time
import ws2812b
from button import button
from board import pin_cfg
from machine import Pin
在程序的第一段,我们先引入之后编程所需要的库文件,比如说time函数来控制LED灯的点亮时间,引入ws2812b来控制开发板上的12颗LED灯等等。同时在第三行中将k1引入为中断,这样方便我们接下来的编程
第二段:
def k1_callback(pin):
ws2812b.on_all("ffff00")
k1=button(pin_cfg.k1,k1_callback,trigger=Pin.IRQ_FALLING)
在程序的第二段中我们设置一个中断,通过监测是否按下k1来实现是否执行中断。同时编写了在按下k1之后,程序进入中断之后所运行的程序。这里我们设置为,行人按下k1后执行中断程序,然后LED灯珠变成黄色用来通知路上车辆,即将有行人通过,方便车辆有时间让出马路。因为行人只有可能在红绿灯为绿色的时候才会按下k1所以在按下k1、LED灯编程黄色之后,又会继续执行程序,LED灯变成红色,这个时候行人就可以通过马路了。
第三段:
while True:
ws2812b.on_all("ff0000") #red
time.sleep(5)
ws2812b.on_all("00ff00") #green
time.sleep(5)
ws2812b.on_all("ffff00") #yellow
time.sleep(2)
第三段时程序主循环部分,在没有行人按下按键的时候,程序会执行这个循环,让LED灯珠按顺序显示红色(5s)、绿色(5s)、黄色(2s)来模拟没有行人按下按键的时候红绿灯的运行状态。通过ws2812b.on_all来实现将这12颗灯珠时同时点亮,以免前后灯珠之间有时间误差。而通过不同的“ff0000”"00ff00""ffff00"来实现点亮的LED灯呈现红、绿、黄三种颜色。
至此,所有的程序就编写完成放在开发板上去运行就会实现设计中所要求的模拟交通灯的运行情况,且通过中断实现具有行人优先功能的任务要求。
③:项目图片展示
在正常循环时,会按照红绿灯三色进行一次循环,来模拟正常时候的红绿灯状态
在绿灯时候按下按键,灯会变成黄色从而提醒车辆即将有行人通过进而变成红灯,方便行人通过。
在行人通过之后,交通灯又变成了正常的循环状态。
5.遇到的主要问题
在STEP Pico开发板实现项目要求的时候,主要遇到了以下的问题:
第一个问题就是如何将12颗灯珠同时点亮的问题。在刚开始,我打算用for i in range的循环程序来逐个点亮这12个LED灯。在编程之后的运行测试中,我发现这12颗灯珠确实能点亮,但是在点亮的过程中,这12颗灯珠是逐个点亮的,而且有明显的肉眼可见的延迟,所以说这个方案是不合适的。通过深入的了解和学习之后,我又认识到了新的方式即ws2812b.on_all的形式来点亮这12颗LED灯珠,通过这种方式点亮的12颗灯珠是之间是没有延迟的,因此如何同时点亮这12颗灯珠的问题就解决了。
第二个问题是如何通过来实现中断进而实现行人优先的功能。在刚开始,我对中断的认识并不是很深刻。起初我是将按下k1之后,程序会增加红灯亮灯的时长来实现行人优先的功能。这样的设计有一个缺陷,那就是这样的设计在行人按下k1之后,程序并没有立刻作出反应,所以说并没有完全实现要求中的行人优先的功能。因此我特地去了解了一下有关程序中断的问题,同时也多看了一些网课,设计出了按下就立即执行的中断,通过加入中断的方式来实现行人优先。这样第二个问题也就解决了。
6.未来的计划建议
在文章的最后,我想给设计开发板的工程师们提一个小小的意见,那就是这个STEP Pico开发板上的小屏幕的像素是非常低的,也就是说这块屏幕只能显示英文,如果可以换成一块更高像素的屏幕,来支持中文显示,那样这块开发板就会有更大的开发空间和更多不同种类的玩法,比如屏幕和蜂鸣器联动,边显示歌词边播放音乐等等。以上仅是我个人的一个小小的建议。