In deze oefening wordt er gebruik gemaakt van een drukknop.
De tussen de Anode van de LED’s en de uitgangen van de Arduino™ komen 100 Ohm weerstanden. Tussen de GND en één van de aansluitingen van de drukknop, samen met een ingang van de Arduino™ komt een 10k weerstand.
// Verkeerslichten met voetgangersoversteekplaats int autoRed = 12; // rode verkeerslicht voor de auto op pin 12 int autoYellow = 11; // gele verkeerslicht voor de auto op pin 11 int autoGreen = 10; // groene verkeerslicht voor de auto op pin 10 int voetRed = 9; // rode verkeerslicht voor de voetgangers op pin 9 int voetGreen = 8; // groene verkeerslicht voor de voetgangers op pin 8 int drukknop = 2; // drukknop op pin 2 // maximale tijd voor de voetgangers om over te steken int oversteekTijd = 5000; // tijd sinds de voetgangers cyclus is geweest unsigned long veranderTijd = 0; void setup() { pinMode(autoRed, OUTPUT); // pin 12 instellen als uitgang pinMode(autoYellow, OUTPUT); // pin 11 instellen als uitgang pinMode(autoGreen, OUTPUT); // pin 10 instellen als uitgang pinMode(voetRed, OUTPUT); // pin 9 instellen als uitgang pinMode(voetGreen, OUTPUT); // pin 8 instellen als uitgang pinMode(drukknop, INPUT); // pin 2 instellen als ingang // zet het groene licht aan voor de auto’s en het rode licht voor de voetgangers digitalWrite(autoGreen, HIGH); digitalWrite(voetRed, HIGH); } void loop() { // sla HIGH (knop ingedrukt) of LOW (knop niet ingedrukt) op in de variabele “status” int status = digitalRead(drukknop); /* controleer of de drukknop ingedrukt is en of het langer dan 5 seconden heeft geduurd voordat de drukknop ingedrukt is geweest. */ if (status == HIGH && (millis() - veranderTijd) > 5000) { // draai de inhoud van de functie andereLamp af andereLamp(); } } void andereLamp() { digitalWrite(autoGreen, LOW); // groen uit digitalWrite(autoYellow, HIGH); // geel aan delay(2000); // wacht 2 seconden digitalWrite(autoYellow, LOW); // geel uit digitalWrite(autoRed, HIGH); // rood aan // wacht 1 seconde totdat het veilig is om over te steken. delay(1000); digitalWrite(voetRed, LOW); // rood voor voetgangers uit digitalWrite(voetGreen, HIGH); // groen voor voetgangers aan // wacht totdat de ingestelde tijd van 5 seconden is verstreken delay(oversteekTijd); // knipper het groene licht 10 keer for (int x=0; x<10; x++) { digitalWrite(voetGreen, HIGH); // groen aan delay(250); // wacht een kwart van een seconde digitalWrite(voetGreen, LOW); // groen uit delay(250); // wacht een kwart van een seconde } // Zet het verkeerslicht voor voetgangers op rood digitalWrite(voetRed, HIGH); // rood aan delay(500); // wacht een halve seconde digitalWrite(autoYellow, HIGH); // geel aan digitalWrite(autoRed, LOW); // rood uit delay(1000); // wacht 1 seconde digitalWrite(autoGreen, HIGH); // groen aan digitalWrite(autoYellow, LOW); // geel uit // sla de tijd op in millis sinds de laatste keer dat de lichten zijn veranderd veranderTijd = millis(); // loop wordt vanaf hier herhaald }
In deze oefening komen codes voor van het voorbeeld: knipperen van een led en de Morse code met FOR loop.
Laten we even kijken naar de nieuwe codes in deze oefening.
unsigned long veranderTijd = 0;
Long is een data type voor een variabele waarin een getal van −2,147,483,648 tot 2,147,483,647 kan worden opgeslagen.
In een unsigned long variabele kunnen geen negatieve getallen worden opgeslagen, dus het getal dat in de variabele veranderTijd opgeslagen kan worden gaat van 0 tot 4,294,967,295.
De reden dat we geen integer gebruiken is omdat het data type integer een kleinere capaciteit heeft.
Als de tijd voorbij de capaciteit zou gaan en de variabele veranderTijd dus zou overlopen, kan het programma vreemd gedrag gaan vertonen.
veranderTijd wordt gestart vanaf 0.
4,294,967,295 * 1ms = 4,294,967 seconds
4,294,967 seconds = 71,582 minutes
71,582 minutes = 1,193 hours
1,193 hours = 49 days
Het is onwaarschijnlijk dat er binnen 49 dagen niemand een keer op de voetgangersknop drukt. unsigned long is dus de beste keuze omdat het de grootste capaciteit heeft.
pinMode(drukknop, INPUT);
Pin 2 waar de drukknop op aangesloten is wordt ingesteld als een ingang.
int status = digitalRead(drukknop);
Controleert constant op pin 2 of de drukknop ingedrukt wordt of niet.
In plaats van een integer (int) kan ook boolean gebruikt worden om geheugen te sparen. Een boolean geeft een 1 of een 0 terug, oftewel aan of uit (HIGH of LOW).
if (status == HIGH && (millis() - veranderTijd) > 5000) { // roep de functie andereLamp aan andereLamp(); }
Een if commando controleert of er aan een bepaalde voorwaarde voldaan wordt en onderneemt actie als dit zo is.
In dit geval wordt er gekeken of de knop is ingedrukt EN er al 5 seconden verstreken zijn sinds de knop voor de laatste keer is ingedrukt. Alleen wanneer beiden het geval zijn, zal de functie andereLamp gedraaid worden.
Millis is een functie van de Arduino™ die bijhoudt hoeveel milliseconden er zijn verstreken sinds de Arduino™ stroom krijgt.
De variabele veranderTijd zal in eerste instantie 0 zijn omdat dit boven setup is opgegeven.
De veranderTijd variabele wordt aan het einde van de functie andereLamp gevuld met de waarde van millis.
De veranderTijd wordt van millis afgetrokken en pas als er 5 seconden verstreken zijn sinds de functie andereLamp voor het eerst afgedraaid is kan de inhoud van de functie andereLamp opnieuw afgedraaid worden als er op de knop gedrukt wordt.
&& is een logisch EN commando.
|| is een logisch OF commando.
! is een logisch NIET commando.
Deze logische commando’s kunnen in if commando’s gebruikt worden.
If (x==5 && y==10) {…….
De inhoud van het if commando wordt alleen gedraaid als x, 5 is EN y, 10.
If (x==5 || y==10) {…….
De inhoud van het if commando wordt gedraaid als x, 5 is OF y, 10.
If (!x) {…….
De inhoud van het if commando wordt gedraaid zolang de variabele x NIET gebruikt wordt.
if (x==5 && (y==10 || z==25)) {…….
De inhoud van het if commando wordt gedraaid als x, 5 is en y, 10 of z, 25. Tussen ( en ) kan je meer variabelen toevoegen aan een if statement.
andereLamp();
Roept de functie andereLamp aan. Het programma stopt bij de regel waarin een functie aangehaald wordt, draait de inhoud van de functie en keert dan weer terug naar de regel waar de functie aangehaald wordt en draait vanaf daar weer verder.