基于Arduino的双向交通灯系统

 

学  号        231        

姓  名       福福        

指导教师:赵志鹏

   --   7  2  

                                                     实训题目:交通灯系统

1   系统设计

    1.  设计要求
      1.  设计任务

   设计基于Arduino的双向交通灯系统,实现控制和方向显示功能

      1.  性能指标要求

1、基本要求

(1) 按照题目要求独立完成DF通灯状态(红、黄、绿)

     (3)每隔10秒钟切换一个方向,绿灯亮之前黄灯开始闪烁三次结束

     (4)通过点阵显示当前正在通行的方向

     (5)通过按键控制,调整通行时间

     (6)通过按键设置紧急状态(红灯全亮)

     

2、发挥部分

  1、设置人行道通行指示灯,并通过按键控制

2、紧急状态期间可通过蜂鸣器报警

3、设置倒计时时间

1.2 设计思路及设计框图

1.2.1设计思路

先设定点阵显示交通灯的通行方向,在面包板上做成DF通灯状态,接好剩下的按键和蜂鸣器。再设定灯的亮灭顺序(南北两个方向上的三盏灯根据要求显示亮灭),然后调用功能子函数实现按键控制通行时间和蜂鸣器紧急状态。

 1.2.2总体设计框图

2  各个模块程序的设计

1.对主函数编译调试,本次实训中主程序类似于流水灯的闪烁过程,然后进行面包板的连接和调试。通过USB将主程序烧进主控板,然后测试功能进行调试。

2.编写各个模块的程序,使用Arduino本身自带的模块功能以及库函数,程序编辑起来会有很提高。警报和控制时间那里由按键控制,如果按按键红灯会亮,并且蜂鸣器会响起,松开按钮返回循环;按第二个按键则调整通行时间。

图2-1程序流程图

4.关于程序的设计,主要关键部分:

1.点阵的数组定义:

#include<LedControl.h>//关于点阵的头文件

LedControl lc=LedControl(13,11,12,1);

强调声明点阵函数库,点阵就可以发挥作用。

2.点阵清屏:

  lc.shutdown(0,false);

  lc.setIntensity(0,3);

  lc.clearDisplay(0);

3.函数的声明:

int k1=0;
int k2=0;
int keypin1=10;
int keypin2=3;
int redpin = 4;
int yellowpin = 5;
int greenpin = 6;
int redpin2 = 7;
int yellowpin2 = 8;
int greenpin2 = 9;

void setup()
{
  lc.shutdown(0,false);
  lc.setIntensity(0,3);
  pinMode(keypin1,INPUT);
  pinMode(keypin2,INPUT);
  pinMode(redpin,OUTPUT);
  pinMode(yellowpin,OUTPUT);
  pinMode(greenpin,OUTPUT);
  pinMode(redpin2,OUTPUT);
  pinMode(yellowpin2,OUTPUT);
  pinMode(greenpin2,OUTPUT);
  }

3  调试过程

代码很长又麻烦,还有一些逻辑性的问题,解决一个问题所编写的程序代码较长,要检查和排除所有语法错误,调试过程要认真而专注。

测试是通过运行程序发现错误的过程,常见的错误有缺少程序大括号、结尾缺少分号、错误使用了中文符号、关键字错误、注释错误、库文件未加载、端口选择错误、串口被占用、驱动没有正确安装等等。调试则是确定测试中找到的错误性质并改正错误的过程。测试与调试通常交替进行,即测试——调试——再测试——再调试。

用尽可能少的测试数据发现更多的错误,选择合适的测试数据,使系统在运行时能执行到每条语句,以测试各指令是否正确。测试输入合法数据与非法数据时,程序的运行情况。对于合法数据,还要考虑数据的一般性与特殊性。

测试可按模块测试、组装测试和确认测试的步骤进行。

1.模块测试就是分别对各模块进行测试的过程。在编写一个模块后应立即对其进行测试,因为这时对模块记忆深刻,而且单个模块相对较小,所以容易构造测试数据,能方便地检查和改正错误。

2.组装测试就是把所有模块(应该是通过模块测试的模块)按预先制定的计划逐步组装和测试的过程。一般情况下,各模块之间要相互传递数据和控制信息,因此组装测试的主要任务是发现模块接口中的错误。

3.确认测试是最后一个步骤,一般在将软件交付用户之前,应确认软件是否确实满足用户的要求,通常使用接近实际的用例进行测试。

测试程序时,用Arduino程序的模块化可以随时查看变量或表达式的值,有时还可以将部分程序代码用模块直接修改,提高自己代码的正确性,以便压缩出错代码的范围。

4  功能测试

4.1 测试仪器与设备

用面包线把Arduino与面包板上的Led灯和点阵连接起来,通电之后查看各小灯和点阵亮灭情况,在电路连接正确的前提下灯亮,不亮则重新调试。将主程序烧录进开发版,测试主程序的运行情况,图片中灯亮表明运行情况良好,灯亮的同时点阵开始运行。

                        

          

4.2 性能指标测试

该实验实现了交通灯的通灯状态(红、黄、绿),和每隔10秒钟切换一个方向,绿灯亮之前黄灯开始闪烁三次结束以及通过点阵显示当前正在通行的方向。通过子程序实现两个按键的控制功能,被调用函数开始循环,按键起控制作用。可蜂鸣器响而不受控制,按键紧急状态时全部灯都灭了,可能因为模块中语句循序有错误,也可能句法不全。具备了部分交通灯功能。

4.3 误差分析

5  实训心得体会

Arduino实验是开学之后才进行的,即使学了C语言也只是皮毛,注定了这次的实训不会很轻松。这次实训设计基于Arduino的双向交通灯系统,实现控制和方向显示功能,为了让我们巩固这学期所学的C语言程序设计的课本内容和Arduino实验开设的课程,拿到交通灯题目后看着就觉得好难,回来开始编写代码接电路时才发现才发现自己不会的的问题比想象的多。

本次实训主要运用Arduino开发版、8*8点阵、面包板, 把C语言的理论知识以及实际操作过程结合起来而成。这是我第一次做,自身经验不足、不够细心在操作时出现了许多问题,主要是不会。我发现自己对一些前面学过的知识还不够理解,没能好好的掌握。

本次实训,其实接电路并不怎么难,最难的是编写代码,真的好无从下手只能通过上网查资料书籍,然后又问同学,通过对比他们的设计过程,觉得书籍上的模块化设计思想省时而不易出错。我还尝试用Arduino图形化编程练过,觉得那个也不错,都不用自己写程序。后来我发现我自己的不足地方,逐渐地改变自己的设计思路,在面包板上将开发板、点阵、led、按键、蜂鸣器通过面包线连接起来,首先设定点阵的方向再编译南北方向的led灯再到两个按键控制的程序,顺着思路编写好代码。当程序烧录进去灯亮起的那一刻,我心理感到无比激动与自豪,心里非常的高兴。

通过本次实训,我更加深了对Arduino程序和c程序的理解,学会了在面包板的使用方法。即使这次实训不能完整的做出来,但我感觉到收获好大,这过程我遇到了好多不同的问题,暴露了我不足的知识点,经过自己的思考和动手操作,终化成为属于我自己的东西。曾认为很难的实训,现在也做好了,在今后的学习生活中一定要不懈努力不能遇到困难就退缩,要找出问题所在然后一一解决。在日后,自己所学的理论知识要和实践结合起来,提高自己的实际动手能力和独立思考能力。

6  参考文献

  1. 《C程序设计》/谭浩强著-清华大学出版社,2019.12
  2. Arduino程序设计基础(第二版)/陈吕洲主编-北京航空航天大学出版社,2015.3

附录

附录1:仿真波形图(部分模块)

附录2:程序清单

#include"LedControl.h"
LedControl lc=LedControl(13,11,12,1);
byte d[8]={
B00001000,
B00000100,
B00000010,
B11111111,
B11111111,
B00000010,
B00000100,
B00001000,};
byte h[8]={
B00010000,
B00100000,
B01000000,
B11111111,
B11111111,
B01000000,
B00100000,
B00010000,};
int k1=0;
int k2=0;
int keypin1=10;
int keypin2=3;
int redpin = 4;
int yellowpin = 5;
int greenpin = 6;
int redpin2 = 7;
int yellowpin2 = 8;
int greenpin2 = 9;

void setup()
{
  lc.shutdown(0,false);
  lc.setIntensity(0,3);

lc.clearDisplay(0);
  pinMode(keypin1,INPUT);
  pinMode(keypin2,INPUT);
  pinMode(redpin,OUTPUT);
  pinMode(yellowpin,OUTPUT);
  pinMode(greenpin,OUTPUT);
  pinMode(redpin2,OUTPUT);
  pinMode(yellowpin2,OUTPUT);
  pinMode(greenpin2,OUTPUT);
  }
  void loop()
  {
    k2=digitalRead(keypin2);
  if(k2==LOW)
  {
    k1=digitalRead(keypin1);
      if(k1==LOW)
      {
        lc.clearDisplay(0);
        for(int row=0;row<8;row++)
        lc.setRow(0,row,h[row]);
      digitalWrite(redpin,HIGH);

 digitalWrite(greenpin2,HIGH);
    delay(7000);
      digitalWrite(redpin,LOW);
      digitalWrite(yellowpin,HIGH);
    delay(500);
      digitalWrite(yellowpin,LOW);
    delay(500);
      digitalWrite(yellowpin,HIGH);
    delay(500);
     digitalWrite(yellowpin,LOW);
    delay(500);
     digitalWrite(yellowpin,HIGH);
    delay(500);
     digitalWrite(yellowpin,LOW);
    delay(500);
        lc.clearDisplay(0);
        for(int row=0;row<8;row++)
        lc.setRow(0,row,d[row]);   
      digitalWrite(greenpin2,LOW);
      digitalWrite(greenpin,HIGH);
      digitalWrite(redpin,LOW);
      digitalWrite(redpin2,HIGH);
      digitalWrite(yellowpin,LOW);
    delay(7000);
      digitalWrite(redpin2,LOW);
     digitalWrite(yellowpin2,HIGH);
    delay(500);
      digitalWrite(yellowpin2,LOW);
    delay(500);
      digitalWrite(yellowpin2,HIGH);
    delay(500);
     digitalWrite(yellowpin2,LOW);
    delay(500);
     digitalWrite(yellowpin2,HIGH);
    delay(500);
     digitalWrite(yellowpin2,LOW);
    delay(500); 
      digitalWrite(yellowpin2,LOW); 
      digitalWrite(greenpin,LOW);
      }
 else if(k1==HIGH)
       {
        lc.clearDisplay(0);
        for(int row=0;row<8;row++)
        lc.setRow(0,row,h[row]);
      digitalWrite(redpin,HIGH); digitalWrite(greenpin2,HIGH);
    delay(15000);
      digitalWrite(redpin,LOW);
      digitalWrite(yellowpin,HIGH);
    delay(500);
      digitalWrite(yellowpin,LOW);
    delay(500);
      digitalWrite(yellowpin,HIGH);
    delay(500);
     digitalWrite(yellowpin,LOW);
    delay(500);
     digitalWrite(yellowpin,HIGH);
    delay(500);
     digitalWrite(yellowpin,LOW);
    delay(500);
        lc.clearDisplay(0);
        for(int row=0;row<8;row++)
        lc.setRow(0,row,d[row]);   
      digitalWrite(greenpin2,LOW);
      digitalWrite(greenpin,HIGH);
      digitalWrite(redpin,LOW);
      digitalWrite(redpin2,HIGH);
      digitalWrite(yellowpin,LOW);
    delay(15000);
      digitalWrite(redpin2,LOW);
     digitalWrite(yellowpin2,HIGH);
    delay(500);
      digitalWrite(yellowpin2,LOW);
    delay(500);
      digitalWrite(yellowpin2,HIGH);
    delay(500);
     digitalWrite(yellowpin2,LOW);
    delay(500);
     digitalWrite(yellowpin2,HIGH);
    delay(500);
     digitalWrite(yellowpin2,LOW);
    delay(500); 
      digitalWrite(yellowpin2,LOW); 
      digitalWrite(greenpin,LOW);
     }
      }
     else if(k2==HIGH)
     
       digitalWrite(redpin,HIGH);
       digitalWrite(redpin2,HIGH);
       delay(5000);
        digitalWrite(redpin,LOW);
       digitalWrite(redpin2,LOW);
     
    
   
    }



  • 18
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
这个简单的小项目使用Arduino和一些LED复制交通信号。它使用代码作为内部计时器,并继续运行,直到您切断Arduino的电源为止。 好的。 材料如下: 1. Arduino / Genuino / Geekcreit 2.面包板 3.跳线 男对男 4.红色,黄色和绿色LED 5. Arduino USB 2.0电缆 好的。让我们开始吧? 步骤1:为面包板供电 是的,我知道只有一根电线,通常只有两根,但是请相信我:完全按照您的观察方式进行操作。我已经一遍又一遍地修改了这篇文章,这是完全正确的。 将跳线的一侧插入板上的GND 。将另一侧引至面包板。将其放在顶部面包板的最右列。这是接地柱。一路向右。如果您不了解,请看一下示意图。 第二步:添加指示 取出您的LED和电阻。将电阻器的一端放在右边一栏中,这是我们将跨接线连接到的同一列。将面包板的另一端延伸到面包板的主要部分。将电阻器连接到所需的任何行。我们的LED将排在同一行。我们将LED的一端粘在试验板的一侧,另一端粘在试验板的另一侧。LED的短路端将位于电阻器所在的一侧,即右侧。将LED的另一端延伸到面包板的右侧。(如果未正确放置LED,则该项目将无法正常工作。) 第三步:完成电路 好的。这是最后一部分。拿另一根跳线,将其放在装有LED的同一行上。这是电线的所在位置: 绿色LED:端口2,数字PWM部分 黄色LED,端口3,数字PWM部分 红色LED,端口4,数字PWM部分 如果您不明白,请检查原理图是否参考图片。 现在,上传您的代码,您就完成了!
本设计是关于单片机控制的交通模拟系统的设计。主要内容有交通模拟系统设计方案,主要功能,各功能模块的介绍,电路设计,硬件部分设计,软件部分设计,模拟系统的仿真调试,设计方法以及课程设计的心得体会等等。 该设计中用光二极管来模拟信号,紧急车的优先通过请求信号由外部中断技术来模拟。根据交通系统所需要实现的功能要求,先画出中断程序部分的流程图和主程序流程图,然后根据流程图写出其子程序。从而通过模拟系统的仿真来实现该设计所要求的功能。 本系统由单片机系统、键盘、LED 显示、交通演示系统组成。最后,系统要求实现如下的交通的功能: 1、南北方向(主干道)车道和东西方向(支干道)车道两条交叉道路上的车辆交替运行,主干道每次通行时间都设为30秒、支干道每次通行时间为20秒,时间可设置修改;    2、在绿转为红时,要求黄先亮5秒钟,才能变换运行车道;    3、黄亮时,要求每秒闪亮一次。    4、东西方向、南北方向车道除了有红、黄、绿指示外,每一种亮的时间都用显示器进行显示(采用计时的方法)。    5、一道有车而另一道无车(实验时用开关 K0 和 K1 控制),交通控制系统能立即让有车道放行。 6、有紧急车辆要求通过时,系统要能禁止普通车辆通行,A、B道均为红,紧急车由K2 开关模拟。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乾行lovemn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值