基于STEP Pico制作一个交通灯控制器
用树莓派Pico基于Micropython编程实现了红、黄、绿三种颜色的交通灯自动切换,模拟当行人按下按钮时,交通灯会根据实际情况做出不同反应进行切换
标签
树莓派
嵌入式系统
MicroPython
2023寒假在家练
陈璟昊
更新2023-03-29
北京理工大学
409

内容介绍

1. 项目介绍

  • 基于STEP Pico制作一个交通灯控制器
  • 具体要求:仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,行人按键时,具有优先功能
  • 实现方式:利用板上的3个不同颜色的LED模拟交通灯,程序会轮流切换三个灯的状态,并根据按键的输入(中断或查询机制)调整交通灯的切换

2. 功能及设计思路

2.1 交通灯自动切换

Z

红色

9k=

绿色

9k=

黄色

通过ws2812b控制的12个led灯带,分别调整rgb颜色显示出红、黄、绿三种颜色,以模拟车辆交通灯的三种颜色。红色常亮5秒,后闪烁3秒,切换为绿灯常亮5秒,后闪烁3秒,再切换为黄灯常亮2秒,最后进入下一次循环切换为红灯。闪烁时伴随蜂鸣器报警,表示灯色即将切换,以警示过往车辆行人。

设计思路:

1. 分别设置四种状态下灯带,对应红、黄、绿三色以及闪烁状态下熄灯状态。利用time.sleep函数可实现led灯常亮并控制亮起时间;

2. 分别结合红灯熄灯与绿灯熄灯,每隔0.5秒切换共3个循环,可实现3秒闪烁;

3. 调用蜂鸣器,设置具体频率,利用PWM波占空比设置响度,随着灯亮灯熄过程切换响度,实现蜂鸣器警报模拟。

(由于闪烁状态为动态,具体演示详见视频)

2.2 按键中断控制

(由于按键按下及对于交通灯状态影响都为动态过程,详见演示视频)

由于模拟的是车辆交通灯,与行人红绿灯颜色机制相反,因此根据行人红绿灯各自状态按下按钮时做出不同反应,车辆灯绿色时(对应行人灯红色,此时行人按下按钮是因为想快速过马路,因此车辆灯会即刻切换状态)按下按钮,则会马上进入绿灯闪烁状态,并在闪烁结束后进入黄灯以及下一次循环;车辆灯红色时(对应行人灯绿色,此时行人按下按钮是因为绿灯时间不够过马路,希望能延长过马路时间)按下按钮,则会让红灯延长5秒,为行人争取到更多过马路时间。当车辆灯为黄色或者闪烁状态时,按下按键无反应;红灯常亮及绿灯常亮时,仅第一次按下按键有反应,多按无效。

设计思路:

1. 首先要判断按键按下时车辆灯的实时具体状态,利用中断控制使灯实时对按键按下这一事件做出相应应答;

2. 采用全局变量cond以检测交通灯状态,仅当cond表示红灯与绿灯时按下按钮才会有对应反应;

3. 由于闪烁状态为红、绿两色与熄灯状态组合,为避免闪烁状态按下按键出现bug,设置全局变量flash检测交通灯闪烁状态,仅当flash表示常亮状态下,按下按钮才会有对应反应;

4. 红灯按下时要使灯亮延长,直接调用time.sleep函数快速实现;

5. 绿灯按下时要马上闪烁接续后续循环,则引入全局变量key检测按键是否按下,并在实际循环中检测key值,若按下则跳过后续步骤直接continue进入下次循环。ZHPUy7X2nyv3e9DvA8CIAACIAACcSEQusCIy0QxDhAAARAAARAAARAAARAAgfAJQGCEzxg9gAAIgAAIgAAIgAAIgEBqCEBgpGapMVEQAAEQAAEQAAEQAAEQCJ8ABEb4jNEDCIAACIAACIAACIAACKSGAARGapYaEwUBEAABEAABEAABEACB8AlAYITPGD2AAAiAAAiAAAiAAAiAQGoIQGCkZqkxURAAARAAARAAARAAARAInwAERviM0QMIgAAIgAAIgAAIgAAIpIYABEZqlhoTBQEQAAEQAAEQAAEQAIHwCUBghM8YPYAACIAACIAACIAACIBAaghAYKRmqTFREAABEAABEAABEAABEAifAARG+IzRAwiAAAiAAAiAAAiAAAikhgAERmqWGhMFARAAARAAARAAARAAgfAJQGCEzxg9gAAIgAAIgAAIgAAIgEBqCEBgpGapMVEQAAEQAAEQAAEQAAEQCJ8ABEb4jNEDCIAACIAACIAACIAACKSGAARGapYaEwUBEAABEAABEAABEACB8AlAYITPGD2AAAiAAAiAAAiAAAiAQGoIQGCkZqkxURAAARAAARAAARAAARAInwAERviM0QMIgAAIgAAIgAAIgAAIpIYABEZqlhoTBQEQAAEQAAEQAAEQAIHwCUBghM8YPYAACIAACIAACIAACIBAaghAYKRmqTFREAABEAABEAABEAABEAifwP8BxAp9xTPQc5IAAAAASUVORK5CYII=

3. 代码综述

XA1ahUVGb2s3j6DyXdUAtQR9q3y1DGjAE6uPAKF8dQwD2vlbc0V3B0EyhtvdwcjbgkjUDUE2G+rZhGuDyOQjQD7bTZGLMEIVA2Bwua3VWsY14cR2GEEeLzdYeNy03YWgf8Hj7meCY2xRZwAAAAASUVORK5CYII=

导入电路板设备及函数库

wG07hK3dK0J2QAAAABJRU5ErkJggg==

设置PWM频率控制蜂鸣器震动,设置全局变量cond、flash检测交通灯状态

grtfwhY9tyoAAAAASUVORK5CYII=

分别定义四色灯带分别状态函数

ki+5TOLgAAAAASUVORK5CYII=

分别定义绿灯闪烁与红灯闪烁的状态函数。当开始闪烁时,使flash置1,闪烁循环三次结束后,flash归0,代表闪烁结束接下来为常亮状态

kZpRoAAAAASUVORK5CYII=

定义当k1按下时,中断控制后交通灯具体变化。当cond为1且flash为0时,为红灯常亮状态,此时继续延时5秒实现红灯延长;当cond为2且flash为0时,为绿灯常亮状态,此时记录全局变量key为1,绿灯立即闪烁并切换为黄灯,执行完后跳转下次循环。

x+lcQQJuV29hAAAAABJRU5ErkJggg==

交通灯自动循环切换具体程序。每次循环前先把按键检测变量key归0,再进行具体循环。由于红灯按下时,中断控制直接执行延时5秒的操作,因此无需跳过后续步骤,接续循环即可,因此此处不用检测key是否已按下置1;而当绿灯按下时,由于要马上结束常亮状态,马上开始闪烁,因此直接在中断控制程序里执行后续步骤,执行结束后回到循环中,此时检测key是否为1,若为1表示已在中断控制程序中闪烁并切换黄灯过了,因此执行continue语句跳过后续步骤直接进入下次循环,即红灯亮起。

4. 难题及解决方案

第一部分功能即交通灯自动切换并不难实现,结合ws2812b以及蜂鸣器使用很快就能实现具体功能。

第一个难点在于如何使用k1按钮进行实时操纵。最开始我模仿教学视频里,在循环语句中加入if检测语句if k1.value == True:以此检测k1是否按下,但由于该语句是嵌套循环逐步运行的,只有当程序按顺序运行到该语句时,才会对我是否按下按键进行检测,无法实现实时控制。我尝试了许多办法,例如使用多线程运行、将if语句跳转至循环外、另外定义一个函数进行检测,均以失败告终,因为我始终没有跳出程序按顺序运行的逻辑。

好在我想到了可以去其他有关按键控制项目教程视频学习。我在发现仅靠交通灯一个视频里的知识无法实现我想要的具体功能后,我找到了反应时间检测这个项目的视频。在教程中老师详细讲解了中断控制以及button函数的具体用法,我此时才如醍醐灌顶,原来我之前一直使用的控制检测方法是错误的,很快我在程序中加入相关代码段后,果真能实现按钮对交通灯的实时控制了,问题终于得到了解决。

第二个难点在于,由于绿灯时按下按钮,原本设想是马上使绿灯开始闪烁,并接着运行绿灯闪烁后续循环,但是由于定义的中断控制程序是在循环外的,无法直接使用continue函数对循环进行控制,导致每次绿灯闪烁,由于原本循环中只有绿灯常亮状态被中断了,下一步还是会再运行一次绿灯闪烁状态,即按下按钮后执行两次绿灯闪烁才会切换黄灯进入下次循环。

于是我便想到可以设置一个全局变量检测按键是否被按下。当中断程序执行完成后,步入下一步循环时检测一下变量key是否发生变化,若变化则此时使用continue语句跳过后续绿灯闪烁程序直接步入下次循环。而直接把绿灯闪烁以及黄灯切换加入中断控制程序中,在检测key值前就已经执行过这些步骤了,跳入下次循环时直接切换至红灯,看起来就像是按下按钮后直接执行了绿灯闪烁及后续步骤。

第三个难点在于交通灯不只红绿常亮两个状态,还有黄灯熄灯、红闪绿闪的状态。在后面这些状态下按按钮,则会出现bug,例如红闪时实际上是红灯熄灯组合切换,便会检测到其中红灯状态从而使闪烁停止,红灯与蜂鸣器会延长触发5秒。

为解决这个bug问题,我如法炮制加入两个全局状态检测变量cond(灯色)与flash(闪烁)两个,分别对应不同交通灯状态,只有当灯位红色绿色以及常亮时,按下按键才会有对应反应执行,避免出现bug。

5. 未来计划建议

由于pico板上还有很多其他模块可以使用,例如可以在红绿灯切换时在oled模块上播放一些文本或动画提示,使红绿灯模拟更加丰富。

在具体程序实现过程中,可以多多借鉴其他一些项目的代码以及经验,例如我本次项目中中断控制的相关知识便是从反应时间游戏的项目教程中借鉴得来,解决了困扰我较长时间的难题。在未来过程中可以多多结合多方数据库及代码功能,融入自己的项目中。

附件下载

traffic.py
程序运行代码

团队介绍

来自北京理工大学信息与电子学院2019级电子信息工程专业
团队成员
陈璟昊
来自北京理工大学电子信息工程专业

评论

0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号