0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用树莓派控制交通红绿灯(简洁版)

CHANBAEK 来源:和娃一起玩树莓派 作者:老孟K 2023-07-02 15:08 次阅读

前面我们通过控制LED灯和读取按钮状态,简单演示了树莓派如何通过GPIO来与外部世界沟通。今天我们要用树莓派模拟一个控制交通的红绿灯,让大家进一步学习如何通过程序和计算机的I/O来解决实际问题。

今天要做的红绿灯是简洁版,我们今后还会讲它的进阶版(高级版)。简洁版的红绿灯有一个开关控制按钮和红黄绿三色交通控制灯。当程序启动时,只有黄灯处于闪烁状态,提醒来往车辆注意其他路口的车辆,当第一次按下按钮后,则进入红绿灯交替开关的状态,和大家日常在路口看到的类似,再次按下按钮,则重新恢复到黄灯闪烁状态。这是大部分路口自动控制红绿灯的逻辑。(如果大家不明白红绿灯相关的交规,可以咨询父母或者上网搜索,这里不说了)。

需要的元器件

本次的红绿灯需要如下的元器件

  • 开关按钮一个
  • 跳线若干,元器件连接方式不同,需要的跳线数不同,约6-10个。
  • 发光二极管(LED)三个,如果没有红黄绿三色,可以用同色LED,用LED位置表示红黄绿。
  • 1K欧姆的电阻三个
  • 面包板(可选)
  • 树莓派GPIO扩展组件(可选)

红绿灯电路

在前面控制发光二极管时,我们知道发光二极管需要连接一个1K欧姆的电阻来起到限制电流的保护作用。所以电路如下图。

图片

从电路可以看到,控制按钮连接了GPIO17,红色LED连接了GPIO26,黄色LED连接了GPIO5,绿色LED连接了GPIO27。

最终的元器件连接如下图:

图片

Python控制程序

在我们实际进行电路或程序设计时,一般都会采取循序渐进的方式,先从简单的设计开始,然后一步一步加入更复杂的逻辑,直到最终实现我们需要的效果。这在电路或程序较复杂时尤其重要。

首先,我们需要确保电路连接都是正确的,有一个简单的验证方法,在前面的发光二极管控制一讲也提到过,就是在发光二极管连接到GPIO之前,先直接连接GPIO的第一引脚,也就是3.3V的电源,此时LED会亮,则说明连接正确无误。

其次,我们要确保各器件连接了正确的GPIO引脚,因为有些GPIO引脚紧挨着(如GPIO17,27,22),如果连接错了,也是没法成功控制电路的。按我的电路,先用下面的程序运行一下看,3个LED都应该亮1秒,灭1秒,同时按钮按下超过1秒,可以看到打印输出Pressed。

from gpiozero import LED


from time import sleep


red = LED(26)  #红灯链接了GPIO26
yellow= LED(5)   #黄灯链接了GPIO5
green = LED(22)  #绿灯连接了GPIO22
control = Button(17) #按钮连接了GPIO17
while True:
    red.on()
    yellow.on()
    green.on()
    if control.is_pressed:
        print("Pressed")   #保持按钮按下超过1秒,可以看到打印输出
    sleep(1)
    #先让LED亮1秒
    red.off()
    yellow.off()
    green.off()
    sleep(1)
    #再让LED灭1秒

接下来我们加入更多的逻辑。只让黄灯闪烁,还是红绿灯交替控制,需要有一个变量来进行判断,因为非此即彼,所以可以把这个变量设置为布尔型(True或False),我们把它命名为kaiguan。代码先改为如下:

from gpiozero import LED,Button


from time import sleep


kaiguan = False   #控制变量默认设置为False,此时黄灯闪烁


red = LED(26)  #红灯链接了GPIO26
yellow= LED(5)   #黄灯链接了GPIO5
green = LED(22)  #绿灯连接了GPIO22
control = Button(17) #按钮连接了GPIO17
while True:
    if kaiguan == False:   #当kaiguan变量为False时,黄灯闪烁
        yellow.on()
        sleep(0.5)
        yellow.off()
        sleep(0.5)
    else:
        red.on()
        yellow.on()
        green.on()
        if control.is_pressed:
            print("Pressed")
        sleep(1)
        red.off()
        yellow.off()
        green.off()


        sleep(1)

运行上面的程序,可以看到黄灯闪烁,按按钮没有任何效果,因为else部分的代码永远执行不到。

接着我们加入按钮是否按下的判断逻辑,代码改为:

from gpiozero import LED,Button


from time import sleep


kaiguan = False   


red = LED(26)  #红灯链接了GPIO26
yellow= LED(5)   #黄灯链接了GPIO5
green = LED(22)  #绿灯连接了GPIO22
control = Button(17) #按钮连接了GPIO17
while True:
    if kaiguan == False:   #当kaiguan变量为False时,黄灯闪烁
        yellow.on()
        sleep(0.5)
        yellow.off()
        sleep(0.5)
    else:             #当kaiguan变量为True时,和原来逻辑一样
        red.on()
        yellow.on()
        green.on()

        sleep(1)
        red.off()
        yellow.off()
        green.off()


        sleep(1)
    if control.is_pressed:  #判断按钮是否被按下
            print("Pressed")
            kaiguan = bool(1-kaiguan)    #取反。

运行上面的程序,可以看到,一开始只有黄灯闪烁,当我们按下按钮时(保持按下状态直到看到Pressed被打印出来),会变成所有灯亮1秒灭1秒,再次按按钮,又会变成黄灯闪烁,如此反复。

现在看来,我们需要修改else部分的逻辑,使它实现绿灯亮3秒,然后熄灭,同时黄灯亮1秒,然后熄灭,同时红灯亮,3秒后红灯熄灭,绿灯亮,如此反复。大家也可以按自己喜好调整红绿灯的时间。最新的代码如下:

from gpiozero import LED,Button


from time import sleep


kaiguan = False   


red = LED(26)  #红灯链接了GPIO26
yellow= LED(5)   #黄灯链接了GPIO5
green = LED(22)  #绿灯连接了GPIO22
control = Button(17) #按钮连接了GPIO17
while True:
    if kaiguan == False:   #当kaiguan变量为False时,黄灯闪烁
        yellow.on()
        sleep(0.5)
        yellow.off()
        sleep(0.5)
    else:          #当kaiguan变量为True时
        green.on()   
        sleep(3)    #绿灯亮3green.off()
        yellow.on()  #黄灯亮1sleep(1)
        yellow.off()
        red.on()     #红灯亮3sleep(3)
        red.off()
    if control.is_pressed:  ##判断按钮是否被按下
            print("Pressed")
            kaiguan = bool(1-kaiguan)

上面代码中 bool(1-kaiguan)可以实现取反的效果,也就是当kaiguan现在是True时,运算后会被改为False,如果kaiguan现在是False,则会被改为True。

运行上面的代码基本可以实现我们需要的逻辑,但是存在以下不足:

按钮不是按下后就会触发改变,而是需要多按一会,尤其是在红绿灯交替亮灭时,需要多按一会,直到屏幕输出Pressed后才会变化为黄灯闪烁。这是因为在红绿灯交替亮灭时,约7秒的时间没有检测按钮是否按下,只有这7秒的程序执行完毕后才能进入按钮检测部分的代码,可以在红灯亮了后再按,会减少按下的时间。

大家可以看看我的红绿灯电路运行起来的样子。

如何才能让按钮更灵敏,同时加入更高级的控制逻辑呢?下一次我们将在红绿灯高阶版进行介绍。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 元器件
    +关注

    关注

    111

    文章

    4529

    浏览量

    88778
  • led灯
    +关注

    关注

    22

    文章

    1554

    浏览量

    107035
  • GPIO
    +关注

    关注

    16

    文章

    1137

    浏览量

    50596
  • 树莓派
    +关注

    关注

    113

    文章

    1640

    浏览量

    104755
收藏 人收藏

    评论

    相关推荐

    红绿灯控制系统的LED城市路灯方案

    将LED路灯装置与交通红绿灯控制系统结合在一起,利用每一路段红绿灯的转换实现对下一路段灯光强弱的控制。将当前市场上 LED 集灯板上的LED灯分为两组,在满足不同时段照明要求前
    发表于 10-17 14:44 3511次阅读

    PLC实现交通红绿灯控制方法及原理

    PLC实现交通红绿灯控制电路熟悉PLC编程原理及方法。掌握定时器使用方法。
    发表于 03-19 15:15

    交通红绿灯带仿真和程序

    交通红绿灯带仿真和程序
    发表于 03-29 10:53

    交通红绿灯

    本帖最后由 samuergao 于 2014-7-3 14:13 编辑 交通灯,并显示当前时间和倒计时,包含了单条路遇到人行道的红绿灯,还有十字路口的红绿灯,大家帮看看有的改进没有。
    发表于 07-03 12:12

    如何去实现一种交通红绿灯设计

    1、功能描述观察十字路口红绿灯工作流程,设计交通灯。1、初始时:南北向、东西向直行左转均为红灯2、南北向直行:①南北向直行绿灯亮,延时若干秒②启动南北向左转数码管显示:倒计时6秒;同时南北向直行
    发表于 11-09 09:21

    基于单片机的交通红绿灯控制系统的设计

    前一段时间,做了一个关于基于单片机的交通红绿灯控制系统的设计
    发表于 11-10 06:34

    交通红绿灯PLC控制系统编程方法与技巧

    本文介绍了交通红绿灯基本控制形式,针对带绿闪的红绿灯和带数显的红绿控制和实现方法,详细论述了相应的编程方法和技巧。实验证明编制的程序运行可靠
    发表于 08-14 10:31 152次下载

    基于可编程控制交通红绿灯模拟系统设计

    本文在综合分析了8255A 及8253 芯片的特点之后,运用二者的特性,进行了交通红绿灯模拟系统设计,在详细阐述了设计思想及电路设计方案之后,对该系统的有效性测试表明了该交通红
    发表于 05-18 11:03 199次下载
    基于可编程<b class='flag-5'>控制</b>的<b class='flag-5'>交通红绿灯</b>模拟系统设计

    基于自定义时钟脉冲的交通红绿灯控制设计

    以三菱FX2N型PLC作为控制核心元件,阐明交通红绿灯控制设计思路和控制方案。以PLC定时器构成的自定义时钟脉冲程序段作为程序基本单元设计的交通红
    发表于 06-19 11:42 5897次阅读
    基于自定义时钟脉冲的<b class='flag-5'>交通红绿灯</b><b class='flag-5'>控制</b>设计

    EDA设计应用之红绿灯交通控制器设计

    红绿灯交通控制器EDA设计
    发表于 01-22 16:28 51次下载

    将VR技术应用于交通红绿灯

    大家都知道,不管是行人还是汽车,在过路口的时候,一般都会有红绿灯的存在,如果没有红绿灯的话,那整个交通都会混乱,交通事故绝对是层出不穷,而且堵车也会堵得水泄不通,所以
    发表于 12-22 09:38 3679次阅读

    使用树莓控制红绿灯的源代码免费下载

    本文档的主要内容详细介绍的是使用树莓控制红绿灯的源代码免费下载。
    发表于 10-28 17:11 9次下载
    使用<b class='flag-5'>树莓</b>派<b class='flag-5'>控制</b><b class='flag-5'>红绿灯</b>的源代码免费下载

    基于8255A和8253芯片实现交通红绿灯模拟系统的应用方案

    本文在综合分析了8255A 及8253 芯片的特点之后,运用二者的特性,进行了交通红绿灯模拟系统设计,在详细阐述了设计思想及电路设计方案之后,对该系统的有效性测试表明了该交通红绿灯模拟系统具有较为
    的头像 发表于 03-23 14:47 4557次阅读

    中文编程鸿蒙Hi3861开发基础案例之-03交通红绿灯

    中文编程鸿蒙Hi3861开发模拟交通红绿灯亮与灭控制
    的头像 发表于 05-11 11:27 1422次阅读
    中文编程鸿蒙Hi3861开发基础案例之-03<b class='flag-5'>交通红绿灯</b>

    树莓控制交通红绿灯(进阶版)

    哇奥,今天才发现上一次建造的红绿灯居然不对,绿灯一般在下方,当红灯变绿灯时黄灯闪烁,我做的是绿灯变红灯时黄灯闪烁!。这在我们开发时也会碰到,就像找bug一样,对于发现的问题要及时修正。
    的头像 发表于 07-02 15:10 1040次阅读
    用<b class='flag-5'>树莓</b>派<b class='flag-5'>控制</b><b class='flag-5'>交通红绿灯</b>(进阶版)