Arduino IR + MTTQ

Gast #4680420
Lesenswert?

Hallo zusammen,

ich stehe gerade vor einem Problem, zu dem ich einfach keine Lösung 
finde:

In meinem Schlafzimmer befindet sich ein Arduino, der mittels MTTQ 
Client IR Codes empfangen soll und diese dann mit der IRemote Libary 
senden soll.

Die Verbindung von MTTQ zum Arduino funktioniert. Ich erhalte auch die 
korretkten Befehle auf dem Arduino (Als String).

Nun zu dem Problem:

Mit dem Befehl irsend.sendNEC möchte ich z.B. am TV die Lautstärke 
verringern. Schreibe ich den IR Code "0xE0E0D02F" hardcoded, 
funktioniert das Ganze: irsend.sendNEC(0xE0E0D02F, 32);

Hier die Function:

void callback(char* topic, byte* payload, unsigned int length) {
 // Zähler
 int i = 0;
 // Hilfsvariablen für die Convertierung der Nachricht in ein String
 char message_buff[100];

 Serial.println("Message arrived: topic: " + String(topic));
 Serial.println("Length: " + String(length,DEC));

 // Kopieren der Nachricht und erstellen eines Bytes mit abschließender 
\0
 for(i=0; i<length; i++) {
 message_buff[i] = payload[i];
 }
 message_buff[i] = '\0';

 // Konvertierung der nachricht in ein String
 String msgString = String(message_buff);
 Serial.println("Payload: " + msgString);

 irsend.sendNEC(msgString.toInt(),32); //Bsp: 0xE0E0D02F
}

Wieso funktioniert die Konvertierung nicht aber wenn ich den Code direkt 
eingebe schon?


Vielen Dank für Eure Hilfe! :)
Gast #4680483
Lesenswert?

Bitte in C-Code-Tags.
1
void callback(char* topic, byte* payload, unsigned int length) {
2
// Zähler
3
    int i = 0;
4
// Hilfsvariablen für die Convertierung der Nachricht in ein String
5
    char message_buff[100];
6

7
    Serial.println("Message arrived: topic: " + String(topic));
8
    Serial.println("Length: " + String(length,DEC));
9

10
// Kopieren der Nachricht und erstellen eines Bytes mit abschließender \0
11
    for(i=0; i<length; i++) {
12
        message_buff[i] = payload[i];
13
    }
14
    message_buff[i] = '\0';
15

16
// Konvertierung der nachricht in ein String
17
    String msgString = String(message_buff);
18
    Serial.println("Payload: " + msgString);
19

20
    irsend.sendNEC(msgString.toInt(),32); //Bsp: 0xE0E0D02F
21
}

An welche Stelle des Arrays wird das letzte Byte geschrieben? Wohin wird 
\0 geschrieben?


Weiterhin: Fehler isolieren. Passt der konvertierte String noch? Oder 
geht vorher etwas schief? Was passiert bei:
1
String msgString = "0xE0E0D02F"
2
Serial.println("Payload: " + msgString);
3
irsend.sendNEC(msgString.toInt(),32); //Bsp: 0xE0E0D02F

Was soll passieren, wenn (warum auch immer) length mal >= 100 ist?


Nachtrag: nochmal Nachgesehen (im Source-Code, die Arduino-Doku von 
toInt() ist ein Witz). toInt benutzt nur atol(), und das verträgt nur 
dezimale Zahlen.
Gast #4680560
Lesenswert?

Hallo, danke erstmal für die Antworten! Ich habe das Problem jetzt auf 
anderem Weg gelöst. Ich habe mir die IR Codes direkt als Integer 
ausgeben lassen und diese dann mittels .toInt konvertiert. Vielleicht 
nicht die eleganteste Lösung aber die Performance und Stabilität stimmt.

Die Arraylänge ist mir auch schon aufgefallen, habe ich jedoch nicht 
weiter beachtet, da die Codes nicht so lang sind - Die meisten Teile des 
Codes stammen aus einem Tutorial, die ich nur an meine Bedürfnisse 
angepasst habe.

Wie auch immer vielen Dank für die Hilfe!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren