Im Merge wurden alle Programmabschnitte in einem Programmcode zusammengeführt:



//Infrarotsensor
#include <IRremoteESP8266.h>                                                              // Bibliothek zum Empfang von Infrarotsignalen
#include <IRrecv.h>                                                                       // Bibliothek zum Empfang von Infrarotsignalen
#include <IRutils.h>                                                                      // Bibliothek für Funktionen nach Infrarotempfang
#define RECV_PIN  34                                                                      // Pin, an dem der Pin des IR-Empfängers angeschlossen ist
IRrecv irrecv(RECV_PIN);                                                                  // Eingangsbestimmung für den Infrarot-Datenstrom
decode_results results;                                                                   // Dekodierung in Datei schreiben


// Angabe von '0x' vor dem eigentlichen Hexcode
//         Bezeichnung                  HEX-Code
int button_Power          =             0xECDF8084;                                       // zurücksetzen auf den ursprungszustand
int button_Down           =             0x7F984248;                                       // keine Zuordnung in diesem Programm
int button_Up             =             0xC5F76D04;                                       // keine Zuordnung in diesem Programm
//int button_01             =             0x3138F3E0;                                       // keine Zuordnung in diesem Programm
//int button_02             =             0xBF33DC80;                                       // keine Zuordnung in diesem Programm
//int button_03             =             0xABB78D20;                                       // keine Zuordnung in diesem Programm
//int button_04             =             0x4A86A8C0;                                       // keine Zuordnung in diesem Programm
int button_05             =             0xC0134580;                                       // Modus PDC optische akustische Signale
//int button_06             =             0xBA1256C4;                                       // keine Zuordnung in diesem Programm
//int button_07             =             0x52A2DA24;                                       // keine Zuordnung in diesem Programm
//int button_08             =             0xB74C8420;                                       // keine Zuordnung in diesem Programm
//int button_09             =             0xE3172C20;                                       // keine Zuordnung in diesem Programm
//int button_VolumePlus     =             0xF62981E4;                                       // keine Zuordnung in diesem Programm
//int button_00             =             0x2F9EF384;                                       // keine Zuordnung in diesem Programm
int button_ChannelPlus    =             0x9C7C29E0;                                       // Änderung Wertebereich für optische akustische Signale nach oben; Fahrzeug in Positionierung nach vorne verfahren
//int button_VolumeMinus    =             0x973C68E0;                                       // keine Zuordnung in diesem Programm
//int button_Enter          =             0x3C1BB180;                                       // keine Zuordnung in diesem Programm
int button_ChannelMinus   =             0x1B433B24;                                       // Änderung Wertebereich für optische akustische Signale nach unten; Fahrzeug in Positionierung nach hinten verfahren
int IRcode = 0x00000000;                                                                  // variable für den Empfangenen Tastencode
int merker_Power          =  0;
int merker_Down           =  0;
int merker_Up             =  0;
//int merker_01             =  0;
//int merker_02             =  0;
//int merker_03             =  0;
//int merker_04             =  0;
int merker_05             =  0;
//int merker_06             =  0;
//int merker_07             =  0;
//int merker_08             =  0;
//int merker_09             =  0;
//int merker_VolumePlus     =  0;
//int merker_00             =  0;
int merker_ChannelPlus    =  0;
//int merker_VolumeMinus    =  0;
//int merker_Enter          =  0;
int merker_ChannelMinus   =  0;


//Ultraschallsensor
#define echo 15                                                                           //Anschluss ECHO vom HC-SR04 wurde für PIN 15 festgelegt
#define trig 18                                                                           //Anschluss TRIG vom HC-SR04 wurde für PIN 18 festgelegt


//Display mit Controller
#include <TM1637TinyDisplay.h>                                                            // Bibliothek für die 7- Segment Anzeige
#define CLK 21                                                                            //Anschluss CLK von der 7- Segment Anzeige wurde für PIN 21 festgelegt
#define DIO 19                                                                            //Anschluss DIO von der 7- Segment Anzeige wurde für PIN 19 festgelegt
TM1637TinyDisplay display(CLK, DIO);
const uint8_t SEG_PDC_NORMAL[]  =         {0x39, 0x00, 0x00, 0x00,};
const uint8_t SEG_PDC_VOR[]     =         {0x3f, 0x39, 0x00, 0x00,};
const uint8_t SEG_PDC_END[]     =         {0x3f, 0x3f, 0x39, 0x00,};
const uint8_t SEG_PDC_NOT[]     =         {0x3f, 0x3f, 0x3f, 0x39,};
const uint8_t SEG_PDC_STOP[]    =         {0x7f, 0x7f, 0x7f, 0x7f,};
const uint8_t SEG_Modus_MS[]    =         {0x54, 0x44, 0x52, 0x6d,};
const uint8_t SEG_Modus_kmh[]   =         {0x78, 0x54, 0x44, 0x74,};
const uint8_t SEG_VEH_STOP[]    =         {0x6d, 0x78, 0x3f, 0x73,};
const uint8_t SEG_VEH_VPlus[]   =         {0x1c, 0x46, 0x40, 0x00,};
const uint8_t SEG_VEH_VMinus[]  =         {0x1c, 0x40, 0x40, 0x00,};

//Pins der Soundmodule
#define Sound1 12
#define Sound2 13
#define Sound3 14
#define Sound4 27

// Motortreiber L298N
#define MotV 27
#define MotR 26
#define MotEna 12

//PWM Motortreiber
int Freq = 30000;
int Res = 8;
int PwmChannelMotEna = 2;
int DutyCycleMotEna = 0;                                                                  // MaximalWert: 250; Minimalwet 160;
int DutyCycleNull = 0;

//allgemeine Variablen, die in verschiedenen Programmabläufen aufgerufen werden
int merker_PdcMode = 2;                                                                   //Wertespeicher für den PDC Modus. Ursprung ist mit 2 = normal
int distanz1 =0;                                                                          //erste errechnete Distanz zum Ultraschallsensor. Für die Geschwindigkeitserrechnung
int zeitx1 = 0;                                                                           //Deklaration der Variablen "zeitx"
int vResNull_230 = 0;                                                                     //Merker für die Geschwindigkeitsreduzierung
int vResNull_220 = 0;
int vResNull_210 = 0;
int vResNull_200 = 0;
int vResNull_190 = 0;
int vResNull_180 = 0;
int vResNull_170 = 0;
int vResNull_160 = 0;
int merker_positionierungsmodi = 0;
int merker_Verfahrweg = 0;

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Programmabschnitt 1: Errechnung der ersten Distanz zum Objekt
int EntfernungsMessung1 (){

  long distanz1 = 0;                                                                      //Deklaration der Variablen "distanz1"
  long zeitx1 = 0;                                                                        //Deklaration der Variablen "zeitx"
 
  digitalWrite (trig, LOW);                                                               //setzt den Zustand von trig auf LOW
  delayMicroseconds(3);                                                                   //setzt eine Pause/Unterbrechung von 3 Mikrosekunden
  noInterrupts();                                                                         //verhindert eine Unterbrechung des Vorgangs
  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
  zeitx1 = pulseIn(echo, HIGH);
  interrupts();                                                                           //lässt Vorgangsunterbrechungen erneut zu
//  Serial.print("Zeitx1 PulseIn:");
//  Serial.print(zeitx1);
//  Serial.println("");
  zeitx1 = (((zeitx1 * 344)/1000)/2);                                                     //vererrechnet den Wert der Zeit mit der Schallgeschwindigkeit nach der Raumtemperaur,
                                                                                          //dem Faktor für die Kommastelle und halbiert diesen wegen der doppelten strecke (hin+zurück)
  distanz1 = zeitx1;
//  Serial.print("distanz1  Wert01:");                                                      //Ausgabe des Wertes über den seriellen Monitor
//  Serial.print(distanz1);
//  Serial.println("");
  return (distanz1);                                                                      //Ausgabe des Wertes für die Entfernung
}

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Programmabschnitt 2: Erfassen eines Infrarotsignals
int IRCodeAuslesen (){
if (irrecv.decode(&results))                                                              //Wenn ein IR-Signal empfangen wurde
  {
  IRcode = (results.value);                                                               //Das Empfangsignal in der Variable speichern

  Serial.print(IRcode, HEX);                                                              //Gebe empfangenen Code hexadezimal im seriellen Monitor aus
  Serial.println("");
  irrecv.resume();                                                                        //IR-Empfänger für den nächsten Wert bereit machen.
  if(IRcode == 0xFFFFFFFF)
  {
    IRcode = 0x00000000;
  }
  }
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Programmabschnitt 3: Programmcode PDC mit Wertebereichanpassung

int PdcMode (){
  if (merker_05 == 0 )                                                                    //einmalige Anzeige des Modus
  {
    Serial.println ("Modus: Optische akustische Signale (Park Distance Control)");        //Ausgabe des Modus über den seriellen Monitor
  }
  merker_05 = 1;                                                                          //Aktivierung des Merkers für den Programmabschnitt, damit er automatisch wiederholt wird
  merker_Up = 0;                                                                          // Nullsetzung der anderen Modusmerker
  merker_Down = 0;
  if(IRcode == button_05)
  {
    IRcode = 0x00000000;                                                                  //Zurücksetzen des IR-Codespeichers
    Serial.println ("IrCode gelöscht");
  }
  if (IRcode == button_ChannelPlus && merker_PdcMode <= 2)                                //Anpassung des Abstandes über Taster
    {
    merker_PdcMode ++;                                                                    //erhöhen des Abstandes
    Serial.print("Merker PDC-Mode:");                                                     
    Serial.print(merker_PdcMode);                                                         //Ausabe des aktuellen Abstandsmodus über den seriellen Monitor
    Serial.println("");
    IRcode = 0x00000000;                                                                  //Zurücksetzen des IR-Codespeichers
    }
  if (IRcode == button_ChannelMinus && merker_PdcMode >= 2)                               //Anpassung des Abstandes über Taster
    {
    merker_PdcMode --;                                                                    //verringern des Abstandes
    Serial.print("Merker PDC-Mode:");                                                     
    Serial.print(merker_PdcMode);                                                         //Ausabe des aktuellen Abstandsmodus über den seriellen Monitor
    Serial.println("");
    IRcode = 0x00000000;                                                                  //Zurücksetzen des IR-Codespeichers
    }
  distanz1 = EntfernungsMessung1  ();                                                     //errechnen der Distanz
  distanz1 = distanz1 / 10;

//  Serial.print("Distanz 1 PDC ");
//  Serial.print(distanz1);
//  Serial.print("cm");
//  Serial.println ("");

  if (merker_05 == 1 && merker_PdcMode == 1)                                              //Abfrage nach dem Distanzbereich 1 (nah)
    {
    PDC1 ();
    }
  if (merker_05 == 1 && merker_PdcMode == 2)                                              //Abfrage nach dem Distanzbereich 2 (mittel)
    {
    PDC2 ();
    }
  if (merker_05 == 1 && merker_PdcMode == 3)                                              //Abfrage nach dem Distanzbereich 3 (weit)
    {
    PDC3 ();
    }
  }
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Programmabschnitt 4: PDC Nah

int PDC1 ()
{
  if ((distanz1 <= 20) && (distanz1 >= 15))                                               // Abstandsbedingungen für Abstandsberech 1
  {
  display.setSegments(SEG_PDC_VOR);                                                       // Anzeige des Abstandes über das Display
  digitalWrite(Sound1, HIGH);                                                             // Wiedergabetrigger des Sounds aus Soundmodul Nr.1
  delay (2);                                                                              // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
  digitalWrite(Sound1, LOW);                                                              // zurücksetzen des Wiedergabetrigger des Soundmoduls
  }
 
  else if ((distanz1 <= 15) && (distanz1 >= 10))                                          // Abstandsbedingung für Abstandsbereich 2
  {
  display.setSegments(SEG_PDC_END);                                                       // Anzeige des Abstandes über das Display
  digitalWrite(Sound2, HIGH);                                                             // Wiedergabetrigger des Sounds aus Soundmodul Nr.2
  delay (2);                                                                              // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
  digitalWrite(Sound2, LOW);                                                              // zurücksetzen des Wiedergabetrigger des Soundmoduls
  }
 
  else if ((distanz1 <= 10) && (distanz1 >= 6))                                           // Abstandsbedingungen für Abstandsberech 3
  {
  display.setSegments(SEG_PDC_NOT);                                                       // Anzeige des Abstandes über das Display
  digitalWrite(Sound3, HIGH);                                                             // Wiedergabetrigger des Sounds aus Soundmodul Nr.3
  delay (2);                                                                              // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
  digitalWrite(Sound3, LOW);                                                              // zurücksetzen des Wiedergabetrigger des Soundmoduls
  }
 
  else if (distanz1 <= 5)                                                                 // Abstandsbedingungen für Abstandsberech 4
  {
  display.setSegments(SEG_PDC_STOP);                                                      // Anzeige des Abstandes über das Display
  digitalWrite(Sound4, HIGH);                                                             // Wiedergabetrigger des Sounds aus Soundmodul Nr.4
  delay (2);                                                                              // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
  digitalWrite(Sound4, LOW);                                                              // zurücksetzen des Wiedergabetrigger des Soundmoduls
  }
 
  else                                                                                    // Abstandsbedingungen für Abstandsberech 0
  {
  display.setSegments(SEG_PDC_NORMAL);                                                    // Anzeige des Abstandes über das Display
  }  
}

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Programmabschnitt 5: PDC Mittel

int PDC2 ()
{
  if ((distanz1 <= 55) && (distanz1 >= 51))                                               // Abstandsbedingungen für Abstandsberech 1
  {
  display.setSegments(SEG_PDC_VOR);                                                       // Anzeige des Abstandes über das Display
  digitalWrite(Sound1, HIGH);                                                             // Wiedergabetrigger des Sounds aus Soundmodul Nr.1
  delay (2);                                                                              // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
  digitalWrite(Sound1, LOW);                                                              // zurücksetzen des Wiedergabetrigger des Soundmoduls   
  }
 
  else if ((distanz1 <= 50) && (distanz1 >= 46))                                          // Abstandsbedingungen für Abstandsberech 2
  {
  display.setSegments(SEG_PDC_END);                                                       // Anzeige des Abstandes über das Display
  digitalWrite(Sound2, HIGH);                                                             // Wiedergabetrigger des Sounds aus Soundmodul Nr.2
  delay (2);                                                                              // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
  digitalWrite(Sound2, LOW);                                                              // zurücksetzen des Wiedergabetrigger des Soundmoduls   
  }
 
  else if ((distanz1 <= 45) && (distanz1 >= 41))                                          // Abstandsbedingungen für Abstandsberech 3
  {
  display.setSegments(SEG_PDC_NOT);                                                       // Anzeige des Abstandes über das Display
  digitalWrite(Sound3, HIGH);                                                             // Wiedergabetrigger des Sounds aus Soundmodul Nr.3
  delay (2);                                                                              // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
  digitalWrite(Sound3, LOW);                                                              // zurücksetzen des Wiedergabetrigger des Soundmoduls  
  }
 
  else if (distanz1 <= 40)                                                                // Abstandsbedingungen für Abstandsberech 4
  {
  display.setSegments(SEG_PDC_STOP);                                                      // Anzeige des Abstandes über das Display
  digitalWrite(Sound4, HIGH);                                                             // Wiedergabetrigger des Sounds aus Soundmodul Nr.4
  delay (2);                                                                              // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
  digitalWrite(Sound4, LOW);                                                              // zurücksetzen des Wiedergabetrigger des Soundmoduls
  }
 
  else                                                                                    // Abstandsbedingungen für Abstandsberech 0
  {
  display.setSegments(SEG_PDC_NORMAL);                                                    // Anzeige des Abstandes über das Display      
  }
}

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Programmabschnitt 6: PDC Weit

int PDC3 ()
{
  if ((distanz1 <= 85) && (distanz1 >= 81))                                               // Abstandsbedingungen für Abstandsberech 1
  {
  display.setSegments(SEG_PDC_VOR);                                                       // Anzeige des Abstandes über das Display
  digitalWrite(Sound1, HIGH);                                                             // Wiedergabetrigger des Sounds aus Soundmodul Nr.1
  delay (2);                                                                              // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
  digitalWrite(Sound1, LOW);                                                              // zurücksetzen des Wiedergabetrigger des Soundmoduls
  }
 
  else if ((distanz1 <= 80) && (distanz1 >= 76))                                          // Abstandsbedingungen für Abstandsberech 2
  {
  display.setSegments(SEG_PDC_END);                                                       // Anzeige des Abstandes über das Display
  digitalWrite(Sound2, HIGH);                                                             // Wiedergabetrigger des Sounds aus Soundmodul Nr.2
  delay (2);                                                                              // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
  digitalWrite(Sound2, LOW);                                                              // zurücksetzen des Wiedergabetrigger des Soundmoduls
  }
 
  else if ((distanz1 <= 75) && (distanz1 >= 71))                                          // Abstandsbedingungen für Abstandsberech 3
  {
  display.setSegments(SEG_PDC_NOT);                                                       // Anzeige des Abstandes über das Display
  digitalWrite(Sound3, HIGH);                                                             // Wiedergabetrigger des Sounds aus Soundmodul Nr.3
  delay (2);                                                                              // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
  digitalWrite(Sound3, LOW);                                                              // zurücksetzen des Wiedergabetrigger des Soundmoduls
  }
 
  else if (distanz1 <= 70)                                                                // Abstandsbedingungen für Abstandsberech 4
  {
  display.setSegments(SEG_PDC_STOP);                                                      // Anzeige des Abstandes über das Display
  digitalWrite(Sound4, HIGH);                                                             // Wiedergabetrigger des Sounds aus Soundmodul Nr.4
  delay (2);                                                                              // kurze Verzögerung zur sicheren Ansteuerung des Soundmoduls
  digitalWrite(Sound4, LOW);                                                              // zurücksetzen des Wiedergabetrigger des Soundmoduls
  }
 
  else                                                                                    // Abstandsbedingungen für Abstandsberech 0
  {
  display.setSegments(SEG_PDC_NORMAL);                                                    // Anzeige des Abstandes über das Display
  }
}

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Programmabschnitt 7: Fahrzeugstopp
int StopMode (){
    merker_Up   = 0;                                                                      // Zurücksetzen der Modusmerker
    merker_Down = 0;
    merker_05   = 0;
    Serial.println ("Power Button gedrückt, Fahrzeugfunktionen Stopp");                   // Ausgabe über den seriellen Monitor
    IRcode = 0x00000000;                                                                  // Zurücksetzen des IR-Codespeichers
    DutyCycleMotEna = 200;
    ledcWrite (PwmChannelMotEna, DutyCycleNull);                                          // Nullsetzen des PWM-Ausgangs
    digitalWrite (MotV , LOW );                                                           // Nullsetzen der Motordrehrichtung
    digitalWrite (MotR , LOW );
    display.setSegments (SEG_VEH_STOP);
    vResNull_230 = 0;                                                                     // Merker für die Geschwindigkeitsreduzierung
    vResNull_220 = 0;
    vResNull_210 = 0;
    vResNull_200 = 0;
    vResNull_190 = 0;
    vResNull_180 = 0;
    vResNull_170 = 0;
    vResNull_160 = 0;
    merker_positionierungsmodi = 0;
    merker_ChannelPlus = 0;
    merker_ChannelMinus = 0;
    
  }

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Modus: Fahrzeug fährt vorwärts

int FahrzeugVorwaerts (){
  if (merker_Up == 0 )                                                                    // einmalige Anzeige des Modus
  {
    Serial.println ("Modus: Fahrzeug fährt vorwärts");                                    // Ausgabe des Modus über den seriellen Monitor
                                                                                          // Festlegen des Startwerts, Mitte zwischen Minimum und Maximum
    DutyCycleMotEna = 200;                                                                // Minimal 160, maximal 255 bei DutyCycleMotEna
    digitalWrite (MotV , HIGH);                                                           // Schreiben der Drehrichtung des Motors
    digitalWrite (MotR , LOW );
    display.setSegments (SEG_VEH_VPlus);
    delay(500);
    display.clear();
    IRcode = 0x00000000;                                                                  // Zurücksetzen des IR-Codespeichers
  }
  merker_Up = 1;                                                                          // Aktivierung des Merkers für den Programmabschnitt, damit er automatisch wiederholt wird
  merker_Down = 0;                                                                        // Nullsetzung der anderen Modusmerker
  ledcWrite (PwmChannelMotEna, DutyCycleMotEna);                                          // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
  distanz1 = EntfernungsMessung1   ();                                                    // errechnen der Distanz
  distanz1 = distanz1 / 10;                                                               // Umformen der Distanz zu Cm
//  Serial.print("Distanz zu Objekt ");                                                   // Ausgabe der Distanz über den seriellen Monitor
//  Serial.print(distanz1);
//  Serial.print("cm");
//  Serial.println ("");
  display.showNumber (distanz1);                                                          // Ausgabe des Wertes der Distanz auf dem Display mit Decoder
  if (IRcode == button_Up && DutyCycleMotEna < 241 && distanz1 >= 50)                     // Bedingungen für die Geschwindigkeitserhöhung
    {
    DutyCycleMotEna = DutyCycleMotEna +10;                                                // Erhöhung der Geschwindigkeit über den Wert des DutyCycles
    Serial.print ("DutyCycleMotEna Anhebung auf:");                                       // Ausgabe über den seriellen Monitor
    Serial.print (DutyCycleMotEna);
    Serial.println("");
    vResNull_230 = 0;                                                                     //Merker für die Geschwindigkeitsreduzierung
    vResNull_220 = 0;
    vResNull_210 = 0;
    vResNull_200 = 0;
    vResNull_190 = 0;
    vResNull_180 = 0;
    vResNull_170 = 0;
    vResNull_160 = 0;
    IRcode = 0x00000000;                                                                  // Zurücksetzen des IR-Codespeichers
    }
  if (IRcode == button_Down && DutyCycleMotEna >169)                                      // Bedingung für die Geschwindigkeitsverringerung
    {
    DutyCycleMotEna = DutyCycleMotEna -10;                                                // Verringerung der Geschwindigkeit über den Wert des DutyCycles
    Serial.print ("DutyCycleMotEna Senkung auf:");                                        // Ausgabe über den seriellen Monitor
    Serial.print (DutyCycleMotEna);
    Serial.println("");
    IRcode = 0x00000000;                                                                  // Zurücksetzen des IR-Codespeichers
    }
  if (IRcode == button_Down && DutyCycleMotEna == 160)                                    // Stoppen des Fahrzeugs bei minimalem Geschwindigkeitswert
    {
    IRcode = button_Power;                                                                // Ansteuern des Stoppmodus
    }
//Abschnitt Geschwindigkeitsreduzierung bei Objekterkennung
  if (distanz1 < 50 && DutyCycleMotEna > 230&& vResNull_230 == 0 && merker_positionierungsmodi == 0)
    {                                                                                     // Reduzierung schrittweise
    DutyCycleMotEna = 230;                                                                // Schreiben des kleineren Wertes in den DutyCycle
    ledcWrite (PwmChannelMotEna, DutyCycleMotEna);                                        // Schreiben des DutyCycles in den Ausgang
    Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V230");                // Ausgabe über den seriellen Monitor
    vResNull_230 = 1;
    }
  if (distanz1 < 47 && DutyCycleMotEna > 220 && vResNull_220 == 0 && merker_positionierungsmodi == 0)
    {                                                                                     // Reduzierung schrittweise
    DutyCycleMotEna = 220;                                                                // Schreiben des kleineren Wertes in den DutyCycle
    ledcWrite (PwmChannelMotEna, DutyCycleMotEna);                                        // Schreiben des DutyCycles in den Ausgang
    Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V220");                // Ausgabe über den seriellen Monitor
    vResNull_220 = 1;
    }
  if (distanz1 < 44 && DutyCycleMotEna > 210 && vResNull_210 == 0 && merker_positionierungsmodi == 0)
    {                                                                                     // Reduzierung schrittweise
    DutyCycleMotEna = 210;                                                                // Schreiben des kleineren Wertes in den DutyCycle
    ledcWrite (PwmChannelMotEna, DutyCycleMotEna);                                        // Schreiben des DutyCycles in den Ausgang
    Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V210");                // Ausgabe über den seriellen Monitor
    vResNull_210 = 1;
    }
  if (distanz1 < 41 && DutyCycleMotEna > 200 && vResNull_200 == 0 && merker_positionierungsmodi == 0)
    {                                                                                     // Reduzierung schrittweise
    DutyCycleMotEna = 200;                                                                // Schreiben des kleineren Wertes in den DutyCycle
    ledcWrite (PwmChannelMotEna, DutyCycleMotEna);                                        // Schreiben des DutyCycles in den Ausgang
    Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V200");                // Ausgabe über den seriellen Monitor
    vResNull_200 = 1;
    }
  if (distanz1 < 38 && DutyCycleMotEna > 190 && vResNull_190 == 0 && merker_positionierungsmodi == 0)
    {                                                                                     // Reduzierung schrittweise
    DutyCycleMotEna = 190;                                                                // Schreiben des kleineren Wertes in den DutyCycle
    ledcWrite (PwmChannelMotEna, DutyCycleMotEna);                                        // Schreiben des DutyCycles in den Ausgang
    Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V190");                // Ausgabe über den seriellen Monitor
    vResNull_190 = 1;
    }
  if (distanz1 < 35 && DutyCycleMotEna > 180 && vResNull_180 == 0 && merker_positionierungsmodi == 0)
    {                                                                                     // Reduzierung schrittweise
    DutyCycleMotEna = 180;                                                                // Schreiben des kleineren Wertes in den DutyCycle
    ledcWrite (PwmChannelMotEna, DutyCycleMotEna);                                        // Schreiben des DutyCycles in den Ausgang
    Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V180");                // Ausgabe über den seriellen Monitor
    vResNull_180 = 1;
    }
  if (distanz1 < 32 && DutyCycleMotEna > 170 && vResNull_170 == 0 && merker_positionierungsmodi == 0)
    {                                                                                     // Reduzierung schrittweise
    DutyCycleMotEna = 170;                                                                // Schreiben des kleineren Wertes in den DutyCycle
    ledcWrite (PwmChannelMotEna, DutyCycleMotEna);                                        // Schreiben des DutyCycles in den Ausgang
    Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V170");                // Ausgabe über den seriellen Monitor
    vResNull_170 = 1;
    }
  if (distanz1 < 29 && DutyCycleMotEna > 160 && vResNull_160 == 0 && merker_positionierungsmodi == 0)
    {                                                                                     // Reduzierung schrittweise
    DutyCycleMotEna = 160;                                                                // Schreiben des kleineren Wertes in den DutyCycle
    ledcWrite (PwmChannelMotEna, DutyCycleMotEna);                                        // Schreiben des DutyCycles in den Ausgang
    Serial.println ("eduzierung Geschwindigkeit Näherung zu Objekt V160");                // Ausgabe über den seriellen Monitor
    vResNull_160 = 1;
    }
  if (distanz1 < 26 && DutyCycleMotEna == 160 && vResNull_160 == 1 && merker_positionierungsmodi == 0)
    {                                                                                     // Bis zum Stillstand vor dem Objekt und dem Wechsel in den Abstandsmodus
    DutyCycleMotEna = 0;                                                                  // Schreiben des kleineren Wertes in den DutyCycle
    ledcWrite (PwmChannelMotEna, DutyCycleNull);                                          // Schreiben des DutyCycles in den Ausgang
    delay(1000);
    digitalWrite (MotV , LOW );                                                           // zurücksetzen der Drehrichtung des Motors
    digitalWrite (MotR , LOW  );
    merker_positionierungsmodi = 1;                                                       // Aktivieren des Merkers für die Positionierung
    merker_Verfahrweg = distanz1;
    Serial.println("Fahrzeug gestoppt, Positioniermodus aktiviert");                      // Ausgabe über den seriellen Monitor
    }    
}

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Modus: Positionierung vor Objekt stehend

int Positionierung (){
    distanz1 = EntfernungsMessung1   ();                                                  // errechnen der Distanz
    distanz1 = distanz1 / 10;                                                             // Umrechnen des Wertes in Cm
    display.showNumber (distanz1);                                                        // Ausgabe des wertes auf dem Display mit Decoder
    if (IRcode == button_ChannelPlus || merker_ChannelPlus ==1)                           // Bedingung für das Verfahren nach vorne
      {
      if (merker_ChannelPlus == 0)                                                        // Einmal Ausführung des Schreibens der Motorwerte
        {
        digitalWrite (MotV , HIGH );                                                      // Schreiben der Drehrichtung des Motors
        digitalWrite (MotR , LOW  );
        DutyCycleMotEna = 200;                                                            // Starten mit einem initialwert, damit der motor sich dreht
        ledcWrite (PwmChannelMotEna, DutyCycleMotEna);                                    // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
        delay(20);
        DutyCycleMotEna = 180;                                                            // Schrittweises Absenken der Drehgeschwindigkeit
        ledcWrite (PwmChannelMotEna, DutyCycleMotEna);                                    // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
        delay(20);
        DutyCycleMotEna = 160;                                                            // Bis zur Minimalfrequenz
        ledcWrite (PwmChannelMotEna, DutyCycleMotEna);                                    // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
        merker_ChannelPlus = 1;
        merker_Verfahrweg = distanz1;
        merker_Verfahrweg = merker_Verfahrweg -5;
        Serial.print ("Distanz 1 ");
        Serial.println (distanz1);
        Serial.print ("merker_Verfahrweg ");
        Serial.println (merker_Verfahrweg);
        Serial.println ("ChannelPlus betätigt, Anpassung nach vorne angefordert");
        IRcode = 0x00000000;                                                              // Zurücksetzen des IR-Codespeichers
        }
      if (distanz1 < merker_Verfahrweg)
        {
        digitalWrite (MotV , LOW  );                                                      // Schreiben der Drehrichtung des Motors
        digitalWrite (MotR , LOW  );
        DutyCycleMotEna = 0;
        ledcWrite (PwmChannelMotEna, DutyCycleMotEna);                                    // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
        merker_ChannelPlus = 0;
        Serial.println ("ChannelPlus betätigt, Anpassung nach vorne wurde abgeschlossen");
        IRcode = 0x00000000;                                                              // Zurücksetzen des IR-Codespeichers
        }
      }
    if (IRcode == button_ChannelMinus || merker_ChannelMinus ==1)
      {
      if (merker_ChannelMinus == 0)
        {
        digitalWrite (MotV , LOW  );                                                      // Schreiben der Drehrichtung des Motors
        digitalWrite (MotR , HIGH );
        DutyCycleMotEna = 200;
        ledcWrite (PwmChannelMotEna, DutyCycleMotEna);                                    // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
        delay(20);
        DutyCycleMotEna = 180;
        ledcWrite (PwmChannelMotEna, DutyCycleMotEna);                                    // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
        delay(20);
        DutyCycleMotEna = 160;
        ledcWrite (PwmChannelMotEna, DutyCycleMotEna);                                    // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
        merker_ChannelMinus = 1;
        merker_Verfahrweg = merker_Verfahrweg +5;
        Serial.print ("ChannelPlus betätigt, Anpassung nach hinten angefordert");
        IRcode = 0x00000000;                                                              // Zurücksetzen des IR-Codespeichers
        }
      if (distanz1 > merker_Verfahrweg)
        {
        digitalWrite (MotV , LOW  );                                                      // Schreiben der Drehrichtung des Motors
        digitalWrite (MotR , LOW  );
        DutyCycleMotEna = 0;
        ledcWrite (PwmChannelMotEna, DutyCycleMotEna);                                    // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
        merker_ChannelMinus = 0;
        Serial.print ("ChannelPlus betätigt, Anpassung nach hinten wurde abgeschlossen");
        IRcode = 0x00000000;                                                              // Zurücksetzen des IR-Codespeichers
        }
      }    
    }


//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Modus: Fahrzeug fährt Rückwärts

int FahrzeugRueckwaerts()
{
  distanz1 = EntfernungsMessung1   ();                                                    // errechnen der Distanz
  distanz1 = distanz1 / 10;  
  display.showNumber (distanz1);                                                          // Ausgabe des Wertes der Distanz auf dem Display mit Decoder

  if (merker_Down == 0 )                                                                  // einmalige Anzeige des Modus
    {
    Serial.println ("Modus: Fahrzeug fährt Rückwärts");                                   // Ausgabe des Modus über den seriellen Monitor
                                                                                          // Festlegen des Startwerts, Mitte zwischen Minimum und Maximum
    DutyCycleMotEna = 200;                                                                // Minimal 160, maximal 255 bei DutyCycleMotEna
    ledcWrite (PwmChannelMotEna, DutyCycleMotEna);                                        // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
    digitalWrite (MotV , LOW  );                                                          // Schreiben der Drehrichtung des Motors
    digitalWrite (MotR , HIGH );
    display.setSegments (SEG_VEH_VMinus);
    delay(500);
    display.clear();
    IRcode = 0x00000000;                                                                  // Zurücksetzen des IR-Codespeichers
    }
  merker_Down = 1;                                                                        // Aktivierung des Merkers für den Programmabschnitt, damit er automatisch wiederholt wird
  merker_Up = 0;                                                                          // Nullsetzung der anderen Modusmerker
  ledcWrite (PwmChannelMotEna, DutyCycleMotEna);                                          // Schreiben des Wertes für die Pwm Ausgabe in den Ausgang
  if (IRcode == button_Down && DutyCycleMotEna < 241)                                     // Bedingungen für die Geschwindigkeitserhöhung
    {
    DutyCycleMotEna = DutyCycleMotEna +10;                                                // Erhöhung der Geschwindigkeit
    Serial.print ("DutyCycleMotEna Anhebung auf:");                                       // Ausgabe über den seriellen Monitor
    Serial.print (DutyCycleMotEna);
    Serial.println("");
    IRcode = 0x00000000;                                                                  // Zurücksetzen des IR-Codespeichers
    }
  if (IRcode == button_Up && DutyCycleMotEna > 169)                                       // Bedingung für die Geschwindigkeitsverringerung
    {
    DutyCycleMotEna = DutyCycleMotEna -10;                                                // Verringerung der Geschwindigkeit
    Serial.print ("DutyCycleMotEna Senkung auf:");                                        // Ausgabe über den seriellen Monitor
    Serial.print (DutyCycleMotEna);
    Serial.println("");
    IRcode = 0x00000000;                                                                  // Zurücksetzen des IR-Codespeichers
    }
  if (IRcode == button_Up && DutyCycleMotEna == 160)                                      // Stoppen des Fahrzeugs bei minimalem Geschwindigkeitswert
    {
    IRcode = button_Power;                                                                // Ansteuern des Stoppmodus
    }
}


//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void setup() {
//Infrarotempfänger
irrecv.enableIRIn();                                    // Empfänger wird ausgeführt

//Display TM1637
display.setBrightness(7);

//Ultraschallsensor
pinMode (echo     , INPUT );                                                              //festlegen des Pins am Ultraschallsensor als Eingang
pinMode (trig     , OUTPUT);                                                              //festlegen des Pins am Ultraschallsensor als Ausgang

//Soundmodule
pinMode (Sound1     , OUTPUT);                                                            // festlegen der Pins der Soundmodule als Ausgänge
pinMode (Sound2     , OUTPUT);
pinMode (Sound3     , OUTPUT);
pinMode (Sound4     , OUTPUT);

//L298N
pinMode (MotV     , OUTPUT);                                                              // festlegen des Pins am L298N als Ausgang
pinMode (MotR     , OUTPUT);                                                              // festlegen des Pins am L298N als Ausgang
pinMode (MotEna   , OUTPUT);                                                              // festlegen des Pins am L298N als Ausgang

//PWM
ledcSetup (PwmChannelMotEna, Freq, Res);                                                  // PWM-Kanal Einstellung
ledcAttachPin (MotEna, PwmChannelMotEna);                                                 // Definition des PWM-Kanals auf den Pin

Serial.begin(115200);                                                                     //Seriellen Monitor mit einer Baudrate von 115200 starten

}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void loop() {

//EntfernungsMessung1 ();
IRCodeAuslesen      ();
//PdcMode             ();
//PDC1                ();
//PDC2                ();
//PDC3                ();
//StopMode            ();
//FahrzeugVorwaerts   ();
//FahrzeugRueckwaerts ();

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Modus: PDC mit veränderbarem Abstandsbereich

if (IRcode == button_05 || merker_05 == 1)                                                //Modus: PDC mit veränderbarem Abstandsbereich
  {
  PdcMode ();
  }

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Modus: Fahrzeug fährt vorwärts + Objekterkennung und Stoppbereichanpassung
                                                                                          // Bedingungen für Modus: Fahrzeug fährt vorwärts
if ((IRcode == button_Up && merker_Down == 0)|| merker_Up == 1 && merker_positionierungsmodi == 0)                           
  {
  FahrzeugVorwaerts();
  }
if (merker_positionierungsmodi == 1)
  {
  Positionierung ();
  }
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Modus: Fahrzeug fährt rückwärts
                                                                                          // Bedingungen für Modus: Fahrzeug fährt rückwärts
if ((IRcode == button_Down && merker_Up == 0)|| merker_Down == 1 && merker_positionierungsmodi == 0)                        
{
  FahrzeugRueckwaerts();
}

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Modus: allgemeiner Funktionsstopp

if (IRcode == button_Power)                                                               // Bedingung für Funktion: Allgemeiner Fahrzeugstopp
  {
  StopMode ();
  }
}