Hallo zusammen.
eine Baustellenampel soll beim Druck der Taste 1 auf der Fernbedienung zwei Ampeln im festen Rhythmus schalten, Taste 3 soll auf gelbes Blinklicht umschalten.
Der Empfänger der Fernbedienung hängt an Pin 2 und unterbricht das Programm, wenn eine beliebige Taste auf der Fernbedienung gedrückt wird.
Nun zum Problem:
Nach einer unterschiedlichen Anzahl von Durchläufen der Funktionen werden die Funktionen nicht mehr ausgeführt.
Hat jemand von euch dazu eine Idee?
Kann es etwas mit den delays zu tun haben?
Danke
Hartmut
#include "IRremote.hpp"
// Pin für den Auslöser des Interrupts
int InterruptPin = 2;
enum LED
{
ROT = 5,
GELB,
GRUEN,
ROT1,
GELB1,
GRUEN1
};
volatile bool Status = true;
void setup()
{
// Empfänger starten
IrReceiver.begin(InterruptPin);
// pinMode LEDs
for (int i = ROT; i <= GRUEN1; i++)
{
pinMode(i, OUTPUT);
}
// Funktion Schalten() dem Interrupt-Pin zuordnen
attachInterrupt(digitalPinToInterrupt(InterruptPin), Schalten, FALLING);
Serial.begin(9600);
}
void loop()
{
// Daten lesen
if (IrReceiver.decodedIRData.address == 0)
{
if (IrReceiver.decode())
{
delay(200);
// nächsten Wert lesen
IrReceiver.resume();
Status = true;
/*
solange der Status true ist, wird die jeweilige while-Schleife
ausgeführt, ein weiterer Druck auf eine beliebige Taste
der Fernbedienung löst den Interrupt aus
-> Status wird zu false, die while-Schleife wird nicht erneut
ausgeführt
*/
switch (IrReceiver.decodedIRData.command)
{
// Taste 1: Ampel starten
case 22:
while (Status) AmpelStarten();
alleLEDAus();
break;
// Taste 3:gelbes Blinklicht
case 13:
while (Status) GelbesBlinklicht();
alleLEDAus();
break;
}
}
}
}
void Schalten()
{
Status = false;
}
void AmpelStarten()
{
// wenn der Interrupt ausgelöst wurd .> Status = false
// Funktion verlassen
Serial.println(i);
digitalWrite(GRUEN1, HIGH);
digitalWrite(ROT, HIGH);
if(!Status) return;
delay(5000);
digitalWrite(GRUEN1, LOW);
digitalWrite(GELB1, HIGH);
if(!Status) return;
delay(1000);
digitalWrite(GELB1, LOW);
digitalWrite(ROT1, HIGH);
if(!Status) return;
delay(2000);
digitalWrite(GELB, HIGH);
if(!Status) return;
delay(1000);
digitalWrite(ROT, LOW);
digitalWrite(GELB, LOW);
digitalWrite(GRUEN, HIGH);
if(!Status) return;
delay(5000);
digitalWrite(GRUEN, LOW);
digitalWrite(GELB, HIGH);
if(!Status) return;
delay(1000);
digitalWrite(GELB, LOW);
digitalWrite(ROT, HIGH);
if(!Status) return;
delay(2000);
digitalWrite(GELB1, HIGH);
if(!Status) return;
delay(1000);
digitalWrite(ROT1, LOW);
digitalWrite(GELB1, LOW);
digitalWrite(GRUEN1, HIGH);
}
void GelbesBlinklicht()
{
digitalWrite(GELB, HIGH);
digitalWrite(GELB1, HIGH);
if(!Status) return;
delay(500);
digitalWrite(GELB, LOW);
digitalWrite(GELB1, LOW);
if(!Status) return;
delay(500);
digitalWrite(GELB, HIGH);
digitalWrite(GELB1, HIGH);
if(!Status) return;
delay(500);
digitalWrite(GELB, LOW);
digitalWrite(GELB1, LOW);
if(!Status) return;
delay(500);
}
void alleLEDAus()
{
for (int i = ROT; i <= GRUEN1; i++)
{
digitalWrite(i, LOW);
}
}