/*
Programm: Ampelsystem
Funktion: Ein System welches eine Ampelschaltung mit Fußgänger und Auto Ampel Reguliert.
Autor: Max Koppe
Datum: 13.03.2024
Pin-Belegung:
LEDs:
Auto-Ampel:
LED-Rot: pin 7
LED-Gelb: pin 6
LED-Grün: pin 5
Fußgänger-Ampel:
LED-Rot: pin 9
LED-Grün: pin 8
Blitzer:
LED-Weiß: pin 12
Ultraschall-Sensor:
Trigger: pin 4
Echo: pin 3
Buzzer:
Buzzer: pin 13
Button:
buttonAmpel = pin 11
buttonTon = pin 2
*/
const int ledsAuto[] = {5, 6, 7};
const int ledsMensch[] = {8, 9};
const int ultraTRIG = 4;
const int ultraECHO = 3;
const int blitzer = 12;
const int buzzer = 13;
const int buttonAmpel = 11;
const int buttonTon = 2;
unsigned long wait = 0;
unsigned long fahrzeugGruen = millis();
unsigned long lastSoundTime = millis();
int speedUp = 2;
bool doBuzz = true;
// Funktion zur Überprüfung des Näherungssensors
void checkSensor(int i){
unsigned long loopStart = millis();
unsigned long loopEnd = millis();
unsigned long loopDuration = loopEnd - loopStart;
int duration = 0;
int distance = 100;
while(loopDuration < i){
digitalWrite(ultraTRIG, LOW);
delayMicroseconds(2);
digitalWrite(ultraTRIG, HIGH);
delayMicroseconds(10);
digitalWrite(ultraTRIG, LOW);
duration = pulseIn(ultraECHO, HIGH);
distance = (duration*.0343)/2;
if(distance < 2){
digitalWrite(blitzer, HIGH);
delay(200);
digitalWrite(blitzer, LOW);
}
loopEnd = millis();
buzz();
loopDuration = loopEnd - loopStart;
}
}
// Funktion zur Erzeugung des Tons
void buzz(){
if(digitalRead(buttonTon) == HIGH){
doBuzz = !doBuzz;
delay(200);
}
if(doBuzz){
if (digitalRead(ledsAuto[2]) == HIGH) {
if (millis() - lastSoundTime >= 2000) {
// Buzzer alle 2 Sekunden auslösen
digitalWrite(buzzer, HIGH);
delay(100); // Buzzer Tonlänge
digitalWrite(buzzer, LOW);
lastSoundTime = millis();
}
}else {
if (millis() - lastSoundTime >= 500) {
// Buzzer alle 0,5 Sekunden auslösen
digitalWrite(buzzer, HIGH);
delay(100); // Buzzer Tonlänge
digitalWrite(buzzer, LOW);
lastSoundTime = millis();
}
}
}
}
// Funktion zur Steuerung der Ampelphasen
void phase(){
digitalWrite(ledsAuto[0], LOW);
digitalWrite(ledsAuto[1], HIGH);
delay(2000);
digitalWrite(ledsAuto[1], LOW);
digitalWrite(ledsAuto[2], HIGH);
digitalWrite(ledsMensch[0], HIGH);
digitalWrite(ledsMensch[1], LOW);
//delay(12000);
checkSensor(12000/speedUp);
digitalWrite(ledsMensch[0], LOW);
digitalWrite(ledsMensch[1], HIGH);
//delay(3000);
checkSensor(3000/speedUp);
digitalWrite(ledsAuto[1], HIGH);
//delay(3000);
checkSensor(3000/speedUp);
digitalWrite(ledsAuto[1], LOW);
digitalWrite(ledsAuto[2], LOW);
digitalWrite(ledsAuto[0], HIGH);
fahrzeugGruen = millis();
}
// Einrichten der Pins und Initialisierung
void setup() {
Serial.begin(9600);
Serial.println(fahrzeugGruen);
for(int i = 0; i < 3; i++){
pinMode(ledsAuto[i], OUTPUT);
}
for(int i = 0; i < 2; i++){
pinMode(ledsMensch[i], OUTPUT);
}
pinMode(buttonAmpel, INPUT);
pinMode(buttonTon, INPUT);
pinMode(ultraTRIG, OUTPUT);
pinMode(ultraECHO, INPUT);
pinMode(blitzer, OUTPUT);
pinMode(buzzer, OUTPUT);
digitalWrite(buttonAmpel, LOW);
digitalWrite(buttonTon, LOW);
}
void loop() {
digitalWrite(ledsAuto[0], HIGH);
digitalWrite(ledsMensch[1], HIGH);
if(digitalRead(buttonAmpel) == HIGH){
unsigned long currentTime = millis();
unsigned long fahrzeugGruenDauer = currentTime - fahrzeugGruen;
if( fahrzeugGruenDauer < 30000/speedUp){
Serial.println("1");
wait = (30000/speedUp - fahrzeugGruenDauer);
checkSensor(wait);
phase();
}
else{
Serial.println("2");
checkSensor(10000/speedUp);
phase();
}
}
buzz();
}