#include <TM1637Display.h>     // Bibliothek für die 7- Segment Anzeige

 

#define echo 25                        //Anschluss ECHO vom HC-SR04 wurde für PIN 25 festgelegt

#define trig 33                          //Anschluss TRIG vom HC-SR04 wurde für PIN 33 festgelegt

 

#define display_clk 16               //Anschluss CLK von der Anzeige wurde für PIN 16 festgelegt

#define display_dio 13              //Anschluss DIO von der Anzeige wurde für PIN 13 festgelegt

 

#define passiver_buzzer 27       //Der PIN für den passiven Summer wurde auf 27 festgelegt

 

//Pinbelegung für die H-Brücke

int inc1 = 18;

int inc2 = 19;

int motor = 17;

 

//Entfernung als globale Variable anlegen

int entfernung = 0;

 

//schalter

int schalter = 2;

int schalterStatus = 0;

 

//Pulsweitenmodulation

const int freq = 30000;

const int resolution = 8;

 

 

//Funktion zur Messung der Entfernung über den Ultraschallsensor HC-SR04 (mit Echo und Trigger), Einheit: cm

int getEntfernung()

{

  long entfernung = 1;

  long zeitx = 0;

 

  digitalWrite (trig, LOW);           //setzt den Zustand von trig auf LOW

  delayMicroseconds(3);             //setzt eine Pause/Unterbrechung von 3 Mikrosekunden

  noInterrupts();                         //keine Unterbrechung

  digitalWrite(trig, HIGH);            //setzt den Zustand von trig auf HIGH

  delayMicroseconds(10);           //setzt eine Pause/Unterbrechung von 10 Mikrosekunden

  digitalWrite(trig, LOW);            //setzt den Zustand von trig auf LOW

  zeitx = pulseIn(echo, HIGH);    //setzt den Zustand von echo auf HIGH

  interrupts();                             //unterbricht den Vorgang

  zeitx = (zeitx / 2);                     //teilt die Zeit durch 2

  entfernung = zeitx / 29.1;        //teilt die Restzeit durch die Geschwindigkeit des Schalls

  return (entfernung);                 //gibt die berechnete Entfernung zurück

}

// Funktion zur Antriebssteuerung ---> mit geringer werdendem Abstand soll der Motor langsamer laufen

void antrieb(int entfernung)

{

  if ((entfernung <= 50) && (entfernung >= 25))

  {

    digitalWrite(inc1, LOW);                                //Laufrichtung einstellen

    digitalWrite(inc2, HIGH);                                //

    ledcWrite(2, 230);                                         // Sendet ein Signal an den Channel 2 mit einem Duty Cyle(Auslastungsgrad) von 230

  }

 

  else if ((entfernung <= 24) && (entfernung >= 5))

  {

    digitalWrite(inc1, LOW);                                //Laufrichtung einstellen

    digitalWrite(inc2, HIGH);                                //

    ledcWrite(2, 200);                                         //Sendet ein Signal an den Channel 2 mit einem Duty Cyle(Auslastungsgrad) von 200

  }

 

  else if (entfernung < 5)

  {

    digitalWrite(inc1, LOW);                                //Laufrichtung einstellen

    digitalWrite(inc2, HIGH);                                //

    ledcWrite(2, 0);                                             // Motor steht

  }

 

  else

  {

    digitalWrite(inc1, LOW);                                //Laufrichtung einstellen

    digitalWrite(inc2, HIGH);

    ledcWrite(2, 255);                                         //Sendet ein Signal an den Channel 2 mit einem Duty Cyle(Auslastungsgrad) von 255

  }

}

 

//LEDs Wann sie Leuchten in abhängigkeit der Entfernung

void bremslicht (int entfernung)

{

  if (entfernung <= 5)

  {

    digitalWrite(LED_bremslicht, HIGH);

    digitalWrite (LED_licht, HIGH);

  }

  else if (entfernung > 5)

  {

    digitalWrite(LED_bremslicht, LOW);

    digitalWrite(LED_licht, HIGH);

  }

}

// Funktion zur Tonsteuerung ---> mit geringer werdendem Abstand soll sich die Tonfrequenz höher werden

void sound(int entfernung)

{

  // die Entfernungsabstände können beliebig angepasst werden

  if ((entfernung <= 50) && (entfernung >= 25))

  {

    ledcWriteTone(1, 300);

    delay(10);

  }

 

  else if ((entfernung <= 24) && (entfernung >= 15))

  {

    ledcWriteTone(1, 800);

    delay(5);

  }

 

  else if ((entfernung <= 14) && (entfernung >= 6))

  {

    ledcWriteTone(1, 1300);

    delay(2);

  }

 

  else if (entfernung <= 5)

  {

    ledcWriteTone(1, 1700);

    delay(1);

  }

 

  else

  {

    ledcWriteTone(1, 0);

    delay(1);

  }

}

TM1637Display display(display_clk, display_dio);

 

 

void setup()

{

  pinMode(trig, OUTPUT);                      //Legt den Eingangstyp des angegebenen PINs fest

  pinMode(echo, INPUT);                       //Legt den Eingangstyp des angegebenen PINs fest

  pinMode(passiver_buzzer, OUTPUT);   //Legt den Eingangstyp des angegebenen PINs fest

  pinMode(motor, OUTPUT);                  //Legt den Eingangstyp des angegebenen PINs fest

  pinMode(inc1, OUTPUT);                     //Legt den Eingangstyp des angegebenen PINs fest

  pinMode(inc2, OUTPUT);                     //Legt den Eingangstyp des angegebenen PINs fest

  pinMode(LED_bremslicht, OUTPUT);   //Legt den Eingangstyp des angegebenen PINs fest

  pinMode(LED_ruecklicht, OUTPUT);    //Legt den Eingangstyp des angegebenen PINs fest

  pinMode(schalter, INPUT);                   //Legt den Eingangstyp des angegebenen PINs fest

 

  ledcSetup(1, freq, resolution);              // Konfigurieren der Pulsweitenmodulation für Channel Sound

  ledcAttachPin(passiver_buzzer, 1);      //passiver Buzzer mit PWM-Channel verbinden

 

  ledcSetup(2, freq, resolution);              //Konfigurieren der Pulsweitenmodulation für Channel Antrieb

  ledcAttachPin(motor, 2);                      //Motor mit dem PWM-Channel verbinden

}

 

 

void loop()

{

  schalterStatus = digitalRead(schalter); //setzen vom Schalterstatus

 

  if (schalterStatus == HIGH)                  //starten der UPs, wenn der Schalter betätigt wurde

  {

    antrieb(entfernung);                            //Aufruf der Funktion zum Antrieb des Motors

    entfernung = getEntfernung();           //Aufruf der Funktion zum Messen der Entfernung

    sound(entfernung);                             //Aufruf der Funktion zum Ansteuern des passiven Buzzers

  }

  else

  {

    digitalWrite(inc1, LOW);                     //Laufrichtung einstellen  

    digitalWrite(inc2, HIGH);                     //

    ledcWrite(2, 0);                                   //Motor steht

    ledcWriteTone(1, 0);                           //pasiver Buzzer Aus

  }                                            

    bremslicht(entfernung);                      //Aufruf der Funktion für die LED´s 

 

//Einstellungen für die 7 Segment Anzeige

  display.setBrightness(7);

  display.showNumberDec(entfernung);

  delay(20);

}