We gaan verder waar we gebleven zijn op basis van Simpel Stoplicht
Leuk dat we een stoplicht hebben, maar wat als er een voetganger staat te wachten?
Juist, die wil op een knopje kunnen drukken. Anders zou het licht voor auto’s ook op rood gaan als er helemaal niemand staat te wachten.
Benodigdheden
- 5x 220 Ohms weerstand
- 2x Rode led
- Gele led
- 2x Groene led
- Drukknop
- 10K Ohms weerstand
Sketch
Eerst voegen we de informatie van de knop toe, deze zit op een bepaalde pin aangesloten en willen we standaard in de ‘uit’ stand zetten als je er niet op drukt.
int button = 2; // de knop schakelen we via pin 2 int buttonValue = 0; // de knop is in rust 'uit'
Verder voegen we een eenvoudig stoplicht toe voor de voetgangers en definiëren we twee andere variabelen die we later nodig hebben.
int pedred = 10; int pedgreen = 9; int crosstime = 5000; // tijd die voetgangers hebben om over te steken unsigned long changeTime ; // bewaart de tijd sinds de knop is ingedrukt
Voeg nu onderstaande code aan de setup() functie toe. Dit zorgt er voor dat het programma weet dat de knop ‘Switch’ een in input mode moet staan.
pinMode(button,INPUT); pinMode(pedred,OUTPUT); pinMode(pedgreen,OUTPUT); digitalWrite(pedred,HIGH); // standaard staat het voetgangerslicht op rood
Vervang de hele loop() functie.
We wachten tot de knop wordt ingedrukt. Zodra dat het geval is zetten we de auto’s stil en mogen de voetgangers gaan lopen. Na enige tijd (via een variabele in te stellen) laten we het licht knipperen zodat de voetgangers weten dat ze moeten doorlopen. Na een korte periode krijgen de auto’s ook weer rood.
void loop(){ // indien de knop voor het laatst 'LOW' was, controleren we of hij 'HIGH' is en bewaren dit if (buttonValue == LOW) { buttonValue = digitalRead(button); } // indien de status van de knop HIGH is, ofwel ingedrukt dan wisselen we de stoplichten if (buttonValue == HIGH && (millis() - changeTime) > 5000) { // Oranje aan, groen uit, wacht 2 seconden. digitalWrite(cargreen,LOW); digitalWrite(caryellow,HIGH); delay(2000); // rood aan, oranje uit digitalWrite(caryellow,LOW); digitalWrite(carred,HIGH); // voetgangers krijgen nu groen digitalWrite(pedred,LOW); digitalWrite(pedgreen,HIGH); delay(crosstime); // wacht totdat de tijd voorbij is die we eerder ingesteld hebben //flashing of ped green light for (int x=0; x<10; x++){ digitalWrite(pedgreen,HIGH); delay(250); digitalWrite(pedgreen,LOW); delay(250); } digitalWrite(pedred, HIGH); //voetgangers krijgen rood delay(100); digitalWrite(cargreen,HIGH); //auto's groen digitalWrite(carred,LOW); //rode auto licht uit changeTime = millis(); //onthouden hoe lang het geleden is dat de knop is ingedrukt buttonValue = LOW; // reset de knop ter naar 'LOW' } }