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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.