Mit einem Zustandsautomat (englisch : Statemachine) lassen sich bestimmte Vorgänge nach einem festgelegten Muster steuern. So können z. B. LEDs, Relais o. ä. durch Tastendruck in der gewünschten Reihenfolge ein- und wieder ausgeschaltet werden.
Im folgenden Beispiel werden zwei LEDs mit switch/case nacheinander geschaltet:
Start (case 0): Alle LEDs aus
case 1: LED 1 an; LED 2 aus
case 2: LED 1 + LED 2 an
case 3: LED 1 an; LED 2 aus
Im nächsten Schritt beginnt der Ablauf wieder von vorne; d. h. beide LEDs sind aus. Für eigene Zwecke kann der Code beliebig angepasst werden.
int switchPin = 2; // switch is connected to pin 2 int led1Pin = 3; int led2pin = 4; int val; // variable for reading the pin status int val2; // variable for reading the delayed status int buttonState; // variable to hold the button state int Mode = 0; // What mode is the light in? boolean modeChanged = false; const int NUM_MODES = 4; void setup() { Serial.begin(9600); Serial.println("Start"); pinMode(switchPin, INPUT_PULLUP); // Set the switch pin as input pinMode(led1Pin, OUTPUT); pinMode(led2pin, OUTPUT); buttonState = digitalRead(switchPin); // read the initial state } void loop(){ val = digitalRead(switchPin); // read input value and store it in val delay(10); // 10 milliseconds is a good amount of time val2 = digitalRead(switchPin); // read the input again to check for bounces if (val == val2) { // make sure we got 2 consistant readings! if (val != buttonState) { // the button state has changed! if (val == LOW) { // check if the button is pressed Mode++; if (Mode >= NUM_MODES) { Mode = 0; } modeChanged = true; } } buttonState = val; // save the new state in our variable } if (modeChanged) { modeChanged = false; // Now do whatever the lightMode indicates switch(Mode) { case 0: digitalWrite(led1Pin, LOW); digitalWrite(led2pin, LOW); Serial.println(0); break; case 1: digitalWrite(led1Pin, HIGH); digitalWrite(led2pin, LOW); Serial.println(1); break; case 2: digitalWrite(led1Pin, HIGH); digitalWrite(led2pin, HIGH); Serial.println(2); break; case 3: digitalWrite(led1Pin, HIGH); digitalWrite(led2pin, LOW); Serial.println(3); break; } } }