/*  Volkomen rood kruispunt
    Sketch voor een kruispunt met 1 verkeerslicht voor auto's
    en 1 verkeerslicht voor fietsers
*/

const int autoRood = 2;       // rood licht autoweg
const int autoOranje = 3;     // oranje licht autoweg
const int autoGroen = 4;      // groen licht autoweg
const int fietsRood = 5;      // rood licht fietspad
const int fietsOranje = 6;    // oranje licht fietspad
const int fietsGroen = 7;     // groen licht fietspad
const int lichtDrempel = 100; // de grens donker/licht
const int accel = 5;        // vermenigvuldigingsfactor om testen sneller te doen

// variabele voor de LDR-ingang
int sensorPin = A1;

// variabele voor de waarde van de LDR
int sensorLevel = 0;

void setup(){
  // initialiseer alle gebruikte poorten
  pinMode(autoRood,OUTPUT);
  pinMode(autoOranje,OUTPUT);
  pinMode(autoGroen,OUTPUT);
  pinMode(fietsRood,OUTPUT);
  pinMode(fietsOranje,OUTPUT);
  pinMode(fietsGroen,OUTPUT);
  pinMode(sensorPin, INPUT);

  // begin met alle lichten op oranje
  digitalWrite(autoRood, LOW);
  digitalWrite(autoOranje, HIGH);
  digitalWrite(autoGroen, LOW);
  digitalWrite(fietsRood, LOW);
  digitalWrite(fietsOranje, HIGH);
  digitalWrite(fietsGroen, LOW);
  delay(35*accel);  // wacht 3.5 seconden voor alle lichten op rood gaan

  digitalWrite(autoRood, HIGH);
  digitalWrite(autoOranje, LOW);
  digitalWrite(autoGroen, LOW);
  digitalWrite(fietsRood, HIGH);
  digitalWrite(fietsOranje, LOW);
  digitalWrite(fietsGroen, LOW);
  delay(30*accel);  // wacht 3 seconden en geef de auto's groen licht

  digitalWrite(autoRood, LOW);
  digitalWrite(autoOranje, LOW);
  digitalWrite(autoGroen, HIGH);
  digitalWrite(fietsRood, HIGH);
  digitalWrite(fietsOranje, LOW);
  digitalWrite(fietsGroen, LOW);
}

void loop(){
  // lees de waarde van de LDR:
  sensorLevel = analogRead(sensorPin);

  // controleer of het lichtniveau boven de drempelwaarde ligt
  if (sensorLevel > lichtDrempel){
    // cyclus start; het is licht, of er komt een fiets aan
      digitalWrite(autoRood, LOW);
      digitalWrite(autoOranje, HIGH); // auto op oranje
      digitalWrite(autoGroen, LOW);
      digitalWrite(fietsRood, HIGH);  // fiets nog rood
      digitalWrite(fietsOranje, LOW);
      digitalWrite(fietsGroen, LOW);
      delay(35*accel);                  // wacht 3.5 seconden

      digitalWrite(autoRood, HIGH);     // auto op rood
      digitalWrite(autoOranje, LOW);
      digitalWrite(autoGroen, LOW);
      digitalWrite(fietsRood, HIGH);    // fiets nu ook rood
      digitalWrite(fietsOranje, LOW);
      digitalWrite(fietsGroen, LOW);
      delay(10*accel);                  // 1 seconde alles rood om kruispunt vrij te maken
    
      digitalWrite(autoRood, HIGH);     // auto op rood
      digitalWrite(autoOranje, LOW);
      digitalWrite(autoGroen, LOW);
      digitalWrite(fietsRood, LOW);
      digitalWrite(fietsOranje, LOW);
      digitalWrite(fietsGroen, HIGH);   // fiets nu groen
      delay(200*accel);                 // wacht 20 seconden

      digitalWrite(autoRood, HIGH);     // auto op rood
      digitalWrite(autoOranje, LOW);
      digitalWrite(autoGroen, LOW);
      digitalWrite(fietsRood, LOW);
      digitalWrite(fietsOranje, HIGH);  // fiets nu oranje
      digitalWrite(fietsGroen, LOW);
      delay(35*accel);                  // wacht 3.5 seconden

      digitalWrite(autoRood, HIGH);     // auto op rood
      digitalWrite(autoOranje, LOW);
      digitalWrite(autoGroen, LOW);
      digitalWrite(fietsRood, HIGH);    // fiets nu ook rood
      digitalWrite(fietsOranje, LOW);
      digitalWrite(fietsGroen, LOW);
      delay(10*accel);                  // 1 seconde alles rood om kruispunt vrij te maken

      digitalWrite(autoRood, LOW);
      digitalWrite(autoOranje, LOW);
      digitalWrite(autoGroen, HIGH);    // auto op groen
      digitalWrite(fietsRood, HIGH);    // fiets nu rood
      digitalWrite(fietsOranje, LOW);
      digitalWrite(fietsGroen, LOW);
      delay(1200*accel);                // wacht 2 minuten voor de volgende ronde

  } else {
    // het is donker, geef auto groen
      digitalWrite(autoRood, LOW);
      digitalWrite(autoOranje, LOW);
      digitalWrite(autoGroen, HIGH);    // auto op groen
      digitalWrite(fietsRood, HIGH);    // fiets nu rood
      digitalWrite(fietsOranje, LOW);
      digitalWrite(fietsGroen, LOW);
  }
}