sketch_31_auto_fahren_IR_fernsteuerung

sketch_31_auto_fahren_IR_fernsteuerung
  /*Dieser Sketch faehrt das Auto und hupt per IR-Fernbedienung.
  Die Codes wurden vorher ermittelt mit Sketch xxx.
  Fahren auch nach Loslassen der jeweiligen Taste, solange bis eine andere Taste gedrueckt wird.
  Deshalb wird eine Taste fuer Stoppen erforderlich.

  Das Infrarotlicht wird mit einem Code verschluesselt gesendet. 
  Man kann dann den Code im Serial Monitor lesen.
  Diesen Code auslesen und in passende Werte umwandeln benoetigt umfangreichen Code.
  Das Programm greift deshalb auf eine "Library" (Bibliothek) zurueck, die geladen werden muss: "IRremote by Armin Joachimsmeyer". 

  Ab Version 3.0 muss der Sketch geaendert werden (hier wird Version 4.1.2 genutzt).
  Siehe auch https://roboticsbackend.com/arduino-ir-remote-controller-tutorial-setup-and-map-buttons/  

  Das decodierte Signal erscheint auch im Serial Monitor.
  */
  
  #include "Fahrablaufmodule.h"
  #include "Hupen.h"

  #include <IRremote.hpp>
  #define IR_RECEIVE_PIN 12        //IR-Empfaenger gibt Signal an Pin D12 
  /*Achtung: funktioniert nicht mit D0 (Fehlermeldung beim Hochladen) bzw.D1 (kein Ansprechen des IR-Empfaengers)*/
  
  void setup() 
  {
   Serial.begin(9600);                   
   Serial.println("Warten auf Signal von IR Fernbedienung");
   IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);            
  
   pinMode (11,OUTPUT);            //an IN1  Drehrichtung an Rad links
   pinMode (8,OUTPUT);             //an IN2  an Rad links
   pinMode (7,OUTPUT);             //an IN3  an Rad rechts
   pinMode (17,OUTPUT);            //an IN4  an Rad rechts

   pinMode (6,OUTPUT);             //an EN1  Geschwindigkeit an Rad links
   pinMode (5,OUTPUT);             //an EN2  Geschwindigkeit an Rad rechts

  /*stop*/  
  digitalWrite (11,LOW);
  digitalWrite (8,LOW);
  digitalWrite (17,LOW);
  digitalWrite (7,LOW);
  }


  void loop()
  {
   if (IrReceiver.decode()) 
   {
    IrReceiver.resume();
    Serial.println(IrReceiver.decodedIRData.command);
   }  
   
   int value = IrReceiver.decodedIRData.command;
   switch(value)
   {
    case 24: forward(); break;          // Button "Pfeil vor"
    case 82: back(); break;             // Button "Pfeil rueck"
    case 8: left(); break;              // Button "Pfeil rechts"
    case 90: right(); break;            // Button "Pfeil links"
    case 28: stopp(); break;            // Button "OK"
    case 25: hupen();break;             // Button "0"
    default: break;             //break: Programm springt weiter 
   } 
  }
Fahrablaufmodule.h
void forward()
  {   
    digitalWrite(7, HIGH);            // Schalte Motoren RECHTS ein 
    digitalWrite(17, LOW);                                                      
    analogWrite(5, 250);               // Setze die Geschwindigkeit zwischen 0...255
    digitalWrite(11, HIGH);            // Schalte Motoren LINKS ein 
    digitalWrite(8, LOW);                                
    analogWrite(6, 250);              // Setze die Geschwindigkeit zwischen 0...255
    Serial.println("FORWARD");
  }
  
  void back()
  {   
    digitalWrite(7, LOW);            // Schalte Motoren RECHTS ein 
    digitalWrite(17, HIGH);                                                      
    analogWrite(5, 250);              // Setze die Geschwindigkeit zwischen 0...255
    digitalWrite(11, LOW);            // Schalte Motoren LINKS ein 
    digitalWrite(8, HIGH);                                
    analogWrite(6, 250);               // Setze die Geschwindigkeit zwischen 0...255
    Serial.println("BACK");
  }
  
  void left()
  {   
    digitalWrite(7, HIGH);            // Schalte Motoren RECHTS ein 
    digitalWrite(17, LOW);                                                      
    analogWrite(5, 250);              // Setze die Geschwindigkeit zwischen 0...255
    digitalWrite(11, LOW);            // Schalte Motoren LINKS ein 
    digitalWrite(8, HIGH);                                
    analogWrite(6, 250);               // Setze die Geschwindigkeit zwischen 0...255
    Serial.println("LEFT");
  }
  
  void right()
  {   
    digitalWrite(7, LOW);            // Schalte Motoren RECHTS ein 
    digitalWrite(17, HIGH);                                                      
    analogWrite(5, 250);              // Setze die Geschwindigkeit zwischen 0...255
    digitalWrite(11, HIGH);            // Schalte Motoren LINKS ein 
    digitalWrite(8, LOW);                                
    analogWrite(6, 250);               // Setze die Geschwindigkeit zwischen 0...255
    Serial.println("RIGHT");
  }
  
  void stopp()
  {
    digitalWrite(7, LOW);             // Schalte alle Motoren aus
    digitalWrite(17, LOW);  
    digitalWrite(11, LOW); 
    digitalWrite(8, LOW);  
    Serial.println("STOP");  
  }
Hupen.h
 /*Es wird ein Ton erzeugt mit einem Passive Buzzer (Piezo-Summer).
    Die Tonhoehe (Frequenz) und Tondauer kann programmiert werden.
    Achtung: Der Befehl "tone()" kann nicht verwendet werden, ist in Kollision mit dem Bibliotheksprogramm IRremote.*/ 
     
    void hupen()
    {
     pinMode(4, OUTPUT);                   //an Pin D4 Tonsignal zum Passive Buzzer 
     for (int i=0 ; i<500 ; i++)           //HIGH-LOW wiederholen i-mal
      {
      digitalWrite (4 , HIGH);             // HIGH fuer 1ms
      delay (1);
      digitalWrite (4 , LOW);              // LOW fuer 1ms
      delay (1);
      }                          
    }