arduino小火车交通灯

今天做了一个arduino小火车信号灯的程序,

5.6.7分别接了一个红绿蓝三盏灯,A0接了个光敏电阻一端测光敏电阻模拟量。

没有小火车经过时,绿灯亮。当小火车来的时候会遮挡光线,因此A0口检测到光敏电阻一端模拟量发生改变,

这个时候红灯亮,小火车通过以后,红灯延时亮1秒,黄灯亮3秒,之后绿灯亮。

当黄灯时,有小火车经过,则再次亮起红灯。之后一样

/*
 * A0-------analog signal input
 */


class Light{
  public:
    int led_red=5;
    int led_green=6;
    int led_yellow=7;            
    int led_red_delay=1000;            //小火车走之后红灯延时   
    int led_yellow_delay=3000;            //小火车走之后黄灯延时
    bool status_led=0;
    unsigned long led_red_lasttime;
    Light();
    void red_light(int state)
      {
        digitalWrite(led_red,state);
      }
      
    void green_light(int state)
      {
        digitalWrite(led_green,state);
      }
      
    void yellow_light(int state)
      {
        digitalWrite(led_yellow,state);
      }
};
//Light类的构造函数
Light::Light()
{
  pinMode(led_red,OUTPUT);
  pinMode(led_green,OUTPUT);
  pinMode(led_yellow,OUTPUT);
}

class Light_res{
  public:
    unsigned int last_num;                 //用于存储上次光敏电阻读取模拟值
    unsigned int now_num;
    unsigned int delay_j=20;               //检测周期,每个delay_j毫秒检测一次光敏值,判断是否有小火车
    unsigned long last_time_light;
    unsigned int thre=100;                 //判断阈值,如果两次检测差值大于阈值,则视为有小火车经过
    bool train_status=0;
    void init_light()
    {
      for(int i=0;i<=9;i++)
        {
          now_num+=analogRead(A0);
        }
        now_num=int(float(now_num)/10.0);
        last_num=now_num;
        last_time_light=millis();
    }
    void check(){
    if((millis()-last_time_light)>=delay_j)
       {
        for(int i=0;i<=9;i++)
        {
          now_num+=analogRead(A0);
        }
        now_num=int(float(now_num)/10.0);
        Serial.println(now_num);
        if((now_num<last_num)&&(last_num-now_num>thre))
          {
            last_num=now_num;
            last_time_light=millis();
            train_status=1;
          }
        else if((now_num>last_num)&&(now_num-last_num>thre))
        {
          last_num=now_num;
          last_time_light=millis();
          train_status=0;
        }
        last_time_light=millis();
       }
  }
};

Light mylight;
Light_res mylight_res;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println(mylight.led_red);
  mylight_res.init_light();
  Serial.println(mylight_res.now_num);
}

void loop() {
  // put your main code here, to run repeatedly:
   mylight_res.check();
   if(mylight_res.train_status)
   {
     Serial.println("hello");
     mylight.red_light(1);
     mylight.green_light(0);
     mylight.yellow_light(0);
     mylight.status_led=1;
     mylight.led_red_lasttime=millis();
   }
   else
   {
    if(mylight.status_led==1)
    {
      if((millis()-mylight.led_red_lasttime)<mylight.led_red_delay)
      {
        mylight.red_light(1);
        mylight.green_light(0);
        mylight.yellow_light(0);
      }
      else if((millis()-mylight.led_red_lasttime)<(mylight.led_red_delay+mylight.led_yellow_delay))
      {
        mylight.red_light(0);
        mylight.green_light(0);
        mylight.yellow_light(1);
      }
      else
      mylight.status_led=0;
    }
    else
    {
      mylight.red_light(0);
      mylight.green_light(1);
      mylight.yellow_light(0);
      mylight.status_led=0;
    }
   }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Allen953

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

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

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

打赏作者

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

抵扣说明:

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

余额充值