✓ Speciaal voor VO, Technasium & Bèta-onderwijs ✓ Scholen bestellen op rekening (achteraf betalen)
Direct contact: info@funmetelectronica.nl | Tel: 06-53111122
Arduino Gevorderd › Voorbeelden

Voorbeelden

Arduino Gevorderd
Een groot voorbeeld gemaakt is een snoepmachine.

Beschrijving/Specificaties

Stel we willen een simpele snoepmachine maken. Een snoepje kost 10 cent en de enige muntjes die in de machine gegooid kunnen worden is een 5 of 10 cent muntje. We weten dus dat de mogelijke 'credit' in de machine 0, 5, 10 of 15 cent kan hebben. Bij 10 cent moet de machine een snoepje geven en 0 credit overhouden. Bij 15 cent moet de machine een snoepje geven en 5 credit overhouden.

Ontwerp

Vanuit de beschrijving weten we dat er 4 states kunnen zijn. deze states komen overeen met de credit in de machine. 0 credit, 5 credit, 10 credit en 15 credit. Bij 0 credit kunnen we naar 5 of 10 credit gaan. Bij 5 credit kunnen we naar 10 of 15 credit gaan. Bij 10 credit gaan we automatisch naar 0 credit en bij 15 credit gaan we automatisch naar 5 credit. Voor dit prototype gebruiken we een LCD scherm om de state en credit te weergeven. Ook de handelingen die het apparaat zou moeten doen wordt hier weergeven. Voor de input gebruiken we 2 knopjes. 1 knopje voor 5 cent en de andere voor 10 cent. Met de beschrijving komen we dan uit op het volgende schema:

Code

De code van dit schema is simpelweg geplakt hieronder. Een paar opmerkingen: de functie print is gemaakt om simpele commando's te printen op het LCD scherm. Dit verkleint de code enorm.
/*
  Snoepmachine Finite State Machine
  Een snoepje kost 20 cent en de klant kan alleen betalen met
  5 of 10 cent. Elke state bestaat uit een waarde hoeveel de klant
  al heeft betaald of uit een handeling waarna de state automatisch
  veranderd. De input is een knop die 5 of 10 cent is.
*/


/*
  LCD scherm aangesloten:
  VSS:    GND
  VDD:    5V
  VO:     10k potmeter
  RS:     pin 12
  RW:     GND
  E:      pin 11
  D4:     pin 5
  D5:     pin 4
  D6:     pin 3
  D7:     pin 2
  A:      5V met 220 Ohm
  K:      GND
  Overig: niet aangesloten
*/
#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

/* De States and variabele */
#define M0 0                // er zit 0 cent in de automaat
#define M5 1                // er zit 5 cent in de automaat
#define M10 2               // er zit 10 cent in de automaat, geef snoepje
#define RETURN 5            // er zit 15 cent in de automaat, geef snoepje + 5 cent
int state = M0;             // start state

/* De knoppen */
const int btn_5 = 6;        // 5 cent button op pin 6
const int btn_10 = 7;       // 10 cent button op pin 7
int value_5 = 0;            // status van 5 cent button
int value_10 = 0;           // status van 10 cent button

/* setup functie voor de LCD */
void setup() {
  lcd.begin(16, 2);         // start de LCD
  lcd.print("Starting..."); // Print het eerste
}

/* Loop */
void loop() {
  value_5 = digitalRead(btn_5);   // lees button 5 cent
  value_10 = digitalRead(btn_10); // lees button 10 cent

  /* switch naar de state van waarde state */
  switch(state){
    case M0:      // state is M0, functie f_M0
      f_M0();     // functie voor de state
    break;        // break de switch na de functie zodat de loop opnieuw begint

    case M5:      // state is M5, functie f_M5
      f_M5();     // functie voor de state
    break;        // break de switch na de functie zodat de loop opnieuw begint

    case M10:     // state is M10, functie f_M10
      f_M10();    // functie voor de state
    break;        // break de switch na de functie zodat de loop opnieuw begint

    case RETURN:  // state is RETURN, functie f_RETURN
      f_RETURN(); // functie voor de state
    break;        // break de switch na de functie zodat de loop opnieuw begint

    default:      // default doet niets en komt nooit aan bod
    break;        // break de switch na de functie zodat de loop opnieuw begint
  }
  delay(50);      // delay voor bouncing en serial redenen
}

/*
  State M0: Geen geld in de automaat, er kan 5 of 10 cent in gegooid worden.
  5 cent: M5
  10 cent: M10
*/
void f_M0(){
  /* print huidige state */
  print(0, "State: M0");
  print(1, "Nog 10 cent");

  /* kijk of de state moet veranderen */
  if(value_5){                  // knop 5 cent is ingedrukt
    state = M5;                 // state verandered naar 5 cent (M5)
    print(1, "5 cent erin");    // print dat er 5 cent in de machine gaat
    delay(1000);                // wacht een seconde zodat de vinger van de btn kan
  }else if(value_10){           // knop 10 cent is ingedrukt
    state = M10;                // state verandered naar 10 cent (M10)
    print(1, "10 cent erin");   // print dat er 10 cent in gaat
    delay(1000);                // wacht een seconde zodat de vinger van de btn kan
  }
}

/*
  State M5: 5 cent in de automaat, er kan 5 of 10 cent in gegooid worden.
  5 cent: M10
  10 cent: RETURN
*/
void f_M5(){
  /* print de huidige state */
  print(0, "State: M5");
  print(1, "Nog 5 cent");

  /* kijk of de state veranderd moet worden */
  if(value_5){                  // knop 5 cent is ingedrukt
    state = M10;                // state verandered naar 10 cent (M10)
    print(1, "5 cent erin");    // print dat er 5 cent in gaat
    delay(1000);                // wacht een seconde zodat de vinger van de btn kan
  }else if(value_10){           // knop 10 cent is ingedrukt
    state = RETURN;             // state verandered naar 15 cent (RETURN)
    print(1, "10 cent erin");   // print dat er 10 cent in gaat
    delay(1000);                // wacht een seconde zodat de vinger van de btn kan
  }
}

/*
  State M10: 10 cent in de automaat. De automaat geeft een snoepje
  automatische switch naar state M0
*/
void f_M10(){
  /* print de state en stappen */
  print(0, "State: M10");       // print wat de status is
  print(1, "Genoeg betaald!");  // print dat er genoeg betaald is
  delay(1000);                  // wacht een seconde zodat dit gelezen kan worden
  print(1, "Snoepje eruit");    // zeg dat er een snoepje uitkomt
  delay(1000);                  // wacht een seconde zodat dit gelezen kan worden

  /*
  volgende state, zonder input, want hij gaat automatisch naar 0 cent
  sinds er een snoepje gegeven is
  */
  state = M0;
}

/*
  State RETURN: 5 cent teveel in de automaat, geeft een snoepje en er blijft
  5 cent over. automatisch switch naar M5
*/
void f_RETURN(){
  // print de huidige state en handelingen
  print(0, "State: RETURN");    // print wat de state is
  print(1, "Genoeg betaald!");  // zeg dat er genoeg betaald is
  delay(1000);                  // wacht een seconde zodat dit gelezen kan worden
  print(1, "Snoepje eruit");    // zeg dat er een snoepje uitkomt
  delay(1000);                  // wacht een seconde zodat dit gelezen kan worden
  print(1, "5 cent over");      // zeg dat er nog 5 cent over is
  delay(1000);                  // wacht een seconde zodat dit gelezen kan worden

  /* nieuwe state meteen omdat hij hierna naar 5 cent gaat en opnieuw begint */
  state = M5;
}

/*
  Functie om iets te printen op de display.
*/
void print(int rij, String text){
  int append = 16-text.length();  // kijk hoeveel spaties er aan de text geplakt moeten worden

  for(int i = 0; i<append; i++){  // plak de spaties aan de tekst
    text += ' ';
  }

  /* print */
  lcd.setCursor(0, rij);
  lcd.print(text);
}