HC-05 Werte mit Arduino Mega auswerten

Hallo,
ich bin noch neu hier im Forum, also bitte drauf aufmerksam machen, wenn ich Etwas falsch mache.
Ich habe ein kleines Projekt angefangen, in dem ich Werte von meinem Handy (per Bluetooth, App: Serial Bluetooth Terminal) an das HC-05 Modul sende und der Arduino Mega diese auswertet und eine LED ein bzw. aus schalten. Ich habe alles bisher hinbekommen. Die Werte die ich per Handy an das Modul schicke werden im Seriellen Monitor am Computer angezeigt. Allerdings versuche ich nun, dass der Arduino eine LED ein und aus schaltet wenn ich "off" bzw. "on" sende. Allerdings werden diese Werte nicht richtig ausgelesen und die beiden If Schleifen werden meiner Meinung nach übersprungen. Setze ich allerdings den String btData schon von Anfang an auf "off", oder "on" werden die if-Schleifen geschaltet.

Hier der Code:

#include<SoftwareSerial.h>

#define rx 51
#define tx 50
#define ledPin 38

SoftwareSerial btSerial(tx, rx);

String btData;

void setup() {
Serial.begin(9600);
btSerial.begin(9600);
btSerial.println("bluetooth available");
pinMode(ledPin,OUTPUT);
digitalWrite(ledPin,HIGH);
delay(2000);
digitalWrite(ledPin,LOW);
}

void loop() {
if (btSerial.available() > 0){
btData = btSerial.readString();
Serial.println(btData);
}
if(btData=="on"){
digitalWrite(ledPin,HIGH);
btSerial.println("LED on Pin 13 is on");
}
if (btData=="off"){
digitalWrite(ledPin,LOW);
btSerial.println("LED on Pin 13 is off");
}
delay(1000);
}

Hallo,
dann lass Dir mal die hex Werte aller Zeichen von btData anzeigen. Ich denke da fehlt ein unsichtbares Endzeichen LF oder CR

such mal nach Serial.readStringUntil()

Heinz

Danke für die schnelle Antwort, leider bin ich neu in dem Bereich und weiß leider nicht wie man dies macht. Im seriellen Monitor habe ich übrigens CR+NL aktiv, beim Senden auch. Wenn du also recht hast, wie lässt sich dies beheben, aber danke nochmals. :smiley:

Ich habe es jetzt hinbekommen, das Problem lag an der App, die ich benutzt habe. Dort war Newline auf Cr+LF gestellt. Ich habe dies auf Nul gestellt und nun geht es. Was bedeutet dies eigentlich und warum hat es vorher nicht funktioniert?

Da wurde eben mehr gelesen als "on" , genaugenommen war es "on\r\n" (mit den Zeichen für das Zeilenende).

Für meinen Geschmack war der Fehler in deinem

String ist nur sinnvoll, wenn es funktioniert. Bei allen Problemen kommt man ohne String-Objekte besser zurecht.

Eine Möglichkeit wäre, statt "on" / "off" einfach "0" oder "1" zu senden und das mit btSerial.parseInt()
abzufragen. Da werden eventuelle Zeileende-Zeichen ignoriert.

Ist es Absicht, dass jede Sekunde (delay(1000);) an btSerial der Text gesendet wird? Oder wäre es besser, ein richtig empfangenes Kommando genau einmal zu bestätigen?

Vielen Dank für deine Erklärung. Die hat mir wirklich sehr weitergeholfen. Den Befehl mit "delay(1000)" habe ich geschrieben, damit mein "Terminal" auf dem Handy nicht mit Nachrichten zuläuft (tut es zwar trotzdem, versuche es aber zu ändern).