ArduinoState machine (vervolg en beter)

Dit is een vervolg van het state machine in project 11. Daar reageerde button1 bij het loslaten van de knop. Hier gaan we het programma aanpassen zodat de status direct bij het indrukken zal veranderen. Eenmaal per keer.

Om te voorkomen dat de status continue zal wijzigen zolang we button1 ingedruk houden, gaan we alleen iets doen als we button1 indrukken! Dit doen we door een state machine mechanisme te gebruiken. Als we button1 indrukken dan doen we onze actie en zetten een variable actionNeeded naar false. Zolang die false is doen we niets. En heel handig zetten we deze alleen op true als we de knop niet ingedrukt hebben. Een kind kan de was doen.



ArduinoBreadboard



ArduinoSketch
/*
  State machine, action in key press

  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 actionNeeded = true;      // True is action is needed on next press
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) {

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

      // Mark that the pressing is not longer valid
      actionNeeded = false;
    }
    
  } else {
  
    // Button is not (longer) pressed, mark that action is needed on next press
    actionNeeded = true;
  }

// 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.