Die Funktion der Park Distance Control soll sicherstellen, das ein Fahrzeug, das geparkt wird, nicht mit objekten vor dem Fahrzeug kollidiert. Es erfasst objekte, die der Fahrer möglicherweise nicht sehen kann, weil sie sich im toten Winkel befinden.

Über die Taste „5“ des Infrarothandsenders wird die PDC aktiviert. Die PDC gibt grafisch über das Display mit Decoder und akustisch über die Soundmodule die Distanz zu einem erfassten Objekt aus.  Diese Erfassung ist standardmäßig auf den mittleren Wertebereich eingestellt. Der Wertebereich lässt sich durch Druck auf die „Channel Minus“ - Taste in den Cluster „nah“ und durch Druck auf die „Channel Plus“ - Taste in den Cluster „fern“ verändern. Je nach Entfernung zum Objekt verändert sich die Grafik auf dem Display und die Töne der Soundmodule verändert sich.  Durch Druck auf die „Power“ - Taste wird der PDC-Modus wieder verlassen. Ebenfalls wird der Modus wieder verlassen, wenn einer der anderen Modi des Fahrzeugs angewählt wird. 

Hier (Datei "Vorlage_PDC.ino") befindet sich der Programmcode für die Funktion:

//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

//Hexcodes für die Tasten des Infrarothandsenders
// 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
//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
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_VEH_STOP[]   =         {0x6d, 0x78, 0x3f, 0x73,};

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Pins der Soundmodule
#define Sound1 14
#define Sound2 32
#define Sound3 25
#define Sound4 33

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//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


//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//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: 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: Erfassen eines Infrarotsignals
int IRCodeAuslesen (){
if (irrecv.decode(&results))                                                              // Wenn ein IR-Signal empfangen wurde
  {
  IRcode = (results.value);                                                               // Das Empfangsignal in der Variable speichern

  if(IRcode == 0xFFFFFFFF)                                                                // Wenn eine Taste lange gedrückt wird, soll der Code gelöscht werden, um nicht im seriellen Monitor bzw. im Programm aufzutauchen
  {
    IRcode = 0x00000000;                                                                  // schreiben des default-Wertes in die Variable des IrCodes
  }
  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.
  }
}

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Programmabschnitt: 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: 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: 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
    display.setSegments (SEG_VEH_STOP);
  }

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

void loop() {
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Modus: PDC mit veränderbarem Abstandsbereich

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

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

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