基于STEP pico的交通灯信号系统- 2023 寒假一起练
本文根据交通信号灯的逻辑在STEP PICO开发板上实现交通灯的功能
标签
嵌入式系统
PICO
树莓派RP2040
寒假一起练
飞跃1989
更新2023-03-29
苏州大学
331

项目介绍

这次参加"2023寒假一起练" ,这次选中的是树莓派PICO。这也是我比较喜欢的一颗IC, 这颗IC有个双核,对性能是很大的提升,据了解,这颗芯片还可以支持SMP方式的进行编程,目前RT-THREAD已经支持RP2040的SMP双核编程,这个也是开源小伙伴的集体贡献得来的。

本项目旨在使用RP2040 Pico开发板制作一个交通灯控制器,实现通过按键控制交通灯的状态切换,并具有行人优先功能。

简单的硬件介绍

本项目使用RP2040 Pico开发板作为主要硬件平台,同时还需要三个LED小灯、一个按键开关、面包板和杜邦线等辅助硬件,同时我这边添加了SSD1306的显示。

设计思路

我们想象一下,交通灯按键,平时我们在过马路的时候,通常什么时候需要按交通灯按键呢?通常一个正常人,在他这个时候需要过马路的时候,这个时候他发现红绿灯是红色的,他过不了,这个时候,他按下按键,大概意思是,这个时候我需要过马路了,希望能尽快进入绿灯。

交通灯点亮小灯

做嵌入式的,首先把小灯点亮,下面这段代码可以将3个红黄绿小灯点亮

from machine import PWM, Pin
from board import pin_cfg
from button import k1
import time
​
r = Pin(pin_cfg.red_led, Pin.OUT)
g = Pin(pin_cfg.green_led, Pin.OUT)
b = Pin(pin_cfg.blue_led, Pin.OUT)
y = Pin(pin_cfg.yellow_led, Pin.OUT)
​
def red_light():
    print("red on")
    r.on()
    y.off()
    g.off()
def yellow_light():
    print("yello on")
    y.on()
    r.off()
    g.off()
def green_light():
    print("gree on")
    g.on()
    y.off()
    r.off()
​
while True:
    red_light()
    time.sleep(40)
    yellow_light()
    time.sleep(5)
    green_light()
    time.sleep(50)

添加按键

这里通过查看button.py 略微调整下抖动时间min_ago 是防抖时间,这边采用中断触发的方式进行触发,

from button import k1
from button import button
​
def k1_callback(pin):
    print("K1 push")
k1 = button(pin_cfg.k1, k1_callback, trigger=Pin.IRQ_FALLING,min_ago=500)

添加运行逻辑图

我这边回忆了一下苏州平江路南边的马路上的红绿灯按键,想象一下,按键按下之后,会尽快出现绿灯,让行人先走的方式,可能和老师讲的课程有些不一样。

我们先看下交通灯的红绿黄的大概时间

通常交通灯的红黄绿色显示时间是根据车流量、行人数量、道路宽度等情况来设置的,不同的道路和路口可能会有不同的设置。
一般来说,绿灯时间会根据道路的宽度和车流量来设置,通常在20-60秒之间;黄灯时间一般为3-5秒,是为了提醒车辆减速停车;红灯时间则根据道路的宽度和行人的数量来设置,一般在30-60秒之间。
交通灯的切换是由信号控制器控制的,信号控制器会根据预设的交通流量和时间来切换不同的灯色。一般来说,交通灯的切换是通过定时器来实现的,定时器到达设定的时间后,就会自动切换灯色。但是,如果有行人按下了行人信号按钮,信号控制器会优先切换为行人通行的红灯,然后再切换为其他灯色。

绿灯:20-60s之间,黄灯3-5s, 红灯30-60s之间,

我们设定绿灯40s,红灯50s,黄灯5s。

通常只有在红灯期间,用户按下按键,我们需要将红灯减少5s,因为此时行人想快速通过,不想等太久,如果是绿灯,我们需要将绿灯增加5s。黄灯则不变

这里面我们想象一下,如何让红灯减少5s或者10s,绿灯增加10s。

下面是简易的流程图

FvHLor1GNLTJIx7P1wp1mSXavo4D

有了这个流程图之后,我们就很清晰了,我们需要根据按键是否按下,来进行delay时间管理

下面是按键判断做的操作,在按键回调函数中触发

def k1_callback(pin):
    print("K1 push")
    global show_time 
    global button_press_flag
    global green_led_flag
    button_press_flag = True
    if show_time > 10:
        if green_led_flag == True:
            show_time += 10
        else:
            show_time -= 10

下面是亮灯的时候根据show_time来进行一个时间缩减:

while True:
    red_light()
    show_time = 40
    while show_time >= 0:
        print("showtime:%d" % show_time)
        time.sleep(1)
        show_time -=1
        
    yellow_light()
    time.sleep(5)
    green_light()
    show_time = 50
    while show_time >= 0:
        print("green showtime:%d" % show_time)
        time.sleep(1)
        show_time -=1

这个时候我们的基本任务差不多完成了。

添加屏幕显示

拓展板有个小屏幕,我们可以把它利用起来,当作一个智能显示终端,这个题目没有要求做,我们可以想象一下,有时间可以尝试优化一下。

text(data,3,30,1) 最后一个参数是显示的字体的颜色,>1是白色,<1是黑色。

 

显示效果图

FuD5yFSv6CwZcYEBYDm-OG-4JK9s

 

以上是本项目的核心代码,其中包括按键检测部分和交通灯控制部分。按键检测部分不断检测按键状态,如果检测到按键被按下,则将红灯时间减少10秒。交通灯控制部分通过控制LED小灯的开关来模拟真实的交通灯系统。如果检测到按键被按下,则需要对红灯的持续时间缩短。

遇到的主要难题及解决方法

这次还是遇到一个全局变量的坑,好在之前有遇到过同样的问题,找到之前写的代码,需要添加global变量,不然函数中是局部变量。

还有遇到字体无法改变的问题,后来查了一下,SSD1306库的字体就是无法改变的。

FssStPRdYeEXmEJkCg6aniERurus

在本项目的实现过程中,遇到了一些难点。其中最主要的问题是如何实现行人优先功能。为了解决这个问题,我们需要在程序中加入对按键状态的检测,并对红灯时间进行相应的修改。通过多次的实验和调试,最终实现了行人优先功能。

建议

本项目是一个非常经典的应用场景,可以更好地理解物联网和嵌入式系统的应用。未来我们可以进一步探索交通灯控制器的功能扩展和优化,例如加入自动识别系统、远程控制功能等,以满足更多的实际需求。

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