Anfaenger hat Problem mit Scetch fuer 38KHZ Fernbedienung

Guten Abend zusammen,

ich habe einen Arduino Nano 3xx P eine IR Empfängerdiode, zugehoerige Fernbedienung.

Ich bin was das programmieren angeht ein absoluter Anfänger, habe mir aber auf YT einige Videos angesehen und auch schon ein paar Scetche abgetippt und ausprobiert, das hat soweit auch funktioniert.

nun habe ich den unten stehenden Code geschrieben für die Fernbedienung. Die Tasten 1,2,4 und 0 funktionieren wie gewuenscht, aber das Lauflicht welches mit Taste 3 gestartet werden soll funktioniert nicht.

könnte mir jemand bitte erklaeren was ich hier falsch mache und mir helfen damit ich es zum laufen bekomme.

hier mein code

#include <IRremote.hpp>
 
int eingangspin = 11;
int LEDred = 10;
int LEDgreen = 9;
int LED = 6;
int LED1 = 7;
 
int WertTaste1 = 0;
int WertTaste2 = 0;
int Taste3 = 0;
int Taste4 = 0;
 
 
int StatusLEDred = HIGH;
int StatusLEDgreen = HIGH;
int StatusLED = HIGH;
int StatusLED1 = HIGH;
 
unsigned long previousMillisLEDred = 0;
unsigned long previousMillisLEDgreen = 0;
const long Intervalred = 1000;
const long Intervalgreen = 250;
 
int LEDrund [3] = {3, 4, 5};
int counter = 0;
unsigned long previousMillis = 0;
const long intervall = 75;
 
void setup() {
  {
    for (int i = 0; i < 3; i++)
      pinMode (LEDrund , OUTPUT);
  }
 
  Serial.begin(9600);
  IrReceiver.begin (eingangspin);
 
 
 
  pinMode (LEDred, OUTPUT);
  pinMode (LEDgreen, OUTPUT);
  pinMode (LED, OUTPUT);
  pinMode (LED1, OUTPUT);
}
 
 
void loop() {
  if (IrReceiver.decode()) {
    IrReceiver.printIRResultShort (&Serial);
    switch (IrReceiver.decodedIRData.command) {
      case 0x45:
        if (WertTaste1 == 0) {
          WertTaste1 = 1;
          Serial.print("Eingeschaltet");
          Serial.print("WertTaste1");
        }
        else {
          Serial.print("Ausgeschaltet");
          WertTaste1 = 0;
        } break;
 
      case 0x46:
        if (WertTaste2 == 0) {
          WertTaste2 = 1;
          Serial.print ("Eingeschaltet");
          Serial.print ("WertTaste2");
        }
        else {
          Serial.print ("Ausgeschaltet");
          WertTaste2 = 0;
        } break;
      case 0x47:
        if (Taste3 == 0) {
          Taste3 = 1;
        }
        else {
          Taste3 = 0;
        } break;
      case 0x44:
        if (Taste4 == 0) {
          Taste4 = 1;
        }
        else {
          Taste4 = 0;
        }
 
      default:
        break;
    }
    delay (200);
    IrReceiver.resume();
  }
  if (WertTaste1 == 1) {
    loop_red ();
  }
  else {
    digitalWrite (LEDred, HIGH);
  }
  if (WertTaste2 == 1) {
    loop_green ();
  }
  else {
    digitalWrite (LEDgreen, HIGH);
  }
  if (Taste3 == 1) {
    loop_rund ();
  }
  else {
    digitalWrite (LEDrund, HIGH);
  }
  if (Taste4 == 1) {
    digitalWrite(LED, LOW);
    digitalWrite (LED1, LOW);
  }
  else {
    digitalWrite (LED, HIGH);
    digitalWrite (LED1, HIGH);
  }
  if (IrReceiver.decodedIRData.command == 0x19) {
    WertTaste1 = 0;
    WertTaste2 = 0;
    Taste3 = 0;
    Taste4 = 0;
  }
}
 
 
void loop_red() {
  unsigned long currentMillisLEDred = millis();
  if (currentMillisLEDred - previousMillisLEDred >= Intervalred) {
    previousMillisLEDred = currentMillisLEDred;
    if (StatusLEDred == HIGH) {
      StatusLEDred = LOW;
    }
    else {
      StatusLEDred = HIGH;
    }
    digitalWrite (LEDred, StatusLEDred);
  }
}
 
void loop_green () {
  unsigned long currentMillisLEDgreen = millis ();
  if (currentMillisLEDgreen - previousMillisLEDgreen >= Intervalgreen) {
    previousMillisLEDgreen = currentMillisLEDgreen;
    if (StatusLEDgreen == HIGH) {
      StatusLEDgreen = LOW;
    }
    else {
      StatusLEDgreen = HIGH;
    }
    digitalWrite (LEDgreen, StatusLEDgreen);
  }
}
void loop_rund () {
  unsigned long currentMillis = millis ();
  if (currentMillis - previousMillis >= intervall) {
    previousMillis = currentMillis;
    if (counter == 0) {
      digitalWrite(LEDrund[2], HIGH);
    }
    else {
      digitalWrite(LEDrund[counter - 1], HIGH);
    }
    digitalWrite(LEDrund[counter], LOW);
    counter = counter + 1;
    if (counter > 3) {
      counter = 0;
    }
  }
}
 

vielen Dank

Thomas

Warum verwendest du nicht einen dafür geeigneten IR-Empfänger, statt der Diode. Z.B. den TSOP 31238. Damit wirst du sicher dein Problem lösen.
Und das die IR-Fernbedienung nur einzelne Ziffern ausgibt, kann ich mir auch nicht vorstellen.

Ich habe mir ein ir fb set von fasizi geholt, da ist die empfängerdiode auf einer Platine mit led

Das sagt nix....poste doch bitte mal einen Link dazu. Da kann man mehr erkennen.

Edit:
Noch ein Tipp, teste deine ersten Sketch mit einem Beispiel aus der Library IRRemote. Wenn es funktioniert, kannst du den mit deinen spezielle Funktionen erweitern.
Aber bedenke, die Codezahlen aus der Fernbedienung sind def. mehrstellig.

Fasizi Infrarot-IR-Fernbedienungs-Sensormodul-Set für Arduino, 4 Stück https://amzn.eu/d/8m1dsoE

Hier der link zu dem fb set

Ich nutze nur die hex der Tasten

Die Funktionen welche auf den Tasten 1;2 und 4 liegen funktionieren ja auch nur das lauflicht (loop_rund) läuft nicht

Ok, das mit dem Hex-Code habe ich übersehen.
Hast du denn mal die Funktion "loop_rund" mal über eine andere Taste gestartet ?
Läuft diese Funktion fehlerfrei ?
Oder liegt es an der unbersichtlichen Verschachtelung der if-Abfrage und Switch / Case.
Da steige ich aktuell nicht durch. Da fehlen Kommenttare, was passieren soll.

Über eine andere Taste habe ich es noch nicht probiert, ich füge morgen mal Kommentare dem Code zu.

Ich habe den Code für loop_rund ohne fb probiert und da lief er, werde den Code morgen auch eben mit zeigen.

Ok, da kommen wir sicher weiter.
Teste mal mit einer funktionierenden Taste.

Für die Fernbedienung gibt es eine Lib was dir direkt die 17 Code anzeigt , must nur anpassen an dein Sketch :wink:
Habe gestern gesucht nach IR für ESP und habe die gefunden.
Must aber den Beispiel für IRcontroller_17 starten, die Lib ist so einfach das du solltest keine Probleme haben die in deinem Sketch einbinden. Wen doch fragen :wink:
Noch was die Lib ist nur für die einfachen Fernbedienungen für Arduino
Unterstützt nur die beide bei anderen kommt "WARNING: undefined command:"
image
image

Die IRremote will nicht vernünftig mit ESP32 arbeiten, bei ESP8266 funktioniert die 1A

Da ist ein Fehler drin:

for (int i = 0; i < 3; i++)
      pinMode (LEDrund[i] , OUTPUT);
1 Like

Wenn man die 3 nicht falsch machen will und die Variable i nicht weiter braucht, gibt es heutzutage in C++ auch die Möglichkeit, das so zu schreiben:

for (byte pin: LEDrund)
      pinMode(pin, OUTPUT);

In anderen Sprachen nennt man das auch mal "for each"

1 Like

Sehr gut, :hugs:
wundert mich allerdings, dass diese Funktion lt. TO funktionieren soll.

vielen Dank das wars jetzt funktioniert das rundumlicht zu 98%. jetzt bleibt beim abschalten des Rundumlichtes noch eine LED an

hier noch mal der aktuelle Code mit komentaren

/* dieses Programm soll ermoeglichen ein Standmodell in Massstab 1 zu 50 bzw 1 zu 87 mit Beleuchtung auszustatten und mit einer Fernbedienung zu schalten*/

#include <IRremote.hpp>

int eingangspin = 11; //Empfaengerpin
int LEDred = 10; // Warnblinker
int LEDgreen = 9; // Frontblitzer
int LED = 6; // Grundbeleuchtung
int LED1 = 7; // Grundbeleuchtung


int WertTaste1 = 0; // Taste fuer Warnblinker
int WertTaste2 = 0; // Taste fuer Frontblitzer
int Taste3 = 0; // Taste fuer Rundumleuchten
int Taste4 = 0; // Taste fuer Licht


int StatusLEDred = HIGH;
int StatusLEDgreen = HIGH;
int StatusLED = HIGH;
int StatusLED1 = HIGH;

unsigned long previousMillisLEDred = 0; //Warnblinker
unsigned long previousMillisLEDgreen = 0; // Frontblitzer
const long Intervalred = 1000; // Zeit für Warnblinker
const long Intervalgreen = 250; // Zeit für Frontblitzer

int LEDrund [3] = {3, 4, 5}; // Rundumleuchte
int counter = 0;
unsigned long previousMillis = 0;
const long intervall = 75; // Zeit für den wechsel zwischen den einzelnen LED der Rundumleuchte

void setup() {
  {
    for (byte pin : LEDrund)
      pinMode(pin, OUTPUT);// gehoehrt zum RUNDumlicht
  }

  Serial.begin(9600);
  IrReceiver.begin (eingangspin);



  pinMode (LEDred, OUTPUT);
  pinMode (LEDgreen, OUTPUT);
  pinMode (LED, OUTPUT);
  pinMode (LED1, OUTPUT);

}


void loop() {
  if (IrReceiver.decode()) {
    IrReceiver.printIRResultShort (&Serial);
    switch (IrReceiver.decodedIRData.command) {
      case 0x45: // Schaltet den Warnblinker ein oder aus
        if (WertTaste1 == 0) {
          WertTaste1 = 1;
          Serial.print("Eingeschaltet");
          Serial.print("WertTaste1");
        }
        else {
          Serial.print("Ausgeschaltet");
          WertTaste1 = 0;
        } break;

      case 0x46: // schaltet den Frontblitzer ein oder aus
        if (WertTaste2 == 0) {
          WertTaste2 = 1;
          Serial.print ("Eingeschaltet");
          Serial.print ("WertTaste2");
        }
        else {
          Serial.print ("Ausgeschaltet");
          WertTaste2 = 0;
        } break;
      case 0x47: // schaltet das Rundumlicht ein oder aus
        if (Taste3 == 0) {
          Taste3 = 1;
        }
        else {
          Taste3 = 0;
        } break;
      case 0x44: // Schaltet das Fahrlicht ein oder aus
        if (Taste4 == 0) {
          Taste4 = 1;
        }
        else {
          Taste4 = 0;
        }

      default:
        break;
    }
    delay (200);
    IrReceiver.resume();
  }
  if (WertTaste1 == 1) {
    loop_red ();
  }
  else {
    digitalWrite (LEDred, HIGH);
  }
  if (WertTaste2 == 1) {
    loop_green ();
  }
  else {
    digitalWrite (LEDgreen, HIGH);
  }
  if (Taste3 == 1) {
    loop_rund ();
  }
  else {
    digitalWrite (LEDrund , HIGH);
  }
  if (Taste4 == 1) {
    digitalWrite(LED, LOW);
    digitalWrite (LED1, LOW);
  }
  else {
    digitalWrite (LED, HIGH);
    digitalWrite (LED1, HIGH);
  }

  if (IrReceiver.decodedIRData.command == 0x19) // Taste 0 schaltet alles ab
  {
    WertTaste1 = 0;
    WertTaste2 = 0;
    Taste3 = 0;
    Taste4 = 0;
  }
}


void loop_red() {
  unsigned long currentMillisLEDred = millis();
  if (currentMillisLEDred - previousMillisLEDred >= Intervalred) {
    previousMillisLEDred = currentMillisLEDred;
    if (StatusLEDred == HIGH) {
      StatusLEDred = LOW;
    }
    else {
      StatusLEDred = HIGH;
    }
    digitalWrite (LEDred, StatusLEDred);
  }
}

void loop_green () {
  unsigned long currentMillisLEDgreen = millis ();
  if (currentMillisLEDgreen - previousMillisLEDgreen >= Intervalgreen) {
    previousMillisLEDgreen = currentMillisLEDgreen;
    if (StatusLEDgreen == HIGH) {
      StatusLEDgreen = LOW;
    }
    else {
      StatusLEDgreen = HIGH;
    }
    digitalWrite (LEDgreen, StatusLEDgreen);
  }
}
void loop_rund () {
  unsigned long currentMillis = millis ();
  if (currentMillis - previousMillis >= intervall) {
    previousMillis = currentMillis;
    if (counter == 0) {
      digitalWrite(LEDrund[2], HIGH);
    }
    else {
      digitalWrite(LEDrund[counter - 1], HIGH);
    }
    digitalWrite(LEDrund[counter], LOW);
    counter = counter + 1;
    if (counter > 2) {
      counter = 0;
    }
  }
}

Das passt irgendwie nicht.

Dann kann es aber zuvor auch nicht funktioniert haben.
Es sei denn mit einem Sketch, den wir nicht kennen.

was soll da nicht passen ??

ich habe nur die eine Zeile im sketch geändert.

hier noch der sketch vom Lauflicht ohne fernbedienung

int ledPin[3] = {3, 4, 5,};
int counter = 0;

unsigned long previosMillis = 0;
const long interval = 75;

void setup() {
  for (int i = 0; i < 3; i++) {
    pinMode (ledPin [i], OUTPUT);

  }
}

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previosMillis >= interval) {
    previosMillis = currentMillis;
    if (counter == 0) {
      digitalWrite(ledPin[2], HIGH);
    
  }    else {
      digitalWrite(ledPin[counter - 1], HIGH);
    }
    digitalWrite(ledPin[counter], LOW);
    counter = counter + 1;
    if (counter > 3) {
      counter = 0;
    }
  }
}

Wen du stolperst über IRremote.hpp ja die neue Version ist so, nicht .h

1 Like

Ok, @fony danke für die Richtigstellung.
Das war mir tatsächlich bisher nicht bekannt.

Sorry, mein Fehler/Irrtum.
Passt schon.

1 Like