1实现目标:
通常情况下,机动车道绿灯常亮,行人通道红灯常亮;当行人按下按钮后,机动车道的灯由绿变黄再变红,行人通道的灯由红变绿;一段时间后,行人通道绿灯频闪提醒;频闪结束,行人通道绿灯变红灯,机动车道红灯变绿灯,再变黄灯。行人两次有效按下按钮的时间控制为大于10秒,每一个时期LCD屏将作为补充提醒,显示行人和机动车的通行状态。同时蜂鸣器会在行人按下按钮和机动车再次行驶时发出提醒。
2代码部分:
#include <LiquidCrystal.h>
const int rs=12,en=11,d4=5,d5=4,d6=3,d7=2;
LiquidCrystal lcd(rs,en,d4,d5,d6,d7);
int NorthSouthR=A5;
int NorthSouthG=8;
int NorthSouthY=6;
int PeoEastWestR=A3;
int PeoEastWestG=A4;
int button = 1;
int peocrosstime = 10000;//两次按下按钮至少间隔的时间
int soundPin = 9;
unsigned long switchtime;
void setup()
{
pinMode(NorthSouthY, OUTPUT);
pinMode(NorthSouthG, OUTPUT);
pinMode(NorthSouthY, OUTPUT);
pinMode(PeoEastWestR, OUTPUT);
pinMode(PeoEastWestG, OUTPUT);
pinMode(soundPin,OUTPUT);
pinMode(button,INPUT);
digitalWrite(NorthSouthG,HIGH);//初始状态
digitalWrite(PeoEastWestR,HIGH);
lcd.begin(16,2);
lcd.print("car go!");
}
void loop() //按钮检测
{
int flag = digitalRead(button);
if(flag == HIGH && (millis()-switchtime)>10000)
{
peoplego();
}
}
void peoplego()//改变交通灯的函数
{
digitalWrite(soundPin,HIGH);
delay(500);
digitalWrite(soundPin,LOW);
lcd.clear();
lcd.begin(16,2);
lcd.print("people coming!");
lcd.display();
digitalWrite( NorthSouthG,LOW);
for(int i=0;i<3;i++)
{
digitalWrite( NorthSouthY,HIGH);
delay(500);
digitalWrite( NorthSouthY,LOW);
delay(500);
}
digitalWrite(NorthSouthR,HIGH);
delay(1000);
digitalWrite(PeoEastWestR,LOW);
digitalWrite(PeoEastWestG,HIGH);
delay(peocrosstime);
lcd.clear();
lcd.begin(16,2);
lcd.print("please quickly!");
for(int j=0;j<5;j++)
{
digitalWrite( PeoEastWestG,HIGH);
delay(500);
digitalWrite( PeoEastWestG,LOW);
delay(500);
}
lcd.clear();
digitalWrite(PeoEastWestR,HIGH);
delay(2000);
digitalWrite(NorthSouthY,HIGH);
digitalWrite(NorthSouthR,LOW);
lcd.clear();
lcd.begin(16,2);
lcd.print("car time again!");
delay(3000);
digitalWrite(NorthSouthG,HIGH);
digitalWrite(NorthSouthY,LOW);
switchtime = millis();
digitalWrite(soundPin,HIGH);
delay(500);
digitalWrite(soundPin,LOW);
lcd.clear();
lcd.begin(16,2);
lcd.print("car go!");
}
3实物连接图:
仅供参考