/*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);
}
}