sketch_35_ampel

sketch_35_ampel
  /*Eine Baustellenampel (Bst) ist staendig auf Rot und wird nur auf Gruen geschaltet, wenn sich ein 
  Baufahrzeug naehert. Das wird durch einen US-Sensor erfasst.
  Gleichzeitig wird die Ampel der Einbahnstrasse (Str) auf Rot geschaltet.
  Nach einer gewissen Zeit wird wieder umgeschaltet.*/
  
  /*Definition von globalen Variablen (sie gelten fuer den gesamten Sketch)*/
  int RotBst = 2;
  int GelbBst = 3;
  int GruenBst = 4;
  int RotStr = 5;
  int GelbStr = 6;
  int GruenStr = 7;
  int Trig = 11;
  int Echo = 12;  
  char x;                             //in der Variablen x wird gespeichert, ob die Entfernung <30cm ist.
  
  void setup() 
  {
   pinMode(RotBst, OUTPUT);       
   pinMode(GelbBst, OUTPUT);
   pinMode(GruenBst, OUTPUT);
   pinMode(RotStr, OUTPUT);
   pinMode(GelbStr, OUTPUT);
   pinMode(GruenStr, OUTPUT);
   pinMode (Trig, OUTPUT);
   pinMode (Echo, INPUT);
  
   digitalWrite (RotBst, HIGH);       //zum Programmstart steht die Baustellenampel auf rot
   digitalWrite (GelbBst, LOW);
   digitalWrite (GruenBst, LOW);
   digitalWrite (RotStr, LOW);
   digitalWrite (GelbStr, LOW);
   digitalWrite (GruenStr, HIGH);     //zum Programmstart steht die Strassenampel auf gruen
  
   Serial.begin (9600); 
   Serial.println ("Programmstart");  //Anzeige im Serial Monitor (muss auf 9600 eingestellt sein!)
  }
  
  void uss()
  {
  /*Es wird die Entfernung vom Auto zum Ultraschallsensor HC-SR04 gemessen und im Serial Monitor angezeigt.
    Wenn die Entfernung <30cm ist, wird die Variable x auf "1" gesetzt.
  /*Zunaechst werden einige Variablen definiert (lokale Variablen, sie gelten nur innerhalb von void loop)*/
    long dauer=0;                     // in dieser Variablen wird die Zeit gespeichert, die eine Schallwelle bis zur Reflektion und zurueck benoetigt 
    long entfernung=0;                // in dieser Variablen soll die berechnete Entfernung gespeichert werden.  
  /*Dieser Programmteil ermittelt die Entferung zu einem Hindernis*/
    digitalWrite(Trig, LOW);          //Die Spannung wird fuer kurze Zeit vom Trig-Pin genommen, fuer ein rauschfreies Signal beim Senden 
    delay(5);                         //fuer die Dauer 5 Millisekunden
    digitalWrite(Trig, HIGH);         //Ein HIGH-Signal wird zum Trig-Eingang des HC-SR04 gesendet
    delayMicroseconds(15);            //Die Dauer muss mindestens 10 Mikrosekunden sein, hier gewaehlt 15
    digitalWrite(Trig, LOW);          //Wenn das Trig-Signal wieder auf LOW geht, sendet der HC-SR04 Ultraschallwellen aus (8mal, Frequenz 40kHz)
    dauer = pulseIn(Echo, HIGH);      //Der Arduino zaehlt die Zeit in Mikrosekunden, bis der reflektierte Schall zum Ultraschallsensor zurueckkehrt
    entfernung = (dauer/2) * 0.03432; //Nun wird aus der Zeit die Entfernung in Zentimetern berechnet (Bsp.: 10ms entspricht Entfernung 170cm)
    Serial.print(entfernung);         //Der Wert der Entfernung wird an den Serial Monitor uebergeben
    Serial.println(" cm");            // Hinter dem Wert der Entfernung soll die Einheit cm angegeben sowie die Anzeigezeile gewechselt werden (CR)
    if (entfernung < 30)              //Wenn der Wert fuer die Entfernung unter 30 Zentimeter betraegt dann... 
    {
    x = 1;
    }
    else
    {
    x = 0;
    }
  }
  
  void loop()
  { 
    uss();                             //Unterprogramm uss() wird aufgerufen
    if (x == 1)                        //wenn x==1 von uss() zurueckgegeben wird, wird die Ampel umgeschaltet
    {
     delay (2000);
     digitalWrite (GelbBst, HIGH); 
     digitalWrite (GruenStr, LOW); 
     digitalWrite (GelbStr, HIGH); 
     delay (3000);
     digitalWrite (GelbBst, LOW);
     digitalWrite (RotBst, LOW);
     digitalWrite (GruenBst, HIGH);
     digitalWrite (GelbStr, LOW); 
     digitalWrite (RotStr, HIGH); 
     delay (7000);
     digitalWrite (GelbBst, HIGH);
     digitalWrite (GruenBst, LOW);
     digitalWrite (GelbStr, HIGH); 
     delay (3000);
     digitalWrite (GelbBst, LOW);
     digitalWrite (RotBst, HIGH);
     digitalWrite (RotStr, LOW); 
     digitalWrite (GelbStr, LOW); 
     digitalWrite (GruenStr, HIGH); 
     delay (6000); 
    }
    else
    {
    delay (1000);
    }
  }