今天做了一个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;
}
}
}