Ir Sender funktioniert nicht

Ich habe die Fernbedienung eingelesen und die raw daten gespeichert.
Wenn ich versuche mit den raw daten das ir signal zu senden, funktioniert es nicht.


#include <IRremote.h>

IRsend irsend;

void setup()
{
  Serial.begin(9600);
}

void loop() {
       unsigned int raw[24] = {8000,1250,450,1200,450,350,1300,1200,500,1200,450,400,1250,400,1250,450,1250,400,1250,400,1300,1200,450,400,};
      irsend.sendRaw(raw,24,32); // Sony TV power code
      delay(40);
}

Danach habe ich die Ir Sendedaten mit einem anderen arduino ausgelesen:
Unknown encoding: BE29CE13 (32 bits)
Raw (24): 25436 8000 -1200 500 -1150 500 -300 1300 -1200 500 -1200 450 -400 1250 -400 1250 -450 1250 -400 1250 -400 1300 -1200 400
2A049A97

wieso werden nicht die eingegebenen daten gesendet?

Du schreibst nicht, was für ein Arduino. Wenn es ein 8-Bit-MC ist, ist int 16 Bit groß, Du willst aber darin 32 Bit speichern. Dann nimm lieber unsigned long.

Gruß Tommy

Es ist ein Arduino uno
Ich habe es jetzt mit long probiert, da hat mir der Compiler aber eine Fehlermeldung ausgespuckt:

Arduino: 1.8.19 (Windows Store 1.8.57.0) (Windows 10), Board: "Arduino Uno"

C:\Users\Frenik\AppData\Local\Temp\arduino_modified_sketch_321050\IRsendDemo.ino: In function 'void loop()':

IRsendDemo:20:31: error: no matching function for call to 'IRsend::sendRaw(long unsigned int [24], int, int)'

       irsend.sendRaw(raw,24,32); // Sony TV power code

                               ^

In file included from C:\Users\Frenik\AppData\Local\Temp\arduino_modified_sketch_321050\IRsendDemo.ino:9:0:

C:\Users\Frenik\Documents\Arduino\libraries\IRremote/IRremote.h:103:8: note: candidate: void IRsend::sendRaw(unsigned int*, int, int)

   void sendRaw(unsigned int buf[], int len, int hz);

        ^~~~~~~

C:\Users\Frenik\Documents\Arduino\libraries\IRremote/IRremote.h:103:8: note:   no known conversion for argument 1 from 'long unsigned int [24]' to 'unsigned int*'

exit status 1

no matching function for call to 'IRsend::sendRaw(long unsigned int [24], int, int)'



This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences

.

Gruß Frenik

Ok, dann ist es als int definiert. Da stimmt aber Deine 32 Bit-Angabe nicht.

Gruß Tommy

Beim einlesen der Fernbedienung zeigte es mir aber an, das es ein 32 bit signal ist.
Gruß Frenik

Schon mal die SendRawDemo genau angeschaut?
Was ist da der 3. Parameter?

Woher nimmst Du die 32 Bit? Hast Du Dich möglicherweise von der Frequenz irritieren lassen?

Entweder als uint16_t für die Mikrosekunden oder uint8_t für die "Ticks".

@freniktest: Wenn der Kommentar stimmt und es eine Sony-Fernbedienung ist, solltest Du besser sendSony verwenden.

Der IR-Sensor am Arduino muß die selbe Trägerfrequenz erkennen, mit der die Fernbedienung sendet.

Danke für die Antworten

Das Kommentar stimmt nicht ich habe es vergessen zu löschen.
Es ist keine Sony fernbedienung.

Ich habe die 32 Bit aus #1

Gruß Tommy

Was denn dann?

In einem anderen Thema gab es eine Ventilatorfernbedienung mit mehr Daten, für die man in der Bibliothek erst Parameter freischalten muß. Daher meine Frage nach mehr Infos.

Kennst Du die Trägerfrequenz?

Ich kenne die Trägerfrequenz nicht.
Soll ein Projekt werden bei dem ich versuche die Ferngesteuerte Deckenlampe und den LED Streifen mit dem Arduino zu steuern.
Beim LED Streifen funktioniert es gut (NEC Protokoll).
Bei der Deckenlampe funktioniert es leider nicht (RAW Daten).
Gruß Frenik

Mit einem Oszi könntest Du sie messen.

Sind die eingelesenen Daten denn stabil?

Wie sieht die Sendeschaltung aus?

Wie sieht die Empfangsschaltung aus?

Bekommst Du es mit einer Fernbedienung mit bekannten Code hin, wo Du die RAW-Daten sendest? Also mit RAW-Daten zum LED-Streifen senden.

Irgendwo hast Du einen Fehler drin, den Du durch systematisches Suchen und Probieren finden kannst.

Hallo erstmal ins Forum!
Ich habe das Thema gerade gefunden. Vermutlich wurde das Problem bereits gelöst. Aber da ich selbst noch eine Frage habe, erstelle ich dennoch einen Beitrag. Vorweg: Ich habe eigentlich Null Ahnung vom Programmieren und nur etwas Wissen über Elektronik.
Ich möchte eine Schaltung erstellen, die zwei Temperaturen (oben und unten) im Raum misst und vergleicht. Bei einem eingestellten Deltawert soll ein oben im Raum angebrauchter Ventilator geschaltet werden. Den Temperaturvergleich habe ich schon zusammengestellt. Leider kann ich den Lüfter nicht über ein Relais schalten. Daher habe ich mir an der IR Schaltung fast die Zähne ausgebissen. Ich habe mithilfe von IRremote.h die Fernbedienung ausgelesen (ReceiveDump aus den Beispielen). Leider entspricht der Code scheinbar keiner bekannten Codierung. Den Code habe ich dann als Raw gesendet. Es hat einfach nicht funktioniert. Ich habe dann die Signale in Excel ausgewertet und verglichen. Klar wäre ein Oszi nicht schlecht. Nach einer Korrekturschleife der Signalzeiten treffen sich Soll und Istwert ganz gut. Zuvor gab es einige zeitliche Abweichungen, die um 30 bis 80 Microns lagen. Aber es hat dennoch nicht funktioniert. Nach langem probieren habe ich den Signalcode zweimal in das Array geschrieben. Und damit hat es dann endlich funktioniert. Beim Ausschaltcode habe ich nichtmal das Timing angepasst.
Kann es sein, dass der Ventilator den Code mindestens 2x empfangen will? Oder habe ich den Code noch nicht verstanden und müsste eigentlich einen andern Bereich der Bitkette senden? Ich habe auch schon versucht vorne oder hinten an den Bitketten Zahlen weg zu lassen. Aber dann geht es nicht mehr. Was meint ihr dazu? Unten der Vergleich dessen, was ich mit Receive Dump aus der FB ausgelesen habe und dessen, was gesendet wird und ich mit einem zweiten Arduino wiederum mit Receive Dump ausgelesen habe

So sieht des Testprogramm für das Senden aus:

#include <Arduino.h>
#include "PinDefinitionsAndMore.h" // Define macros for input and output pin etc.
#include <IRremote.hpp>

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);

  Serial.begin(115200);

  delay(4000); // To be able to connect Serial monitor after reset or power up and before first print out. Do not wait for an attached Serial Monitor!
 
  IrSender.begin(); // Start with IR_SEND_PIN as send pin and enable feedback LED at default feedback LED pin

  Serial.println(F("Ready to send IR signals at pin "  STR(IR_SEND_PIN)));
}

void loop() {

  Serial.println(F("Send as microseconds array - On"));
  Serial.flush();
    const uint16_t rawDataOn[] = {1276, 408, 1272, 412, 428, 1252, 1252, 428, 1272, 408, 432, 1256, 424, 1264, 440, 1244, 440, 1260, 456, 1236, 1300, 388, 440, 8088, 1276, 408, 1272, 412, 428, 1252, 1252, 428, 1272, 408, 432, 1256, 424, 1264, 440, 1244, 440, 1260, 456, 1236, 1300, 388, 440, 8088 };
  IrSender.sendRaw(rawDataOn, sizeof(rawDataOn) / sizeof(rawDataOn[0]), 38);

  delay(3000);

  Serial.println(F("Send as microseconds array - Off"));
  Serial.flush();
    const uint16_t rawDataOff[] = {1344, 360, 1340, 352, 496, 1200, 1344, 356, 1340, 356, 496, 1200, 496, 1228, 444, 1228, 468, 1228, 468, 1256, 464, 1232, 1316, 7192, 1344, 360, 1340, 352, 496, 1200, 1344, 356, 1340, 356, 496, 1200, 496, 1228, 444, 1228, 468, 1228, 468, 1256, 464, 1232, 1316, 7192 };
  IrSender.sendRaw(rawDataOff, sizeof(rawDataOff) / sizeof(rawDataOff[0]), 38);

  delay(3000);
}

Das mit den Repeats ist absolut plausibel, du kannst es wahrscheinlich auch 3 mal senden.
Aber nutze doch ein Raw array und mache zwischen dem Senden eine delay.
Leider dauert das Ausgeben im Arduino so lange, dass es die Repeats verpasst.

Die Möglichkeit einen Repeat in Verbindung mit dem sendRaw aufzurufen habe ich nicht gesehen.
Mit dem single aray hatte ich es anfangs schon mal probiert. Das hatte nicht funktioniert. Vielleicht hatte ich den delay zu lang gemacht. Deshalb hatte ich das Daten array doppelt geschrieben.
Ich habe nun nochmal ein single array geschrieben und zweimal den sendRaw nacheinander mit einem delay(10) aufgerufen. Das hat funktioniert. Ich habe dann das delay weggelassen. Auch das funktioniert. Vermutlich weil die lange Pause am Ende der Sequenz liegt. Irgendwie finde ich das seltsam. Wenn der Empfänger eine komplette Sequenz vor einer Pause braucht und dann nochmal eine komplette Sequenz um zu schalten, dann bedeutet das, dass eine einzelne Sequenz nicht zum Schaltvorgang führt. Aber das scheint so zu sein. Irgendwie wirkt das ja auch wie eine Art Entprellung der Fernbedienung.

Versuch mal die IRMP library, dort ist es das FAN protokoll.

Hallo
Zum einlesen des RAW Codes der Fernbedienung habe ich nach längerer recherche folgenden Code gefunden:

#define sprint Serial.print 
#define sprintln Serial.println
#include <IRremote.h>

#define IR_RCVR_PIN 11
IRrecv ir_receiver(IR_RCVR_PIN);
decode_results results;

void setup() {
    Serial.begin(9600);
    ir_receiver.enableIRIn(); // Start the receiver
}

void loop() {
   if (ir_receiver.decode(&results)) {
    dump(&results);
    ir_receiver.resume(); // Receive the next value
   }
}

int c = 1;

void dump(decode_results *results) {
   int count = results->rawlen;
   sprintln(c);
   c++;
   sprintln("For IR Scope: ");
   for (int i = 1; i < count; i++) {
       sprint("0x");
       sprint((unsigned int)results->rawbuf[i], HEX);
    sprint(" ");
   }

   sprintln("");
   sprintln("For Arduino sketch: ");
   sprint("unsigned int raw[");
   sprint(count, DEC);
   sprint("] = {");
   for (int i = 1; i < count; i++) {
       sprint("0x");
       sprint((unsigned int)results->rawbuf[i], HEX);
       sprint(",");
    }
    sprint("};");
    sprintln("");
    sprint("irsend.sendRaw(raw,");
    sprint(count, DEC);
    sprint(",38);");
    sprintln("");
    sprintln("");
}

Jedoch muss jedes Element im RAW Array vor dem Senden mit 50 Mulltipliziert werden.
Mein Beispielcode dafür:

#include<IRremote.h>
IRsend irsend;

unsigned int raw[24] = {0x18,0x9,0x18,0x9,0x8,0x1A,0x19,0x8,0x19,0x9,0x8,0x19,0x8,0x19,0x19,0x9,0x8,0x19,0x8,0x19,0x9,0x19,0x7,};


void setup() {
  
  for(int i = 0;i<24;i++){
    raw[i] = raw[i]*50;
  }

}

void loop() {

  irsend.sendRaw(raw,24,38);

  delay(40);
}

Hoffe ich konnte helfen
Lg Frenik

Oder nimm einfach das ReceiveDump Example der IRremote Library :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.