ArduinoState machine

Vaak hebben we een situatie dat als we op een knop drukken er iets gebeurd, een LED gaat branden of een belletje rinkelen. Om dat langdurig te laten zijn moeten we de knop ingedrukt houden.

Hier willen we dat niet. We hebben hier 4 LEDs. Drie rode LEDs om de status aan te geven en een groene LED om de 'niet in gebruik' status aan te geven. Bij Button1 zal er een verandering in de status optreden. De volgende LED zal gaan branden. 1, 2, 3 en dan weer overnieuw, 1, 2, etc.

Indien er 'niet in gebruik' is, dan zal de groene LED branden. Als er dan op button1 gedrukt zal worden dan zal de eerste status actief worden.

Bij het drukken op button2 zal de status weer resetten naar 'niet in gebruik'.

Om te voorkomen dat de status continue zal wijzigen zolang we button1 ingedruk houden, gaan we alleen iets doen als we button1 loslaten! Dit doen we door een state machine mechanisme te gebruiken. Als we button1 indrukken dan markeren we dat (variable buttonPressed). We doen echter nog niets. We gaan pas iets doen als we de knop weer hebben losgelaten.



ArduinoBreadboard



ArduinoSketch
/*
  State machine, action on key release~

  www.punthooft.nl
*/

// Constants
const int led1 = 2;
const int led2 = 3;
const int led3 = 4;
const int led4 = 5;
const int button1 = 6;
const int button2 = 7;

// Variables
int buttonPressed = false;    // True is button has been / is pressed
int buttonState1 = 0;         // Fetched value of the button
int buttonState2 = 0;         // Fetched value of the button

int programState = led4;      // Current programe state


// Setup function runs once when powerup the board and on reset 
void setup() {

  // Initialize LED as an output.
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);

  // Initiale the buttons
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
}


// The loop function runs over and over again forever
void loop() {

  // Fetch the value of the buttons
  buttonState1 = digitalRead(button1);
  buttonState2 = digitalRead(button2);

  // Check button1
  if (buttonState1 == HIGH) {

    // Mark that button is pressed, do nothing further
    buttonPressed = true;

  } else {
  
    // Button is not pressed, check if it was pressed earlier
    if (buttonPressed) {

      // Display the next led, or restart with the 
      programState++;
      if (programState > led3) {
        programState = led1;
      }

      // Mark that the pressing is not longer valid
      buttonPressed = false;
    }
  }

// Check button2
if (buttonState2 == HIGH) {
  
   // Set program state to LED4
   programState = led4;
 }

  displayLED(programState);
}


// Blink a LED and turn it off
void displayLED(int led) {

  // For all the LEDs
  for(int i = 2; i<6;i++) {

    // Turn LED off unless it is the current active one, prevent blinking
    if (i != led) {
      digitalWrite(i, LOW);
    }
  }               
  digitalWrite(led, HIGH);      
}


ArduinoOpmerkingen

De gebruikte weerstanden zijn 220 Ohm

Let op de werking van de buttons. De state machine is enkel voor button1. Button1 zal pas reageren bij het loslaten van de knop. Button2 reageert direct (bij indrukken al) zoals eerder gezien. Probeer het uit en zie het verschil in werking!




Lees Verder in deze categorie

Copyright 2018 www.punthooft.nl

We do not collect cookies for advertisement. Your data is never send to third parties.