项目介绍:
制作一个交通灯控制器
具体要求:仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,行人按键时,具有优先功能
实现方式:利用板上的3个不同颜色的LED模拟交通灯,程序会轮流切换三个灯的状态,并根据按键的输入(中断或查询机制)调整交通灯的切换
硬件介绍:
STEP Pico是一款低成本、高性能的微控制器开发板,具有灵活数字接口。(完全兼容Raspberry Pi Pico)硬件上,采用Raspberry Pi官方自主研发的RP2040微控制器芯片,搭载了ARM Cortex M0+双核处理器,高达133MHz的运行频率,内置了264KB SRAM和2MB闪存,还板载有多达26个多功能的GPIO引脚。软件上,可选择树莓派提供的C/C++SDK,或者使用MicroPython进行开发,且配套有完善的开发资料教程,可方便快速入门开发并嵌入到产品中。
板卡介绍:
【基于树莓派Pico的嵌入式系统学习平台】专为嵌入式系统学习而设计,其可以通过C/C++以及MicroPython编程来学习嵌入式系统的工作原理和应用。其包括2个按键输入、4个单色LED、12个WS2812B RGB三色灯、1个姿态传感器、1个128*64 OLED显示屏、1个蜂鸣器、1个可调电位计(用于电压表)、1路音频信号输入(用于示波器)、8位R-2R电阻网络构成的DAC(用于DDS信号发生器)。
环境配置:
1、thonny:
作为官方推荐的开发软件,thonny页面简洁,基础功能齐全,简单易上手,非常适合初学者,安装的教程网上比较多,只需要一个简单的下载安装过程就可以学习编程。
2、硬禾学堂树莓派pico平台:
硬禾学堂为“寒期一起练”制作了一个平台,这平台正是我视频中演示用到的板子,它的原理图如下,具体可以参考https://www.eetree.cn/project/detail/584
核心板引脚图:
电路图:
设计思路:
使用ws2812b模拟交通灯,其一圈十二个灯,效果要优于led灯,然后分别定义红、黄、绿三种颜色的灯。主程序为红、黄、绿三种颜色的灯依次循环,当没有按键按下时,首先绿灯亮起15秒,然后黄灯闪烁,接下来红灯亮起20秒,然后黄灯再次闪烁,以此为一个周期,并依次不断循环。当有按键按下时,oled屏幕上会出现‘’remind‘’信息提示,使用按键中断的方式来实现路口有行人经过时,下一次循环时绿灯时间增加10s,同时使用按键返回函数在oled屏幕上显示’Pedestrian pass‘’信息,起到提示车辆此时有行人通过的效果。
程序实现:
程序均使用micropython编写
下载bsp库中的board.py、board.py、button.py、led.py、oled.py、ssd1306.py、ws2812b.py函数。
初始化配置:
from button import button
from board import pin_cfg
from led import r,g,b,y
from machine import PWM,Pin
from oled import oled
import time
import ws2812b
i = 0
使用ws2812b来模拟交通灯,并定义红、黄、绿三种不同颜色的交通灯:
def red_light():
ws2812b.on_all("#FF0000")
def yellow_light():
ws2812b.on_all("#FFFF00")
def green_light():
ws2812b.on_all("#00FF00")
使用按键中断的方式来实现当路口有行人经过时,按下按钮,通过按键返回函数在oled屏幕上显示‘’remind‘’字样,提醒接下来会有行人通过,并且下一次循环时绿灯时间增加10秒,以便行人顺利通过,此时oled屏幕上有‘’Pedestrian pass‘’字样显示。
def k1_callback(pin):
global i
i = 1
oled.text("Remind",0,10)
oled.show()
k1 = button(pin_cfg.k1,k1_callback,trigger=Pin.IRQ_FALLING)
while True:
if i == 1:
green_light()
oled.text("Pedestrian pass",0,10)
oled.show()
time.sleep(10)
i = 0
当无按键按下时,通过for循环,实现红、黄、绿三灯依次循环,首先绿灯亮起15秒,然后黄灯闪烁,接下来红灯亮起20秒,然后黄灯闪烁,以此为一个周期并依次不断循环,直到有按键按下时跳出循环。
else:
green_light()
time.sleep(15)
for j in range(3):
ws2812b.on_all("#FFFF00")
time.sleep(0.5)
ws2812b.off_all()
time.sleep(0.5)
red_light()
time.sleep(20)
for j in range(3):
ws2812b.on_all("#FFFF00")
time.sleep(0.5)
ws2812b.off_all()
time.sleep(0.5)
oled.fill(0)
oled.show()
流程图:
首先对程序进行初始化,当没有读取到按键信号时,红、黄、绿三灯依次循环,当读取到按键信号时,通过按键返回函数在oled屏幕上作出‘’remind‘’提示,并且下一次绿灯的时间增加并在oled屏幕上有‘’Pedestrian pass‘’显示,以便行人通过,之后仍保持红、黄、绿三灯循环亮起。
未来的计划或建议:
该项目已经完成了交通信号灯的模拟,并且在按键按下时可以增加下一次循环时绿灯的时间,且同时在oled屏幕上有所显示,但仍有改进空间,例如可以在oled屏幕上显示当前亮着的灯的剩余时间、在红灯亮起时在oled屏幕上显示汽车图样、在绿灯亮起时在oled屏幕上显示行人图样、在按下按钮后,当行人通过时伴随蜂鸣器响起,起到提醒效果等。