前言:
现时姐妹们对“交通灯单片机c语言”可能比较珍视,你们都需要分析一些“交通灯单片机c语言”的相关知识。那么小编在网络上汇集了一些关于“交通灯单片机c语言””的相关资讯,希望大家能喜欢,咱们一起来了解一下吧!人行道自助红绿灯在很多城市的街头都是比较常见的,常态下主路一直绿灯,人行道红灯。如果有行人要通过,动手按下红绿灯杆上的按键后,稍微等待一会,主路交通灯变黄再变红,人行道交通灯变绿闪烁,同时会有“嘟嘟”的声音提示行人通过。
今年9月份机器人三级考试的实操搭建题目“智能红绿灯”,其实就是人行道自助红绿灯,不过考题中还有一些细节,比如可以通过电位器调整行人通过时长,最后4秒人行道绿灯闪烁变快等。
大纲
————————————————
一、准备所需的电子模块
二、准备交通灯杆
三、导线连接
四、电子模块安装
五、编程与调试
六、运行效果
正文
————————————————
一、准备所需的电子模块
1、电位器(下图上排左一),用来调节人行道通过时长。
2、蜂鸣器(下图上排左二),发出嘟嘟的声音提示行人通过。
3、按键(下图上排左三),行人按键后人行道亮绿灯。
4、红黄绿交通灯(下图上排左四),机动车道交通灯。
5、独立小绿灯、红灯(下图上排右一、二),人行道交通灯。
6、导线,连接电子模块和控制器。
7、Arduino UNO控制器,由单片机(微控制器)、扩展引脚、电源接口三部分组成。
(1)下图Arduino UNO控制器中央黑色正方形模块是单片机,正面印有型号“MEGA328P”的字样,MEGA328P单片机主频为16MHz(16兆赫兹),闪存32K、主存2K、可擦写可编程的存储芯片(EEPROM)1K。
(2)控制器上侧一排黄色的引脚是数字引脚,编号为0~13,可以输出、输入数字信号。下侧一排蓝色的引脚为模拟引脚,编号为A0~A5,可以输入模拟信号。
二、准备交通灯杆
做了两根交通灯杆,一根准备装主路交通灯,一根准备装人行道红绿灯、蜂鸣器、行人按键。
三、导线连接
为了使用方便,Arduino UNO控制器为每个数字和模拟引脚独立配置了红色的5V(电源)引脚,黑色的GND(接地)引脚,这样电源(V)、接地(G)、信号(S)三个引脚一组,和导线接口完美对应。
1、黄色的数字引脚0~13,用来连接按键、红绿灯、蜂鸣器等电子模块。下图按键连接在了数字引脚3上。
2、交通灯有三个数字信号接口:G、Y、R,这三个都是数字信号接口,各自独立连接到三个数字引脚即可,GND随机连其中一个接地引脚。
3、蓝色的模拟引脚A0~A5,可以用来连接电位器模块,我们把电位器连接在了A4引脚上。
四、电子模块安装
导线连接好后,把所有的电子模块安装到交通灯杆上。一侧是人行道灯杆,上面集成了蜂鸣器、按键、红灯、绿灯;另一侧是主路交通灯杆,集成了交通灯(红黄绿)。
把主路交通灯、人行道交通灯、按键、蜂鸣器、电位器连接的引脚都记下来,编程的时候使用。
五、Mixly编程与调试
之前我写过一篇非常合适小白入手硬件编程的文章,从安装驱动和Mixly开发工具开始,到Mixly编程、编译、上传,直至调试完成,非常简洁的讲解了完整流程。所以这里就不再讲解了,需要阅读的话点击这个链接:机器人三级Ardunino硬件编程小白入门:灯光控制程序的开发与调试
1、声明引脚
(1)声明driverWayR、G、Y为主路红、绿、黄灯,对应数字引脚8、7、9。
(2)声明footWayR、G为人行道红、绿灯,对应数字引脚13、12。
(3)声明key、buzzer、peten为按键、蜂鸣器、电位器,分别对应数字引脚3、11和模拟引脚A4。
2、声明变量keyVal
keyVal用来接收按键模块输入的数字信号值(0、1),如果用户按下键,则接收到1,否则一直是0。
编译、上传验证一下是否可以接收到按键的信号。不按键,串口监视器打印0,把按键按下,串口监视器打印1(下图),说明控制器正确接收了按键模块的数字信号。
3、添加对keyVal的判断逻辑
如果行人按下键,keyVal接收到1,执行切换人行道绿灯通行指令,否则是主路正常通行指令。为了程序简洁,我添加了两个函数diverPass(主路通行)、footPass(人行道通行)。
在主程序里写一个判断逻辑,如果keyVal=1,则执行footPass(人行道通行)函数,否则执行diverPass(主路通行)函数。这样程序的主框架就完成了,剩下就是把两个函数填充完成。
4、diverPass(主路通行)函数
这个函数很简单,主路通行时,主路绿灯亮、人行道红灯亮,其它灯均灭。
数字引脚给灯模块输出高点平(1)灯亮;数字引脚给灯模块输出低电平(0)灯灭。
5、footPass(人行道通行)函数
这个函数比较复杂,我们逐步去实现。
(1)主路信号灯变红
行人按键后延时2秒,主路绿灯灭,黄灯亮;黄灯亮2秒后,黄灯灭,红灯亮。
(2)人行道红灯灭,绿灯亮
根据考试(2021年9月份3级实操)要求,人行道的绿灯不是长亮的,而是500ms的间隔闪烁;并且最后4秒以250ms的间隔快速闪烁。
我们用两个循环来实现考试要求。
第一个循环,从1~8,步长1,即循环8次,每次循环内绿灯一亮一灭各延时500ms,即每个循环的时长为1秒,循环8次,总时长8秒。
第二个循环,从1~8,步长1,即循环8次,每次循环内绿灯一亮一灭各延时250ms,即每个循环的时长为0.5秒,循环8次,总时长4秒。
绿灯总计闪烁12秒,即通行时长为12秒。
(3)让蜂鸣器响起来提醒行人
根据考试(2021年9月份3级实操)要求,蜂鸣器在最后4秒以250ms的间隔提醒路人。所以直接在最后4秒的循环里添加蜂鸣器(buzzer)数字输出。
这样蜂鸣器在最后4秒会以250ms的间隔鸣响。
6、好像还差点什么?
对了,考试(2021年9月份3级实操)还有一个特别的要求,用电位器控制行人通行时长在8~12秒之间。这个怎么实现呢?
(1)对电位器输入数值passTime的处理
电位器是一个模拟输入模块,之前已经声明为peten(应该是poten,英文错了,抱歉),接入的是A4引脚。现在需要再声明一个变量passTime接收电位器输入的数值。
电位器和按键都是输入模块,但按键是数字输入,输入的值为0或1;而电位器是模拟输入,输入的值为1~1023。也就是说电位器旋转到开始位置,那么passTime接收的值为1,旋转到底部,passTime接收的值为1023。
那么如何转换为8~12呢?
我们可以做一个映射,把1~1023映射为8~12。
最终的结果是:
电位器旋转到开始位置,那么passTime接收的值为1,映射后的值为8;
电位器旋转到底部位置,那么passTime接收的值为1023,映射后的值为12;
电位器旋转到其他位置,映射后的值可能为9、10、11。
(2)使用电位器输入数值passTime控制人行道通过时长
第一个绿灯闪烁循环里,把原来的1到8,改为1到passTime-4,为什么要减去4?
因为最后还有一个4秒的快速闪烁循环,而通过总时长是两个循环的累加,所以第一个循环时长要减去第二个循环的4秒。
比如电位器旋转到一个位置后,映射的时长为10秒,那么第一个循环的次数为10-4=6次,每个循环1秒,共计6秒,再加上第二个循环的总时长4秒,刚好是10秒,完成考试要求。
7、总览一下全部程序
(1)左侧是主程序,实现了声明变量、输入信号接收、按键判断。
(2)右侧是两个函数diverPass(主路通行)、footPass(人行道通行),实现交通灯的切换控制。
我在工作中有个习惯,就是先把主程序的框架做好,然后再一步步去补充细节,这个积木式编程虽然看起来简单,但是开发思路却是通用的。
六、运行效果
怎么和Ardunino控制器连接上传程序,以及串口如何配置,之前文章详细讲过了,这里不再重复了,复习点击这里机器人三级Ardunino硬件编程小白入门:灯光控制程序的开发与调试
下面是运行效果视频:
视频加载中...
后记
————————————————
北京刚结束这场2021年的首场大雪。早上开车去医院,小区门口的路因为施工有些坑洼,上面是不停飘落的厚厚的积雪,下面是冰冻的路面,一个陡坡没上去陷进了冰窝里,方向不受控制,只好缓缓倒下来,眼看着一辆4驱SUV咆哮着在坡上画了一个S型艰难的上去,然后消失在漫天的雪花中。我默默叹口气,返回小区,进到地库停好车,发现车窗外面还有一层硬硬的雪帘。
于是回家歇着吧,然后就有了今天这篇文章。
标签: #交通灯单片机c语言