Verkeerssituatie met voetgangersoversteekplaats

 

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.

Geef een reactie