Hallo, ich programmiere gerade eine Ampel und brauche Hilfe.
Ich möchte dass mein gelbes LED nach einem Buttonclick beginnt zu blinken, so lange bis der button ein weiteres mal geklickt wird.
Version - Startet blinken nach dem Buttonklick
Diese version funktioniert, ist aber nicht wie ich es mir vorstelle da es so lange gehen soll bis der Button wieder geklickt wird.
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 - Starte das blinken nach dem Buttonklick, nach einem weiteren klicken soll aufgehört werden zu blinken.
Diese version funktioniert nicht. Das problem ist die funktion delay(); diese macht es unmöglich den buttonklick zu erkennen. Ich brauche eine Lösung dafür dass der Buttonklick erkannt wird. Ich hab es mit interupt versucht, konnte es aber nicht zum laufen bringen.
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);
}
}