ich stecke gerade bei einem ganz grundsätzlichen Problem fest und ich hoffe, dass mir hier jemand helfen kann.
Ich baue zur Zeit einen Sensorprüfstand, mit dem Näherungssensoren auf ihre Genauigkeit geprüft werden können. Der Sensor befindet sich dabei auf dem Schlitten eines Linearantriebs, der über einen Steppermotor angetrieben wird.
Gesteuert wird das ganze über eine App, die Steuerungsbefehle via Bluetooth an einen ESP32 sendet, der den Antrieb entsprechend steuert und die Sensorwerte ausliest.
Jetzt zu meinem Problem:
Ein bestimmter Steuerbefehl ist dafür zuständig, dass der Linearantrieb einen zuvor in der App eingegebenen Festpunkt anfährt. Dieser Wert wird dann seriell als Text über Bluetooth übertragen. Das funktioniert auch reibungslos, allerdings muss der Wert noch umgerechnet werden, um mit ihm dem Stepper seine Schrittanzahl vorzugeben.
Und da ist das Problem. Die Werte werden, wie üblich im Seriellbetrieb schätze ich, als einzelne Ziffern übertragen:
Aus "120" wird beispielsweise "1""2""0". Die Rechenoperation die ich benötige ist "Wert/10". Folglich kommt als Ergebnis nur Kauderwelsch raus.
Meine Frage ist jetzt, ob es einen Weg gibt, diese Ziffern zu einem Integer, bzw. besser noch long int oder float zusammenzufügen? Oder gibt es andere Wege der Bluetooth-Kommunikation, die nicht auf der seriellen Datenübertragung beruhen?
Ich bin für jede Hilfe dankbar.
Der Code beinhaltet nur die, so denke ich zumindest, relevanten Stellen, da alles Andere funktioniert.
Falls der gesamte Code gewünscht ist, liefer ich den gerne nach.
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;
String command = "";
char incomingChar;
long incomingtxt
void setup() {
Serial.begin(115200);
SerialBT.begin("Sensormessung");
void loop() {
if (SerialBT.available()) {
char incomingChar = SerialBT.read();
if (incomingChar != '\n') {
command = String(incomingChar);
}
}
while (command == "9") {
if (SerialBT.available()) {
long incomingtxt = SerialBT.read();
Serial.write(incomingtxt);
}
}
}
Falls ich etwas vergessen haben sollte, einfach fragen
Schon einmal vielen Dank im Voraus.
Das ist leider nicht das Problem.
Ich fürchte aber auch, dass ich mich schlecht ausgedrückt habe.
Die "9" in (command=="9") wird von der App als Steuerbefehl geschickt, sobald das Textfeld für die Festpunktfahrt ausgewählt wird, um dem ESP mitzuteilen, dass der nächste empfangene Wert nicht als direkter Steuerbefehl zu verstehen ist, sondern als Wert, der noch umgerechnet werden muss. Die Umrechnungsformel habe ich noch nicht eingebracht, da die Umwandlung in ein Integer noch fehlt.
Leider habe ich mit atoI(), aus welchen Gründen auch immer, auch keinen Erfolg.
Ich habe zwischenzeitlich auch einmal eine Variante hier aus dem Forum von nickgammon ausprobiert, die mir sehr vielversprechend schien.
Leider habe ich keinen Wert am Seriellen Monitor ausgegeben bekommen. Irgendetwas werde ich da wohl übersehen haben.
Bist du sicher, dass BTSerial so etwas wie "9<-12345>" empfängt?
Falls ja, könnte dein Problem sein, dass du zwischen dem Lesen der '9' und dem '<' nicht wartest. Aber das wäre eine Frage an "BluetoothSerial.h"
PS Ausserdem nebenbei:
String command;
... ist Mist, das zeigt deine Ansicht
Aus "120" wird beispielsweise "1""2""0".
String soll alles vereinfachen, macht es aber in Wirklichkeit komplizierter.
Wenn es geht ist es ok. Wenn es aber damit Probleme gibt, ist man ohne String-Objekte besser dran.
Da command nur 1 Zeichen enthält, ist dein Vergleich per operator==(String, const char*) sicher nichts, was du von Nick Gammon übernommen hast. Solltest du durch Beschäftigung mit dem Unterschied zwischen char, char*, und String (3 völlig unterschiedliche Sachen) in den Griff kriegen.