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;
}
}
}
