Les 2: Schakelen en programmeren van een drukknop

Hoe programmeren we een drukknop? Weer een nieuwe vraag om met veel zin onze tanden in te zetten, laten we van start gaan met les 2!

We hebben vorige les gezien hoe we een ledje laten branden met behulp van een Arduino code. Bij die schakeling wordt echter de cyclus steeds opnieuw uitgevoerd. Na het uploaden hebben wij er namelijk geen hand meer in. Met deze code willen we jullie de eenvoudigste manier aanleren om je programma ook met een externe factor rekening te laten houden.

In deze code zullen we ook voor het eerst eens gebruik maken van een functie. Een uitgebreide beschrijving van functies vindt je op onze sectie programmeeromgeving.

Programmeren drukknop:

Ook hier zetten we voor onze void setup onze woorden gelijk aan uitgangen van arduino. Bij “knopStatus” en “a” staat er echter geen uitgang. Dit zijn variabelen. Deze schrijven we hier omdat het een overzichtelijke structuur biedt. Zo kunnen we alle woorden terugvinden voor de void setup. Wanneer we deze zouden in de code schrijven, bijvoorbeeld vlak voor het gebruiken ( wat geen conflict zou opleveren met de verwerker ), dan zouden we moeilijkheden krijgen wanneer we aanpassingen moeten doorvoeren. Bij codes is namelijk vaak zo dat een bepaalde variabele meerdere malen aangeroepen en gewijzigd wordt. In dit geval is het natuurlijk niet meer vanzelfsprekend om deze woorden terug te vinden.

“knopStatus” en “a” hebben nu nog geen waarde, maar Arduino zal ze herkennen als een ledige waarde. Dit wil zeggen dat wanneer de waarde van het woord gevraagd voor er iets aan toegekend is, Arduino deze zal definiëren als een grootheid nul.

Notities:

We maken steeds een onderscheid tussen woorden die gelijk gesteld zijn aan uitgangen van Arduino en variabelen. Voor de verwerkers is er echter geen onderscheid. “knopStatus = 12;” en “ledRood = 12 ;” is voor de verwerker gelijk. Acties zoals “digitalWrite( knopStatus , HIGH);” en 
“digitalWrite( ledRood , HIGH);” zullen dus eenzelfde resultaat hebben, mochten beiden gedeclareerd zijn als OUTPUT. Hier zit het verschil tussen beide. De uitgangen zullen we nog moeten declareren, terwijl dit voor de variabelen niet nodig is.

Opbouw:

In de void setup declareren we onze ledRood als een OUTPUT. De knop die we zullen schakelen is natuurlijk geen OUTPUT. We willen geen data versturen naar de knop, maar juist ( in dit geval binaire ) data ontvangen. Arduino moet dit natuurlijk weten, daarom declareren we onze knop als INPUT, als een observerende poort.

knopStatus = digitalRead ( knop );

Allereerst moeten we natuurlijk de status van onze knop inlezen. Omdat dit een binaire component is, zullen we slechts twee verschillende waardes kunnen opvragen. LOW wanneer de knop open is en HIGH wanneer de knop gesloten is. Respectievelijk zal de opgeslagen waarde 0 en 1 bedragen. 

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

Onze eerste if-functie zal geactiveerd worden wanneer er aan twee voorwaarden voldaan is: de knop moet worden ingedrukt en “a” moet gelijk zijn aan nul. Wanneer deze twee voorwaarden voldaan zijn, dan zal de led branden, maar zal ook “a” gelijk gesteld worden aan één. Dit doen we zodat wanneer de knop nogmaals ingedrukt wordt dat niet deze, maar de andere if-functie geactiveerd zal worden.

Notities:

Hoewel de opgeslagen waarde van de knop 0 of 1 zal zijn, mag je toch de gelijkheid met ‘HIGH’ en ‘ LOW’ testen. Arduino herkent namelijk ‘HIGH’ als 1 en ‘LOW’ als 0.

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

}

knopStatus = digitalRead ( knop );

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

}

Tussen beide if-functie word nogmaals gecontroleerd welke waarde de knop doorgeeft. Deze lijn is zeer belangrijk! Mocht deze hier niet staan, dan zou het programma direct de tweede if-functie activeren, ook als de knop niet ingedrukt is. De waarde van knopStatus is echter nog steeds “HIGH” en we hebben nergens gevraagd om deze te wijzigen of nogmaals te checken. Dit doen we dus hier, vlak voordat we controleren of de tweede if-functie geactiveerd mag worden.

Tot slot, wanneer we een tweede maal op de knop duwen, wordt de tweede if-functie geactiveerd. Hier wordt de led uitgeschakeld en “a” weer gelijk gesteld aan nul. Vervolgens wordt de eerste if-functie opnieuw geactiveerd wanneer de knop nogmaals ingedrukt wordt.

Notities:

We gebruiken hier een dubbele voorwaarde in onze if-functies. Dit geeft tot gevolg dat we wel degelijk een drukknop hebben. Mochten we het integer “a” niet gebruiken en wat aanpassingen maken aan het programma, dan zou de led alleen maar branden als de knop ingedrukt is, maar nooit als deze niet ingedrukt is.

Voor meer uitleg over de gebruikte commando’s, pinMode(); , digitalRead(); , digitalWrite(); en delay(); kunnen jullie onze sectie commando’s raadplegen.

Normaal gezien zouden nu beetje bij beetje alle stukjes op hun plaats moeten vallen. We nemen nu nog een kijkje naar de code voor het programmeren van onze drukknop.

Code:

// Eerst zetten we onze woorden om in taal die Arduino begrijpt.

int ledRood =12; 
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 ( 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 ( ledRood, HIGH);              // schakel ‘ledRood’ aan.

a =1;            // zet integer ‘a’ gelijk aan 1.
delay(500);
}

knopStatus = digitalRead ( knop );          // lees de status van de knop opnieuw en sla deze op in “kopStatus”
if ( knopStatus == HIGH && a ==1){        // als de knop ingedrukt is EN ‘a’ is gelijk aan 1 :
digitalWrite ( ledRood , LOW);                 // schakel ‘ledRood’ uit.

a=0;               // zet integer ‘a’ gelijk aan 0.
delay(500);
}
}

Schakeling:

We hebben ondertussen het programmeren van de drukknop al een beetje onder de knie, tenslotte werpen we een blik op de schakeling.

We schakelen een led met een weerstand van 200 ohm in serie. Ook bij de knop is er weerstand nodig, dit om een gesloten kring ( van + naar – ) te hebben. Omdat we het signaal naar de poort zo krachtig mogelijk willen maken, zoveel mogelijk van de stroom naar de poort willen brengen, schakelen we een grote weerstand parallel met de kabel naar de poort. Hier is er weerstand van 100 000 ohm gebruikt.

Programmeren drukknop
16.6%

Probeer ook zeker eens een schakeling te veranderen zodat we het gevolg hebben dat beschreven staat in ” Waarom gebruiken we een dubbele voorwaarde?”

Geen vragen meer? Laat ze gerust achter, of ga door naar les 3!

Geplaatst in Programmeren Arduino voor dummies.

Geef een reactie

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