基于microPython制作一个交通灯控制器
本文利用板上的3个不同颜色的LED模拟交通灯,程序会轮流切换三个灯的状态,并根据按键的输入调整交通灯的切换
标签
嵌入式系统
FPGA
2023寒假在家练
一颗苦柠檬
更新2023-03-29
北京理工大学
497

基于microPython制作一个交通灯控制器

一. 项目描述

1. 项目介绍

本项目旨在仿真马路上的交通灯的工作状态切换,利用板上的红、黄、绿三种颜色的LED显示道路状态的切换,行人按键时,具有优先功能。

2. 设计思路

首先利用板上的3个不同颜色的LED模拟交通灯,编写程序使三个信号灯轮流切换,在红灯和绿灯结束前三秒进行闪烁以及在绿灯亮起时振铃以提示行人,并设计行人通行按钮(中断或查询机制)调整交通灯的切换。

wps

3. 硬件介绍

  1. 2个按键输入
  2. 4个单色LED
  3. 12个WS2812B RGB三色灯
  4. 1个姿态传感器
  5. 1个128*64 OLED显示屏
  6. 1个蜂鸣器
  7. 1个可调电位计(用于电压表)
  8. 1路音频信号输入(用于示波器)
  9. 8位R-2R电阻网络构成的DAC(用于DDS信号发生器)

二. 主要代码的实现功能及图片展示

1. 实现三种颜色灯的立即亮起和瞬时间渐次熄灭,代码如下:

def red_light():
    ws2812b.on_all("#ff0000")

def yellow_light():
    ws2812b.on_all("#ffff00")

def green_light():
    ws2812b.on_all("#00ff00")

def lightdown():
    for i in range(1, 13):
        ws2812b.on(i, "#000000")

 

图片1

图3-1 红灯亮

图片2

图3-2 黄灯亮

图片3

图3-3 绿灯亮

2.程序基本功能

本信号灯以车辆通行为主,即红灯亮起车辆停止通行,行人通行;绿灯亮起车辆通行,行人止步。设置红灯亮起8秒,并在最后3秒内进行闪烁后振铃以提醒行人尽快通行,进入3秒黄灯,黄灯结束后振铃。设置绿灯亮起8秒,并在最后三秒进行闪烁后振铃,再次振铃后进入三秒黄灯,随后红灯亮起振铃,提醒行人可以通行。如此往复。此部分代码如下:

 

 

def loop():
    global n
    n = 1
    for i in range(5):
        global m
        m = 0
        red_light()
        time.sleep(1)
        if m==1:
            break
    m = 0
    n = 2
    lightdown()
    time.sleep(0.5)
    red_light()
    time.sleep(0.5)
    lightdown()
    time.sleep(0.5)
    red_light()
    time.sleep(0.5)
    lightdown()
    time.sleep(0.5)
    red_light()
    time.sleep(0.5)
    
    pitch(500, 0.5)
    pwm.deinit()
    yellow_light()
    time.sleep(3)
    pitch(300, 0.5)
    pwm.deinit()
    n = 3
    
    for i in range(5):
        global m
        m = 0
        green_light()
        time.sleep(1)
        if m==1:
            break
    m = 0
    n = 4
    pitch(200, 0.5)
    pwm.deinit()
    lightdown()
    time.sleep(0.5)
    green_light()
    time.sleep(0.5)
    lightdown()
    time.sleep(0.5)
    green_light()
    time.sleep(0.5)
    lightdown()
    time.sleep(0.5)
    green_light()
    time.sleep(0.5)
    
    pitch(300, 0.5)
    pwm.deinit()
    yellow_light()
    time.sleep(3)
    pitch(500, 0.5)
    pwm.deinit()
  
while True:
    loop()

3.程序核心功能

若此时处于红灯状态,行人按下按键可以延长红灯时间,若此时处于绿灯状态,行人按键后绿灯立刻进入闪烁阶段(3秒),黄灯后红灯车辆停止通行,行人可通行。此部分代码如下:

def k1_callback(pin):
    if n == 1:
        print("+5s start")
        red_light()
        time.sleep(5)
        global m
        m = 1
        print("+5s end")
    if n == 3:
        print("通行请求已发送,请稍后片刻")
        pitch(200, 0.5)
        pwm.deinit()
        global m
        m = 1

pwm = PWM(Pin(pin_cfg.buzzer))
k1 = button(pin_cfg.k1, k1_callback, trigger=Pin.IRQ_FALLING)

def pitch(frequency, duration=0):
    pwm.freq(frequency)
    pwm.duty_u16(3000)
    time.sleep(duration)

图片4

3-4 请求通行结果

图片5

3-5 延时结果

三. 遇到的主要难题和解决办法

这次寒假在家练项目是我步入大学以来第一次在学校以外自己主动学习相关硬件知识。在参加这次项目以前,我对于这种板卡和代码总带有着抵触和恐惧的情绪。觉得这种东西我肯定学不会也看不懂,于是由于心理原因和与之接触时老师讲授的内容过于专业和枯燥,致使我每每望而生畏。

这次寒假练抱着突破自我的心理,尝试应对自己恐惧和未知的领域,于是从这款最简单的板卡作为切入口,算是克服了最大的障碍吧。入手板卡后,从跟着老师点了第一盏灯,到实现了第一个小功能,我渐渐地冲破了桎梏,不再那么恐惧,已经可以主动去探索板卡的其他功能了。

在代码的具体设计过程中,在完成基础循环(红黄绿黄红)后,首先遇到的问题是如何设计按键的中断查询功能,想要的设计结果是能实现在红灯时间内按键延长红灯时间,且按键的次数可以决定延长的时间,在绿灯时间内按键可以立即让绿灯进入闪烁状态从而达到行人立刻通行的目的。但在设计代码的过程中发现代码的执行在一行语句内具有完整性,只会在一行语句结束后才会执行其他语句功能,在加入查询中断功能后也只能在按键当即执行按键后的中断模块语句的功能并同时和被打断的语句并行执行。这并不能达到想要的效果。为了实现该语句中断后执行完中断模块的功能后再从被打断的位置继续,我提出的方案是将一行语句的五秒红灯拆分成五行一秒的红灯,在每一秒红灯后执行一次查询按键是否按下的功能,从而实现在查询到中断后实现中断模块功能后能继续将未执行完的红灯秒数执行完,绿灯部分同红灯部分代码实现方式相同。

在知识储备方面遇到的障碍可以说是第二大的。在一开始跟着老师学习一些具体的程序,还可以以老师的示例为基础增添一些自己的可以实现的想法。但是在逐渐深入的学习中,我逐渐体会到我有更多的想法却苦于现有知识储备无法实现的困扰。脱离了照范例模仿的阶段,我回归到探索未知领域本身,从查语法到翻数据手册,我逐步在这种真正的自主获取知识的途径中从步履蹒跚到游刃有余。我知道在每一段学习新知识的过程中,这都是必经之路。从一开始接触具体而鲜活的小小成果而产生兴趣,再依靠这种兴趣回归到知识本源的探索中。

四. 未来的计划和改进建议

本次交通灯的实现参考了学校校门口的红绿灯的设计思路,但还存在很多可以优化改进的地方,比如可以添加直行灯和转弯灯并在屏幕上显示的设计,振铃和亮灯做到同步进行,代码方面可以对冗长繁琐的红灯绿灯一秒一查询部分作出更有效的改进等。未来将在本次交通灯的基础上依以上想法进行优化,并尝试更多有趣实用的想法加以实现。

通过本次寒假练的学习,我有几个小建议。老师在示例中教得很好,既能调动同学的主动性又有趣生动,不过在理论的讲解中有点过于专业,对于刚接触的同学,很多的专业名词是属于那种老师以为大家肯定都知道但是其实并不知道的,这导致同学们在听理论部分的讲授时只能建立模糊或者错误的概念架构。

最后祝硬禾课堂越办越好,有越来越多的同学通过硬禾课堂喜欢并热爱自己的专业!

附件下载
trafficlight.py
主代码
board.py
bsp
button.py
bsp
团队介绍
周宇豪 北京理工大学
团队成员
一颗苦柠檬
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号