Die Bedienung des Fahrzeugmodells wird mit dem Infrarothandsender ausgeführt. Durch Druck auf die „Hoch“ - Taste fährt das Fahrzeug mit 50% der Maximalgeschwindigkeit nach vorne los. Durch erneutes Betätigen der „Hoch“ - Taste lässt sich die Geschwindigkeit des Fahrzeuges in 10er Schritten bis zum Maximum von 100% erhöhen. Wird die „Runter“ -Taste auf dem Infrarothandsender betätigt, wird die Geschwindigkeit in 10er Schritten bis zum Stillstand des Fahrzeugs reduziert. Das Fahrzeug lässt sich durch den Druck auf Die „Power“ - Taste auch sofort stoppen. Wenn das Fahrzeug stillsteht und die „Runter“ - Taste betätigt wird, fährt es mit 50% der Maximalgeschwindigkeit nach hinten los. Auch hier wird durch erneutes Betätigen der „Runter“ - Taste die Geschwindigkeit erhöht, durch betätigen der „Hoch“ - Taste die Geschwindigkeit verringert und mit der „Power“ - Taste die Fahrtbewegung gestoppt.


Hier (Datei "Vorlage_Fahrzeugverfahren_vor_zur_ck.ino") befindet sich der Programmcode zu der 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;


// 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 distanz1 =0;                                                                          // erste errechnete Distanz zum Ultraschallsensor. Für die Geschwindigkeitserrechnung
int zeitx1 = 0;                                                                           // Deklaration der Variablen "zeitx"

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

int FahrzeugRueckwaerts()
{
  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 );
    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
    }
}
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//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 = 0;
    ledcWrite (PwmChannelMotEna, DutyCycleNull);                                          // Nullsetzen des PWM-Ausgangs
    digitalWrite (MotV , LOW );                                                           // Nullsetzen der Motordrehrichtung
    digitalWrite (MotR , LOW );
  }


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

  if (IRcode == button_Up && 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_Down && 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_Down && DutyCycleMotEna == 160)                                    // Stoppen des Fahrzeugs bei minimalem Geschwindigkeitswert
    {
    IRcode = button_Power;                                                                // Ansteuern des Stoppmodus
    }
}

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

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


//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() {
IRCodeAuslesen      ();
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Modus: Fahrzeug fährt vorwärts

if ((IRcode == button_Up && merker_Down == 0)|| merker_Up == 1)                           // Bedingungen für Modus: Fahrzeug fährt vorwärts
{
  FahrzeugVorwaerts();
}

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

if ((IRcode == button_Down && merker_Up == 0)|| merker_Down == 1 )                        // Bedingungen für Modus: Fahrzeug fährt rückwärts
{
  FahrzeugRueckwaerts();
}

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

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


}