/* Arduino-Sketch "Blinken und Warnblinken" Input: Zwei Taster (normal offen und LOW, bei Betätigung HIGH) Output: Zwei LEDs Programmlogik: Linker Taster: Schaltet blinken links an/aus Rechter Taster: Schaltet blinken rechts an/aus Beide Taster gleichzeitig: Warnblinken Das Warnblinken wird in ein blinken rechts oder links umgeschaltet, sobald während des Warnblinkens der linke oder rechte Taster betätigt wird */ // Anfang des Benutzerdefinierbaren Variablenbereichs #define BLINKPINLEFT 12 // digitaler Ausgang linke LED #define BLINKPINRIGHT 13 // digitaler Ausgang rechte LED #define BUTTONLEFT 2 // digitaler Eingang linker Taster #define BUTTONRIGHT 3 // digitaler Eingang rechter Taster long debouncetime=10; // Zusätzliche Entprellzeit // Ende des Benutzerdefinierbaren Variablenbereichs boolean BlinkenRechts=false; boolean BlinkenLinks=false; boolean BlinkenBeide=false; boolean BlinkState=LOW; long previousMillis = 0; // Zeitstempel für letzte Blinkstatus-Änderung long interval = 500; // Zeitintervall für das Blinken (Millisekunden) void setup() { // Serielle Schnittstelle initialisieren Serial.begin(9600); Serial.println("\nInitialisierung beginnt..."); // Die beiden Taster als digitale Inputs festlegen pinMode(BUTTONLEFT, INPUT); pinMode(BUTTONRIGHT, INPUT); // Die beiden LED-Pins auf digitalen Output schalten pinMode(BLINKPINLEFT, OUTPUT); pinMode(BLINKPINRIGHT, OUTPUT); Serial.println("Initialisierung fertig.\n"); } void switchblinkstate(char c[]) /* Diese Funktion erhält bei jeder Statusänderung eines Tasters einen zwei Zeichen langen String mit dem Tastaturstatus übergeben, "lr" => beide Taster nicht betätigt "LR" => beide Taster betätigt "lR" => nur rechter Taster betätigt "Lr" => nur linker Taster betätigt Ausgaben über die serielle Schnittstelle nur für Debug-Zwecke */ { Serial.print(c); if (strcmp(c,"LR")==0) { BlinkenBeide=true; BlinkenLinks=false; BlinkenRechts=false; Serial.println("B"); return; } if (BlinkenBeide && ((strcmp(c,"lR")==0) || strcmp(c,"Lr"))==0) { BlinkenBeide=false; BlinkenLinks=false; BlinkenRechts=false; Serial.println("b"); return; } if (strcmp(c,"lR")==0) { BlinkenBeide=false; BlinkenLinks=false; BlinkenRechts=!BlinkenRechts; Serial.println("R"); return; } if (strcmp(c,"Lr")==0) { BlinkenBeide=false; BlinkenLinks=!BlinkenLinks; BlinkenRechts=false; Serial.println("L"); return; } Serial.println("N"); // N wie Nichts } char keystate[3], keystate1[3], keystate2[3]; boolean allbuttonsup=true; void loop() /* Der Tasterstatus wird in kurzen Strings gespeichert, und nur wenn bei zwei Durchläufen der loop ein identischer Taterstatus vorliegt, wird der "keystate" tatsächlich geändert und ausgewertet */ { if (digitalRead(BUTTONLEFT)) // Status des linken Tasters lesen strcpy(keystate1,"L"); else strcpy(keystate1,"l"); if (digitalRead(BUTTONRIGHT)) // Status des rechten Tasters lesen strcat(keystate1,"R"); else strcat(keystate1,"r"); // Wenn bei zwei loop-Durchläufen derselbe Tasterstatus vorliegt if ((strcmp(keystate1,keystate2)==0)&&(strcmp(keystate,keystate1)!=0)) { strcpy(keystate,keystate1); // den "keystate" tatsächlich ändern if (strcmp(keystate,"lr")==0) // alle Taster waren unbetätigt, merken { allbuttonsup=true; } else if (strcmp(keystate,"LR")==0) // beide Taster betätigt { switchblinkstate(keystate); allbuttonsup=false; } else if (allbuttonsup && ((strcmp(keystate,"Lr")==0)||(strcmp(keystate,"lR")==0))) { switchblinkstate(keystate); // change blinkstate allbuttonsup=false; } else { Serial.println("Uups"); // Sollte nicht vorkommen } } else // andernfalls den gerade ermittelten Tasterstatus als alten Tasterstatus merken strcpy(keystate2,keystate1); // Jetzt folgt die Blink-Logik // Ob es Zeit zum Blinken ist wird aus der Zeitdifferenz aus // aktueller Zeit und letzter Änderung des Blinkstatus ermittelt // Siehe Arduino-Beispiel "Digital - BlinkWithoutDelay unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { // save the last time you blinked the LED previousMillis = currentMillis; // if the LED is off turn it on and vice-versa: if (BlinkState == LOW) BlinkState = HIGH; else BlinkState = LOW; } // Jetzt werden die Blink-Outputs tatsächlich gesetzt if (BlinkenBeide) { digitalWrite(BLINKPINLEFT, BlinkState); digitalWrite(BLINKPINRIGHT, BlinkState); } else if (BlinkenLinks) { digitalWrite(BLINKPINLEFT, BlinkState); digitalWrite(BLINKPINRIGHT, LOW); } else if (BlinkenRechts) { digitalWrite(BLINKPINLEFT, LOW); digitalWrite(BLINKPINRIGHT, BlinkState); } else { digitalWrite(BLINKPINLEFT, LOW); digitalWrite(BLINKPINRIGHT, LOW); } // und noch eine kleine zusätzliche Verzögerung zum Entprellen der Taster delay(debouncetime); }