// Verschillende aan en uit tijd via millis.
#define ledGroen 8               //  Groene led.
const long aanTijdGroen = 80;     //  Aantijd ledGroen.
const long uitTijdGroen = 920;    //  Uittijd ledGroen.
long intervalTijd = 0;            //  Wordt gebruikt in millis-code.
int ledState = HIGH;              //  Status van de groene led.
// fade in en uit via millis.
#define ledRood 10                // Rode led.
int knipperIntervalLed = 5;      // Dit is de snelheid van het in of uit faden.
unsigned long resetLed = 0;       // Wordt gebruikt in millis-code.
int brigthness = 0;               // Dit is de waarde gestuurt naar de led. 0 tot 255 tot 0 enz.
int fadeamount = 5;               // Dit is de grote van de stap waarmee de waarde op of afteld.
// Ledstate machine met millis.
#define roodLed 5                // Rode led.
#define yellowLed 7             // Gele led.
#define groenLed 6              // Groene led.
#define button 3                  // Drukknop.
int intervalIf = 50;              // Intervaltijd if-functie.
unsigned long reset = 0;          // Wordt gebruikt in millis-code.
int state = 0;                    // debounce drukknop.
bool flag = true;
void setup() {
  Serial.begin(115200);
  pinMode(ledRood, OUTPUT);       // Rode led fade in en uit.
  pinMode(ledGroen, OUTPUT);      // Groene led aan en uit via millis.
  pinMode(roodLed, OUTPUT);      // Groene led Ledstate machine.
  pinMode(yellowLed, OUTPUT);     // Gele led Ledstate machine.
  pinMode(groenLed, OUTPUT);     // Gele led Ledstate machine.
  pinMode(button, INPUT);         // lezen van drukknop.
  digitalWrite(roodLed, LOW);    // set initial als off.
  digitalWrite(yellowLed, LOW);   // set initial als off.
  digitalWrite(groenLed, LOW);   // set initial als off.
}
void loop() {
  if (digitalRead(button) == 1) {
    if (millis() - reset >= intervalIf && flag) {  // let hier op de dubbele conditie!
      state ++;
      flag = false;
    }
  } else {
    reset = millis();
    flag = true;
  }
  // Ledstate machine.
  switch (state) {                           //
    case 1:                                  // Als state = 1
      digitalWrite(roodLed, HIGH);           // zet roodLed off.
      digitalWrite(yellowLed, LOW);         // zet yellowLed off.
      digitalWrite(groenLed, LOW);          // zet groenLed off.
      break;
    case 2:                                  // Als state = 2.
      digitalWrite(roodLed, LOW);           // zet roodLed off.
      digitalWrite(yellowLed, LOW);         // zet yellowLed off.
      digitalWrite(groenLed, HIGH);          // zet groenLed off.
      break;
    case 3:                                  // Als state = 3.
      digitalWrite(roodLed, LOW);           // zet roodLed off.
      digitalWrite(yellowLed, HIGH);         // zet yellowLed off.
      digitalWrite(groenLed, LOW);          // zet groenLed off.
      break;
    case 4:                                  // Als state is niet 1, 2, 3,
      digitalWrite(roodLed, HIGH);           // zet roodLed off.
      digitalWrite(yellowLed, HIGH);         // zet yellowLed off.
      digitalWrite(groenLed, HIGH);          // zet groenLed off.
      break;
    case 5:                                  // Als state is niet 1, 2, 3, 4
      digitalWrite(roodLed, LOW);           // zet roodLed off.
      digitalWrite(yellowLed, LOW);         // zet yellowLed off.
      digitalWrite(groenLed, LOW);          // zet groenLed off.
      break;
    case 6:
      state = 1 ;
      break;
    default:
      // is voor fouten op te vangen
      break;
  }
  // fade in en uit via millis.
  if (millis() - resetLed > knipperIntervalLed) {
    analogWrite(ledRood, brigthness);
    brigthness = brigthness + fadeamount ;
    resetLed = millis();
    //Serial.println(brigthness);
    if (brigthness == 0 || brigthness == 255) {   // OR - Functie
      fadeamount = -fadeamount;
    }
  }
  // Verschillende aan en uit tijd via millis.
  if (ledState == HIGH) {
    if (millis() - intervalTijd >= aanTijdGroen) {
      ledState = LOW;
      intervalTijd = millis();
    }
  }
  else {
    if (millis() - intervalTijd >= uitTijdGroen) {
      ledState = HIGH;
      intervalTijd = millis();
    }
  }
  digitalWrite(ledGroen, ledState);
}