找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2761|回复: 0
打印 上一主题 下一主题
收起左侧

Arduino超声波控制主次道路红绿灯设计 含源码

[复制链接]
跳转到指定楼层
楼主
ID:507496 发表于 2019-4-9 00:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近设计了一个超声波控制主次道路红绿灯而我自己是初次接触arduino,于是可能有些小问题。
自己原创想的,如有问题欢迎指教

float cm;
float duration;
int red1 =10;                         //定义针脚号
int green1 =9;
int yellow1=7;
int red2 =6;
int green2 =5;
int yellow2=4;
#define Trig 2                          // Trigger Pin and Echo Pin of UltrasonicSensor
#define Echo 3
int ledgreen1State= HIGH;              //定义绿灯1和红灯2为点亮状态
int ledred2State= HIGH;
unsigned long previousMillis= 0;        
const long interval = 1000;             //定义常量表示固定的时间间隔,为1

void setup()
{
Serial.begin(9600);                //Starting Serial Terminal
pinMode(Trig, OUTPUT);           //Trig引脚设置为输出
pinMode(Echo, INPUT);            //Echo引脚设置为输入
pinMode(red1,OUTPUT);           //设置LED针脚类型为状态输出针脚。
pinMode(green1,OUTPUT);
pinMode(yellow1,OUTPUT);
pinMode(red2,OUTPUT);
pinMode(green2,OUTPUT);
pinMode(yellow2,OUTPUT);
}
void loop()
{
digitalWrite(red1, LOW);           //主道路的绿灯一直亮,副道路的红灯一直亮。
digitalWrite(green1, HIGH);
digitalWrite(yellow1, LOW);
digitalWrite(red2, HIGH);
digitalWrite(green2, LOW);
digitalWrite(yellow2, LOW);

digitalWrite(Trig, LOW);              //发送一个短的低电平脉冲,以确保得到一个平静//的高脉冲
delayMicroseconds(2);
digitalWrite(Trig, HIGH);             //发送一个10us的高脉冲来触发传感器
delayMicroseconds(10);
digitalWrite(Trig, LOW);
  duration=float(pulseIn(Echo, HIGH));   //读取从发送信号到接收回波的时间
  cm= (duration/2)/29.1;              //距离=(传播时间/2*声速,声速=1/29.1cm/us
Serial.print("Distance =");             //在串口监视器中打出字符串“Distance=”,cm和//“cm”并换行
Serial.print(cm);
Serial.println("cm");
delay(100);

  if(cm>=100)
  {
   return;
  }

  if(66<=cm && cm<100)
  {
    digitalWrite(red1, LOW);
    digitalWrite(yellow1, LOW);
    digitalWrite(green2, LOW);
    digitalWrite(yellow2, LOW);
    unsigned long currentMillis = millis();           //记录程序执行到此处的时间;
     if(currentMillis-previousMillis>= interval)       //如果大于等于internal数值,则执行//内部操作
                                              //否则进入下一次loop操作
    {
       previousMillis = currentMillis;              //更新previousMillis变量数值
       if(ledgreen1State==HIGH and ledred2State==HIGH)       //如果灯为亮的,变为暗的。//如果灯为灭的,变为亮的。
       {
         ledgreen1State=LOW;
         ledred2State=LOW;
       }
       else
       {
         ledgreen1State=HIGH;
         ledred2State=HIGH;
       }
       digitalWrite(green1,ledgreen1State);        //将LED状态变量的更改结果发送//LED灯元器件。
       digitalWrite(red2,ledred2State);
    }
  }
else if (33<=cm && cm<66)
  {
   digitalWrite(red1, LOW);
   digitalWrite(green1, LOW);
   digitalWrite(yellow1, HIGH);
   digitalWrite(red2, LOW);
   digitalWrite(green2, LOW);
   digitalWrite(yellow1, HIGH);
  }
else if (cm<33)
  {
   digitalWrite(green1, LOW);
digitalWrite(yellow1,LOW);
digitalWrite(red1,HIGH);
   digitalWrite(red2, LOW);
   digitalWrite(green2, HIGH);
   digitalWrite(yellow2, LOW);  
}  
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表