/*
Forum: https://forum.arduino.cc/t/arduino-volatile-variable-und-funktionsaufruf/1369418
Wokwi: https://wokwi.com/projects/427065070114070529
ec2021
2025/04/01
*/
#include "IRremote.h"
// Pin für den Auslöser des Interrupts
int InterruptPin = 2;
enum Modes {
AMPEL, BLINKEN
};
Modes mode = BLINKEN;
enum States {
aROT,
aROTGELB,
aGRUEN,
aGELB
};
States ampel1State = aROT;
enum LED
{
ROT1 = 5,
GELB1,
GRUEN1,
ROT2,
GELB2,
GRUEN2
};
void setup()
{
// Empfänger starten
IrReceiver.begin(InterruptPin);
// pinMode LEDs
for (int i = ROT1; i <= GRUEN2; i++)
{
pinMode(i, OUTPUT);
}
Serial.begin(115200);
}
void loop()
{
getIRCommand();
stateMachine();
}
void setAmpel1(byte stateRot, byte stateGelb, byte stateGruen) {
digitalWrite(ROT1, stateRot);
digitalWrite(GELB1, stateGelb);
digitalWrite(GRUEN1, stateGruen);
}
void setAmpel2(byte stateRot, byte stateGelb, byte stateGruen) {
digitalWrite(ROT2, stateRot);
digitalWrite(GELB2, stateGelb);
digitalWrite(GRUEN2, stateGruen);
}
void allOff() {
setAmpel1(LOW, LOW, LOW);
setAmpel2(LOW, LOW, LOW);
}
void stateMachine() {
switch (mode) {
case AMPEL:
ampelMachine(true);
break;
case BLINKEN:
blinkMachine(true);
break;
}
}
void getIRCommand() {
if (IrReceiver.decodedIRData.address == 0)
{
if (IrReceiver.decode())
{
int val = IrReceiver.decodedIRData.command;
IrReceiver.resume();
switch (val)
{
// Taste 1: Ampel starten
case 48: // statt 22
if (mode != AMPEL) {
allOff();
ampelMachine(false);
mode = AMPEL;
}
break;
// Taste 3:gelbes Blinklicht
case 122: // statt 13
if (mode != BLINKEN) {
allOff();
blinkMachine(false);
mode = BLINKEN;
}
break;
default:
Serial.println(val);
}
}
}
}
void blinkMachine(boolean Run) {
static unsigned long lastBlink = 0;
static byte lastState = LOW;
if (!Run) {
lastBlink = 0;
lastState = LOW;
return;
}
if (millis() - lastBlink > 500) {
lastBlink = millis();
lastState = !lastState;
setAmpel1(LOW, lastState, LOW);
setAmpel2(LOW, lastState, LOW);
}
};
boolean timeOver(unsigned long startTime, unsigned long wait) {
return (millis() - startTime >= wait);
}
void ampelMachine(boolean Run) {
static unsigned long lastChange = 0;
if (!Run) {
lastChange = 0;
ampel1State = aROT;
return;
}
switch (ampel1State) {
case aROT:
if (timeOver(lastChange, 5000)) {
lastChange = millis();
setAmpel1(HIGH, LOW, LOW);
setAmpel2(LOW, LOW, HIGH);
ampel1State = aROTGELB;
}
break;
case aROTGELB:
if (timeOver(lastChange, 5000)) {
lastChange = millis();
setAmpel1(HIGH, HIGH, LOW);
setAmpel2(LOW, HIGH, LOW);
ampel1State = aGRUEN;
}
case aGRUEN:
if (timeOver(lastChange, 5000)) {
lastChange = millis();
setAmpel1(LOW, LOW, HIGH);
setAmpel2(HIGH, LOW, LOW);
ampel1State = aGELB;
}
break;
case aGELB:
if (timeOver(lastChange, 5000)) {
lastChange = millis();
setAmpel1(LOW, HIGH, LOW);
setAmpel2(HIGH, HIGH, LOW);
ampel1State = aROT;
}
}
};