Die Funktion des vor- und zurückfahrens wird um einen Positioniermodus erweitert. Wenn das Fahrzeug vorwärts oder rückwärts fährt, wird auf dem Display mit Decoder die Distanz zu dem nächsten erfassten Objekt ausgegeben. In der Vorwärtsfahrt wird die Distanz zum Objekt genutzt, um das Fahrzeug zu einem sicheren Halt zu bringen. Die Geschwindigkeit wird nach und nach bis zum Stillstand vor dem Objekt reduziert. Sobald das Fahrzeug steht, wechselt es in den Positioniermodus. Dieser Modus erlaubt es, die Distanz zum erkannten Objekt durch einmaligen Druck auf die „Channel Plus“ - bzw. „Channel Minus“ - Taste um 5 Centimeter zu verändern. Das Fahrzeug verfährt nach Betätigung selbstständig auf den neuen Wert und hält an. Diesen Modus kann man nur durch Betätigung der „Power“ - Taste verlassen.  


Hier (Datei "Vorlage_Fahrzeugverfahren_VZ_Posi.ino") der zugehörige Programmcode:



//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 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      ();
//StopMode            ();
//FahrzeugVorwaerts   ();
//FahrzeugRueckwaerts ();


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