Zustandsautomat

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

 

Quelle…