State machine - Introductie
We gaan met een knop werken. Een drukknop. Als deze is ingedrukt dan loopt er stroom door. Is de knop niet ingedrukt, dan loopt er geen stroom door. Dat gaan we eerst even maken.
Dit eerste programma bestaat uit twee onderdelen. Het aanzetten van een LED. Hiervoor gebruiken we pin2.
Leuker is het uitlezen van de knop. Dit gaat met een HIGH of een LOW. Je kunt zelf wel bepalen wanneer deze HIGH is, waarschijnlijk. Nou, eigenlijk niet. Dat is afhankelijk van de manier van aansluiten. Deze knoppen moeten namelijk ook 3 punten worden aangesloten. Hierdoor kunnen ze wisselen tussen HIGH en LOW.
Het handigste is als je aan een kant de meting doet. Die kant sluit je aan op een digitale pin.
Van de tegenoverliggende kant sluit je een poort aan op 5V en de andere op aarde GND. Dit moet met een zware weerstand, bijvoorbeeld 10KOhm. De weerstanden die we voor LED's gebruiken zijn hiervoor niet zwaar genoeg.
Als de knop niet is ingedrukt, geeft de digitalRead een LOW waarde. Is de knop wel ingedrukt, dan geeft de knop een HIGH waarde. Met een eenvoudige if then else laten we hiermee de LED branden..
Breadboard
Source code
/*
   State machine, on key press
   (C) copyright www.punthooft.nl 2019-2025
*/
int state = 0;
// Setup function runs once when powerup the board and on reset
void setup() {
   pinMode(2, OUTPUT);
   pinMode(6, INPUT);
}
// The loop function runs over and over again forever
void loop() {
  state = digitalRead(6); // Read button position
  if (state == HIGH) {
    digitalWrite(2, HIGH);
  } else {
    digitalWrite(2, LOW);
  }
}
Bij de code hierboven zal de LED enkel branden als de knop is ingedrukt. We willen nu deze drukknop gaan gebruiken om de LED continue te laten branden of uit te laten zijn.
Hierdoor moeten we de status van de knop bijhouden. En hoe die eerst was (in de vorige loop)
Breadboard
Dit is hetzelfde als hierboven70
Source code
/*
   State machine, action on key release
   (C) copyright www.punthooft.nl 2019-2025
*/
int LEDstate = true;
int fetchedState = LOW;
int previousState = LOW;
// Setup function runs once when powerup the board and on reset
void setup() {
   pinMode(2, OUTPUT);
   pinMode(6, INPUT);
}
// The loop function runs over and over again forever
void loop() {
  fetchedState = digitalRead(6); // Read button position
  if (fetchedState != previousState) {
    if (fetchedState == HIGH) {
      if (LEDstate) {
        LEDstate = false;
      } else {
        LEDstate = true;
      }
    }
    previousState = fetchedState;
  }
  if (LEDstate) {
    digitalWrite(2, HIGH);
  } else {
    digitalWrite(2, LOW);
  }
  delay(0);
}
Nu combineren we dit in een grotere oplossing met 4 LEDs
Breadboard
Source code
/*
   State machine, action on key release
   (C) copyright www.punthooft.nl 2019-2025
*/
int state = 0;
int current = 2;
int pressed = false;
// Setup function runs once when powerup the board and on reset
void setup() {
   // Initialize LED as an output
   pinMode(2, OUTPUT);
   pinMode(3, OUTPUT);
   pinMode(4, OUTPUT);
   pinMode(5, OUTPUT);
   // Initialise the button as an input
   pinMode(6, INPUT);
}
// The loop function runs over and over again forever
void loop() {
  displayPin(current);
  state = digitalRead(6); // Read button position
  if (state == HIGH) {
    if (pressed == false) {
      pressed = true;
      current = current + 1;
      if (current > 5) {
        current = 2;
      }
    }
  }
  if (state == LOW) {
    pressed = false;
  }
}
void displayPin(int pin) {
  for(int i = 2; i<=5;i++) {
    digitalWrite(i, LOW);
  }
  digitalWrite(pin, HIGH);
}
Opmerkingen
Iedere keer als we op de knop drukken dan zal het volgende LEDje aangaan.
Je ziet dat we hier de LEDs in een functie aanzetten. Dat doen we omdat we pal ervoor eerst alle andere LEDs uitzetten.