De eerste tutorials tonen telkens een bepaalde functie die een oneindig aantal keer herhaald zal worden. Als je geen controle structuren gebruikt ben je in de mogelijkheden beperkt. Je kan dan namelijk enkel verschillende instructie achtereenvolgens uitvoeren met een te kiezen tussentijd dankzij een delay.
Dankzij gebruik te maken van een controle structuur kan je bepaalde stukken code overslaan of een aantal keer na elkaar uitvoeren of aan de hand van een of meer voorwaarden een bepaald stuk uitvoeren of … kortom het zorgt ervoor dat de mogelijkheden voor het schrijven van een programma enorm veel uitbreiding kent.
Gebruik : Op basis van inputs bepaalde stukken code al dan niet uitvoeren.
Mogelijkheden : Verschillende controle structuren ontdekken.
Tijdens deze uitgebreidere tutorial gaan we verschillende zaken testen, hiervoor gebruiken we bijna alle hardware aanwezig op het shield. Dit kan je verwezenlijken door voor de setup alle inputs en outputs een naam te geven en aan de software te laten weten op welke arduino pin deze aangesloten zijn.
Daarna moet er in setup gezegd worden of de aangesloten component een input of output is. Sensoren zijn inputs zoals de potentiometer die de stand meet van de loper, zoals de NTC die temperatuurafhankelijk een spanning zal genereren, de drukknoppen die meten of je hen indrukt, … De andere zaken zijn outputs zoals de LEDS, de buzzer.
initiele setup : Welke hardware zal worden gebruikt
Begin een nieuw programma en vervang het void setup() { } gedeelte door onderstaande code.
int LEDG1 = 2;
int LEDO1 = 18;
int LEDR1 = 17;
int LEDG2 = 5;
int LEDO2 = 4;
int LEDR2 = 3;
int LEDIR = 7;
int SERVO = 6;
int BUZZ = 13;
int SWITCH = 8;
int BUTTON1 = 9;
int BUTTON2 = 10;
int BUTTON3 = 11;
int BUTTON4 = 12;
int ToestandSWITCH = 0;
int ToestandBUTTON1 = 0;
int ToestandBUTTON2 = 0;
int ToestandBUTTON3 = 0;
int ToestandBUTTON4 = 0;
int TRIM = A0;
int NTC = A1;
int LICHTDET = A2;
void setup() {
pinMode(LEDG1,OUTPUT);
pinMode(LEDO1,OUTPUT);
pinMode(LEDR1,OUTPUT);
pinMode(LEDG2,OUTPUT);
pinMode(LEDO2,OUTPUT);
pinMode(LEDR2,OUTPUT);
pinMode(LEDIR,OUTPUT);
pinMode(SERVO,OUTPUT);
pinMode(BUZZ,OUTPUT);
pinMode(SWITCH,INPUT);
pinMode(BUTTON1,INPUT);
pinMode(BUTTON2,INPUT);
pinMode(BUTTON3,INPUT);
pinMode(BUTTON4,INPUT);
pinMode(TRIM,INPUT); // is niet verplicht
pinMode(NTC,INPUT); // is niet verplicht
pinMode(LICHTDET,INPUT); // is niet verplicht
}
Nu kan je alle hardware dat op het KAEDU STEM shield aanwezig is gebruiken in je programma met uitzondering van het 7-segment display. Het gebruik van dit display zal besproken worden in een apparte tutorial.
IF controlestructuur
In de loop plaatst je eerst een stuk code die zal werken als de IF controlestructuur.
IF : Dit voert een stukje code uit als er aan een bepaalde voorwaarde voldaan werd, als er niet aan de voorwaarde voldaan werd zal de code die zich in de IF bevindt niet uitgevoerd worden. Bijvoorbeeld als er op knop1 gedrukt wordt dan zal de 2de groene LED branden. Als er niet gedrukt werd dan slaat men de code die de LED aanzet over.
int ToestandBUTTON4 = digitalRead(BUTTON4); // eerst de toestand inlezen
if (ToestandBUTTON4 == HIGH) { // als de knop ingedrukt is
digitalWrite(LEDG2,HIGH); // zet je de led aan
}
Enkel als de knop ingedrukt werd zal de groene LED aangezet worden. Maar waar zet men de verlichting terug uit ?
Kan je het probleem oplossen door ergens de LED terug uit te zetten zodat als de knop ingedrukt is de LED zal branden en als de knop niet ingedrukt is de LED niet zal branden. (Dit kan zonder gebruik te maken van volgende controlestructuur)
IF ELSE controlestructuur
Als er op basis van de vraag iets moet gebeuren bij Waar en iets moet gebeuren bij niet waar is het beter om gebruik te maken van volgende controlestructuur.
Dit is de IF ELSE.
Plaatst volgend stukje code extra in het programma ONDER de code van de IF structuur.
int ToestandBUTTON3 = digitalRead(BUTTON3); //lees de toestand van knop 3
if (ToestandBUTTON3 == HIGH) { // als de knop ingedrukt is
digitalWrite(LEDG1,HIGH); // zet je de led aan
}
else { // in het andere geval
digitalWrite(LEDG1,LOW); // zet je de led uit
}
Als je deze code uittest lijkt het of er niets verandert is, de LED zal nog altijd branden als je de knop indrukt en uitgaan als je de knop loslaat (als je het probleem opgelost hebt bij vorige structuur). Het verschil is dat bij het eerste de LED altijd uitgaat alvorens het programma opnieuw te beginnen via de loop. Bij het tweede programma gaat de LED niet uitgaan zolang je de knop ingedrukt blijft houden. Door ernaar te kijken ga je het verschil niet zien omdat de tijd dat de LED zal uitgaan zeer kort is.
IF ELSE IF … controlestructuur
Deze IF ELSE IF controlestructuur stelt 2 voorwaarden (2 keer if). Want soms is het nodig om als er aan de eerste voorwaarde niet voldaan is er nog een andere voorwaarde gecontroleerd wordt. Bijvoorbeeld als de noodstop is ingedrukt dan moet de machine niet werken werken, anders mag de machine wel werken als de sleutel in aan positie staat, is dit niet het geval dan moet de machine uit zijn. We testen dit uit met de schakelaar en drukknop 2 en de eerste oranje en rode LED.
Plaats volgende code extra bij het programma.
int ToestandBUTTON2 = digitalRead(BUTTON2);
int ToestandSWITCH = digitalRead(SWITCH);
if(ToestandSWITCH == LOW){
digitalWrite(LEDR1,HIGH);
digitalWrite(LEDO1,LOW);
}
else if(ToestandBUTTON2 == HIGH){
digitalWrite(LEDR1,LOW);
digitalWrite(LEDO1,HIGH);
}
else {
digitalWrite(LEDO1,LOW);
digitalWrite(LEDR1,HIGH);
}
Je kan bij de IF ELSE IF ELSE … blijven verdergaan, telkens er niet aan de vorige voorwaarde voldaan is gaat men de volgende voorwaarde controleren. Vanaf er aan een voorwaarde voldaan is controleert men de andere voorwaarden niet meer.
De vragen die gesteld worden moeten niet altijd kijken of een drukknop al dan niet ingedrukt is, je kan ook vragen of een analoge sensorwaarde groter is dan een bepaald getal of lager dan een bepaald getal. Op deze manier worden de mogelijkheden van het programmeren met if else en if else if gevoelig uitgebreid. Bij latere tutorials zal je zien dat IF ELSE IF controlestructuren een van de meest gebruikte structuren zijn van een Arduino programma.
Volgende les : De for lus, een veel gebruikte controlestructuur
Kennis maken met andere mogelijke controlestructuren ? Volg dan de tutorial over de FOR-lus.
Vorige les : Het inlezen van een digitale ingang
Hoe we een drukknop inlezen en met die toestand iets doen staat vermeld in deze tutorial.