Hello, i m programming a traffic light and i need some help.
I want my yellow traffic light to blink after button click until the button gets clicked again.
Version - Start blink by buttonclick for 10 seconds and stop afterwards.
This version works, but its not the way i want it to be.
int carred = 8, caryellow = 9, cargreen = 10, pedred = 12, pedgreen = 13, pedbutton = 4, nightbutton = 5;
const int buzzer = 3;
void setup()
{
//LED init
pinMode(carred, OUTPUT);
pinMode(caryellow, OUTPUT);
pinMode(cargreen, OUTPUT);
pinMode(pedred, OUTPUT);
pinMode(pedgreen, OUTPUT);
//Button init
pinMode(pedbutton, INPUT);
//Buzzer init
pinMode(buzzer, OUTPUT);
//LED default
//(car=green;pet=red)
digitalWrite(carred, LOW);
digitalWrite(caryellow, LOW);
digitalWrite(cargreen, HIGH);
digitalWrite(pedred, HIGH);
digitalWrite(pedgreen, LOW);
}
//Buzzer Sound when Ped is green and car red
void Pedgreentone(){
int i;
for(i=0;i<10;i++){
tone(buzzer, 1000);
delay(500);
noTone(buzzer);
delay(500);
}
}
void loop()
{
int i;
//Night-Button = 1 (on_click)
if(digitalRead(nightbutton) == HIGH)
{
delay(2000);
digitalWrite(carred, LOW);
digitalWrite(cargreen, LOW);
digitalWrite(pedred, LOW);
digitalWrite(pedgreen, LOW);
//Yellow light blink
for(i=0;i<10;i++){
digitalWrite(caryellow, HIGH);
delay(1000);
digitalWrite(caryellow, LOW);
delay(1000);
}
}
//Ped-Button = 1 (on_click)
if(digitalRead(pedbutton) == HIGH)
{
//(car=yellow;pet=red)
delay(5000);
digitalWrite(caryellow, HIGH);
digitalWrite(cargreen, LOW);
//(car=red;pet=red)
delay(2000);
digitalWrite(caryellow, LOW);
digitalWrite(carred, HIGH);
//(car=red;pet=green)
delay(2000);
digitalWrite(pedgreen, HIGH);
digitalWrite(pedred, LOW);
Pedgreentone();
//(car=red;pet=red)
digitalWrite(pedgreen, LOW);
digitalWrite(pedred, HIGH);
//(car=red+yellow;pet=red)
delay(2000);
digitalWrite(caryellow, HIGH);
//(car=green;pet=red)
delay(2000);
digitalWrite(carred, LOW);
digitalWrite(caryellow, LOW);
digitalWrite(cargreen, HIGH);
}
//Ped-Button = 0
else
{
digitalWrite(pedred, HIGH);
digitalWrite(pedgreen, LOW);
digitalWrite(carred, LOW);
digitalWrite(caryellow, LOW);
digitalWrite(cargreen, HIGH);
}
}
Version - Start blink by buttonclick, ask for another buttonclick and stop afterwards.
This version doesn´t work. The problem is the delay(); the button clicks cant be read anymore. I tried to fix this with interupt already but i m not able to get it working. This is the way i need it to be.
int carred = 8, caryellow = 9, cargreen = 10, pedred = 12, pedgreen = 13, pedbutton = 4, nightbutton = 5, nightstatus = 0;
const int buzzer = 3;
void setup()
{
//LED init
pinMode(carred, OUTPUT);
pinMode(caryellow, OUTPUT);
pinMode(cargreen, OUTPUT);
pinMode(pedred, OUTPUT);
pinMode(pedgreen, OUTPUT);
//Button init
pinMode(pedbutton, INPUT);
//Buzzer init
pinMode(buzzer, OUTPUT);
//LED default
//(car=green;pet=red)
digitalWrite(carred, LOW);
digitalWrite(caryellow, LOW);
digitalWrite(cargreen, HIGH);
digitalWrite(pedred, HIGH);
digitalWrite(pedgreen, LOW);
}
//Buzzer Sound when Ped is green and car red
void Pedgreentone(){
int i;
for(i=0;i<10;i++){
tone(buzzer, 1000);
delay(500);
noTone(buzzer);
delay(500);
}
}
void loop()
{
int i;
if(digitalRead(nightbutton) == HIGH)
{
nightstatus++;
}
//Night-Button = 1 (on_click)
if((nightstatus % 2) == 1)
{
delay(2000);
digitalWrite(carred, LOW);
digitalWrite(cargreen, LOW);
digitalWrite(pedred, LOW);
digitalWrite(pedgreen, LOW);
//Yellow light blink
while((nightstatus % 2) == 1)
{
digitalWrite(caryellow, HIGH);
delay(1000);
digitalWrite(caryellow, LOW);
delay(1000);
if(digitalRead(nightbutton) == HIGH)
{
nightstatus++;
}
}
}
//Ped-Button = 1 (on_click)
if(digitalRead(pedbutton) == HIGH)
{
//(car=yellow;pet=red)
delay(5000);
digitalWrite(caryellow, HIGH);
digitalWrite(cargreen, LOW);
//(car=red;pet=red)
delay(2000);
digitalWrite(caryellow, LOW);
digitalWrite(carred, HIGH);
//(car=red;pet=green)
delay(2000);
digitalWrite(pedgreen, HIGH);
digitalWrite(pedred, LOW);
Pedgreentone();
//(car=red;pet=red)
digitalWrite(pedgreen, LOW);
digitalWrite(pedred, HIGH);
//(car=red+yellow;pet=red)
delay(2000);
digitalWrite(caryellow, HIGH);
//(car=green;pet=red)
delay(2000);
digitalWrite(carred, LOW);
digitalWrite(caryellow, LOW);
digitalWrite(cargreen, HIGH);
}
//Ped-Button = 0
else
{
digitalWrite(pedred, HIGH);
digitalWrite(pedgreen, LOW);
digitalWrite(carred, LOW);
digitalWrite(caryellow, LOW);
digitalWrite(cargreen, HIGH);
}
}