/*
  Ampel
 
 emulates traffic lights. when pressing a pushbutton attached to pin 2. 
 
 The circuit:
 * LEDs attached from pin 8-12 to ground 
 * pushbutton attached to pin 2 from +5V
 * 10K resistor attached to pin 2 from ground
 
 created 2012
 by hennisoft <http://www.hennisoft.de>
 modified 07 Nov 2012 by
 Henning Buchholz
 
 This example code is in the public domain.
 Based on:
 http://www.arduino.cc/en/Tutorial/Button
 */

// constants won't change. They're used here to 
// set pin numbers:
const int buttonPin = 2; // the number of the pushbutton pin

const int ledRot       = 12;
const int ledGelb      = 11;
const int ledGruen     = 10;
const int ledRotFuss   = 9;
const int ledGruenFuss = 8;

const int warten = 2000;  // Wartezeit bis Fussganger gruen haben
const int phase = 6000;   // Gruenphase fuer Fussganger

// variables will change:
int buttonState = 0;      // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledRot, OUTPUT);  
  pinMode(ledGelb, OUTPUT);
  pinMode(ledGruen, OUTPUT);
  pinMode(ledRotFuss, OUTPUT);
  pinMode(ledGruenFuss, OUTPUT);  
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);     
}

void loop(){
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  
  digitalWrite(ledGruen, HIGH);
  digitalWrite(ledGelb, LOW);
  digitalWrite(ledRot, LOW);
  digitalWrite(ledRotFuss, HIGH);
  digitalWrite(ledGruenFuss, LOW);
  
  // if button is pushed
  if (buttonState == LOW) {     
   gedrueckt();
  } 
  
}

void gedrueckt(){
  // warten bis gruen wird ...
  delay(warten);
  
  // Uebergangsphase Auto (rot -> gelb)
  digitalWrite(ledRot, LOW);
  digitalWrite(ledGelb, HIGH);
  digitalWrite(ledGruen, LOW);
  delay(3000);
  
  // Autos rot
  digitalWrite(ledRot, HIGH);
  digitalWrite(ledGelb, LOW);
  digitalWrite(ledGruen, LOW);
  delay(1500); // Sicherheitszeit
  
  // Fussgaenger gruen
  digitalWrite(ledGruenFuss, HIGH);
  digitalWrite(ledRotFuss, LOW);  
  delay(phase);
  
  // Uebergagsphase Fussgaenger (gruen blinkt)
  for(int i = 0; i < 5; i++){
    digitalWrite(ledGruenFuss, LOW);
    delay(300);
    digitalWrite(ledGruenFuss, HIGH);
    delay(300);
  } 
  // Fussgaenger rot
  digitalWrite(ledRotFuss, HIGH);
  digitalWrite(ledGruenFuss, LOW);
  delay(1000);
  
  // Uebergangsphase Auto (gelb)
  digitalWrite(ledGelb, HIGH);
  delay(3000);
}