/*
Forum: https://forum.arduino.cc/t/idee-in-code-umsetzen-ist-schwierig/1409496/16
Wokwi: https://wokwi.com/projects/445363788291304449
Der Ablauf als einfache finite State Machine mit Enumerations und serieller Ausgabe beim jeweiligen
Statuswechsel
Auf Entprellen des Auslösers wurde verzichtet, da nach der fallende Flanke ein Prellen aufgrund
der folgenden, mehrere Sekunden andauernden Schritte keinen Einfluss hat.
ec2021
2025/10/20
*/
/* Ein Reedkontakt wird für einen Bruchteil einer Sec. mit einem Magneten geschlossen.
Danach soll ein Reedrelais anziehen damit der Kontakt im Reedrelais für ca. 1 Sec. geschlossen bleibt.
Danach soll sich der Reedkontakt im Relais wieder öffnen.
Nach weiteren 4 Sec. soll das 2. Reedrelais anziehn und der Kontakt für ca. 1 Sec. geschlossen bleiben.
Danach beginnt alles von Vorne.
Zum Testen wird erst mal eine LED verwendet die später mit einem Reedrelais ausgetauscht werden soll.
*/
constexpr uint8_t ReedKontakt {10}; // Zuordnung des Reedkontakt auf den Ausgang D10
constexpr uint8_t redLed {5}; // Zuordnung der LED auf Pin 5 / LED rot / zeigt an, wann Tasteneingaben nicht ausgewertet werden
constexpr uint8_t yellowLed {6}; // Zuordnung der LED auf Pin 6 / LED gelb / hier soll später das Reedrelais 1 angeschlossen werden.
constexpr uint8_t greenLed {8}; // Zuordnung der LED auf Pin 8 / LED grün / hier soll später das Reedrelais 2 angeschlossen werden.
constexpr uint32_t onTime {1000};
constexpr uint32_t pauseTime {4000};
enum States {WAIT, YELLOW, PAUSE, GREEN};
States state = WAIT;
unsigned long startTime = 0;
void setup()
{
Serial.begin(115200);
Serial.println(F("Start...."));
pinMode(ReedKontakt, INPUT_PULLUP);
pinMode(yellowLed, OUTPUT);
pinMode(greenLed, OUTPUT);
pinMode(redLed, OUTPUT);
Serial.println(F("Warte auf Taste"));
}
void loop()
{
stateMachine();
}
void stateMachine() {
switch (state) {
case WAIT:
if (digitalRead(ReedKontakt) == LOW) { // Aufgrund des Ablaufs kann hier auf Entprellen verzichtet werden!
startTime = millis();
digitalWrite(redLed, HIGH); // Ab jetzt werden Tasteneingaben nicht mehr ausgewertet
digitalWrite(yellowLed, HIGH);
Serial.println(F("Gelb AN"));
state = YELLOW;
}
break;
case YELLOW:
if (millis() - startTime > onTime) {
startTime = millis();
digitalWrite(yellowLed, LOW);
Serial.println(F("Gelb AUS"));
Serial.println(F("Pause ..."));
state = PAUSE;
}
break;
case PAUSE:
if (millis() - startTime > pauseTime) {
startTime = millis();
digitalWrite(greenLed, HIGH);
Serial.println(F("GRÜN AN"));
state = GREEN;
}
break;
case GREEN:
if (millis() - startTime > onTime) {
digitalWrite(greenLed, LOW);
Serial.println(F("GRÜN AUS"));
Serial.println(F("Warte auf Taste"));
digitalWrite(redLed, LOW); // Ab jetzt werden Tasteneingaben wieder ausgewertet
state = WAIT;
}
break;
}
}