Les 5: Programmeren drukknop met 3 standen

Programmeren van een drukknop met 3 standen via Arduino? Wel, het programmeren van een drukknop hebben we reeds gezien, toch is er meer mogelijk met een simpele knop. We kunnen namelijk een knop met meerdere standen maken. We programmeren in deze les een knop met 3 standen, maar het principe dat we hier gebruiken kan natuurlijk toegepast worden bij 4, 5, 6 of meer standen.

Drukknop programmeren:

We programmeren een drukknop met 3 standen met als doel om 2 ledjes afzonderlijk te laten werken. Onze eerste stand moet dus het eerste ledje doen werken, onze tweede stand zal het tweede ledje doen branden en tot slot zal onze derde stand ze beiden doven.

We beginnen met ons programma zoals altijd: we declareren onze woorden. Zo schakelen we onze rode led en groene led op respectievelijk uitgang 12 en 11. Onze knop schakelen we dan weer op poort 9. Merk op dat in deze code dit constanten zijn, terwijl ‘knopStatus’ en ‘a’ hier variabelen zijn. De eerste variabele, ‘knopStatus’, zullen we gebruiken om de waarde van onze knop in op te slaan. De variabele ‘a’ stelt ons in staat een drukknop met 3 standen te programmeren. Hij zal de Arduino duidelijk maken welke functie uit te voeren.

Opbouw:

Eerst en vooral declareren we onze ledjes als OUTPUT en onze knop als INPUT. Zo kan arduino de uitvoerende poorten van de observerende poorten onderscheiden.

knopStatus = digitalRead ( knop );

Ons programma staat en valt met onze knop. De status van deze knop lezen is dan ook het eerste wat we doen. Tot nu toe is onze code gelijklopend met deze uit les 2: programmeren drukknop. We programmeren nu echter een drukknop met 3 standen, dit wil zeggen dat we meer if-functies nodig zullen hebben.

if ( knopStatus == HIGH && a ==0){

        // code
        a = 1;
        }

    if ( knopStatus == HIGH && a ==1){

     // code
     a= 2;
     }

  if ( knopStatus == HIGH && a ==2){

  // code
  a = …;
  }

 if ( knopStatus == HIGH && a == …){

 // code
 a = 0;
 }

Dit is de kern van het programmeren van een drukknop met 3 standen, voor alle drukknoppen met meerdere standen. We voeren een extra voorwaarde in bij onze if-functie en verhogen deze steeds als we de cyclus doorlopen hebben. Voor wat extra informatie omtrent de if-functie, bekijk zeker nog eens Programmeeromgeving Arduino sectie. Het teken ‘&&’ bekent zoveel als: het ene en het andere moeten voldaan zijn. Nu zal de Arduino-verwerker pas deze code lezen als zowel de knop ingeduwd is en als de variabele ‘a’ de gevraagde waarde heeft. Zo kunnen we steeds bepalen, door onze a een waarde toe te kennen, welke van de if-functies doorlopen zal worden wanneer men op de knop drukt.

Notities:

Zo staat het teken ‘&&’ in mensentaal voor ‘en’, en staat het teken ‘or’ voor het logische ‘of’. Er kan dus ook getest worden: ‘het ene of het andere moet voldaan zijn’. Als beide tegelijk voldaan zijn zal bij ‘or’ uiteraard ook de code in de functie gelezen worden.

knopStatus = digitalRead( knop);

Het is zeer belangrijk dat je tussen elke if-functie je ‘knopStatus’ opnieuw declareert. Het programma werkt namelijk verder met de laatst opgeslagen waarde. Mocht deze update van de ‘knopStatus’ niet gebeuren, zal Arduino elke if-functie uitvoeren per doorloping van de void loop, mocht de knop in het begin ingedrukt worden. ‘knopStatus’ blijft echter ‘HIGH’ en ‘a’ wordt steeds verhoogt zodat deze ook aan de voorwaarde van de volgende functie voldoet.

Bij les 2 gebruikten we slechts twee if-functies. Één om het ledje te laten branden en één om het weer te doven. Je zult echter tijdens het programmeren van een knop met 3 standen merken dat er veel gelijkenissen zijn. Het verschil is dat we in deze les niet stoppen bij slechts één ledje, één status van onze uitvoerende component … Een knop met meerdere standen kan namelijk ook zijn nut bewijzen tijdens het werken met analoge componenten. Hierover meer in onze volgende les.

Code:

// Eerst zetten we onze woorden om in taal die Arduino begrijpt. 
const int ledRood =12; 
const int ledGroen =11;
const int knop = 9;

int knopStatus; 
int a ;

void setup() {

// Aangezien dat deze ” loop ” slechts eenmaal doorlopen wordt, declareer je hier jouw poorten. 
pinMode ( ledRood , OUTPUT);
pinMode ( ledGroen, OUTPUT);

pinMode ( knop , INPUT);
}

void loop() {

// Vervolgens zetten we hier de opdrachten die uitgevoerd moeten worden. Deze “loop” wordt dus steeds herhaald. 
knopStatus = digitalRead ( knop ); // lees de status van de knop en sla deze op in “knopStatus”.

if ( knopStatus == HIGH && a ==0){ // als de knop ingedrukt is EN ‘a’ is gelijk aan 0 :

digitalWrite ( ledGroen, LOW);
digitalWrite ( ledRood, HIGH); 
a =1; // zet integer ‘a’ gelijk aan 1.

delay(500);
}

knopStatus = digitalRead ( knop );

if ( knopStatus == HIGH && a ==1){ // als de knop ingedrukt is EN ‘a’ is gelijk aan 1 :

digitalWrite ( ledGroen , HIGH);

digitalWrite ( ledRood, LOW);
a=2; // zet integer ‘a’ gelijk aan 2.

delay(500);
}

knopStatus = digitalRead ( knop );

if ( knopStatus == HIGH && a ==2){ // als de knop ingedrukt is EN ‘a’ is gelijk aan 2 :

digitalWrite (ledRood , LOW);

digitalWrite ( ledGroen, LOW);
a=0; // zet integer ‘a’ gelijk aan 0.

delay(500);
}
}

Schakeling:

We schakelen een knop aan de 5V spanningsbron en verbinden deze met een 100 000 ohmse weerstand naar de ground. Eenzelfde laatste pin wordt verbonden met uitgang 9 op de Arduino. Het rode en groen ledje zijn respectievelijk op poorten 12 en 11 geschakeld. Beide hebben in serie een weerstand van 200 ohm geschakeld.

Basislessen Arduino 41.6%

Ook raden we jou aan om bepaalde waardes of commando’s te vervangen of te veranderen. Zo wordt het al snel duidelijke welke invloed een commando heeft op de werking van de schakeling. In deze code kan je het belang van de herdefiniëring van ‘knopStatus’ duidelijk zien mocht je dit uit de code halen.

Bij problemen met het programmeren van een knop met meerdere standen, aarzel dan zeker niet om contact op te nemen.

Als je deze code onder de knie hebt, ga dan over naar les 6!

Geplaatst in Programmeren Arduino voor dummies.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *