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