Stoplicht deel 2

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'
  }
}