Serielle Temperatur Daten umwandeln in Celsius !!!!!!

Hallo

brauche dringende Hilfe.

Ich habe einen Temperatursensor MLX90614 Evaluation Board wo ich die Daten seriell reinbekomme
als Fahrenheit

z.b. 95.32F

jetzt möchte ich die auf ein NEXTION Display als String ausgeben.Aber da ich Anfänger bin bekome ich die Daten nicht in Celsius umgewandelt.
Formel dafür ist:
Celsius = (Fahrenheit − 32) / 1,8

Der code der mir Fahrenheit ausgibt ist:

String inString = "";

void loop() {
  
  nexLoop(NULL);

     
  while (Serial3.available() > 0) {
    int Fahrenheit= Serial3.read();
    if (isDigit(Fahrenheit)) {
      inString += (char)Fahrenheit;
    }
      if (Fahrenheit == 'F') {
     t0.setText(inString.c_str()); // Daten auf Display ausgeben
       inString = "";
      }  
   }  
}

ich hatte schon probiert:

String inString = "";

void loop() {
  
  nexLoop(NULL);

     
  while (Serial3.available() > 0) {
    int Fahrenheit = Serial3.read();
   
    if (isDigit(Fahrenheit)) {
      inString += (char)Fahrenheit;
    }
      if (Fahrenheit == 'F') {
      int Celsius = (Fahrenheit -32)/1.8;  
     t0.setText(Celsius.c_str()); // Daten auf Display ausgeben
       inString = "";
      }  
   }  
}

dann kommt aber ein Fehler:
request for member 'c_str' in 'Celsius', which is of non-class type 'int'

Datentypen! Du misst den String erst mal in Float konvertieren. Schau dir an was es an Methoden gibt:

https://www.arduino.cc/en/Reference/StringObject

int Fahrenheit; hat dich verwirrt, denn das ist keine Zahl, sondern der code eines einzelnen Buchstabens aus deinem empfangenen Text.

Wenn du beim Empfang des Buchstabens 'F' die Zeichen davor in String inString gesammelt hast, kannst du aus diesem Text eine Zahl machen und sie dann nach deiner Formel in eine Celsius Zahl umwandeln. Diese Zahl kannst du dann wieder in einen Text wandeln, wenn dein t0 (was immer das sein mag) nicht die Methodeprintunterstützt (, die das für dich erledigt ).

@Serenifly: würde mich wundern, wenn der Text ( also die Buchstaben vor dem 'F' ) eine float Zahl darstellen sollte. Das ist der große Vorteil von Fahrenheit, dass man sich im Alltag nicht mit halben Grad rumquält. (Und normalerweise auch nicht mit negativen Zahlen)

Lass die Strings weg. Du wirfst hier einiges durcheinander. Probier mal (ungetestet)

float tempEinlesen() {
char arr[10];
float far, cel;
int idx = 0;
char c;
  while (Serial3.available()) {
    c = Serial3.read();
    if (c == 'F') {
      arr[idx] = '\0';
      far = atof(arr);
      cel = (far - 32) / 1.8;
      Serial.println(cel);
      return cel;
    }
    else arr[idx++] = c;
  }  
}

Gruß Tommy

Das "F" ist eigentlich nur dazu da das der Code den Abschluss erkennt weil als seriell werden die daten so dargestellt:

80.34F
79.45F
...

OK. also "inString" in eine Zahl umwandeln ...Zahl in Celsius umwandeln und wieder Zahl in String "inString"

mit den Strings umwandeln ist sehr komplex und bin ich nicht so vertraut
Vielleicht habt ihr mal einen Anstoss für mich

Stimmt. Bei Fahrenheit gibt es im Alltagsgebrauch eigentlich keine Kommazahlen.

Ich hatte mich an das Beispiel gehalten:

95.32F

Aber wenn es eine Ganzzahl ist, muss man sich auch erst mal in int konvertieren bevor man damit rechnet. Im Prinzip das gleiche Problem.

mit den Strings umwandeln ist sehr komplex

Nein, ist es nicht. Man braucht nur je nach Datentyp eine bestimmte Konvertierungsfunktion

Hab mal getestet mit Tommy Code, leider geht der nicht
weil ich glaube das der String kein "." haben darf im float
das akzewptiert das Nextion display nicht

float tempEinlesen() {
char arr[10];
float far, cel;
int idx = 0;
char c;
  while (Serial3.available()) {
    c = Serial3.read();
    if (c == 'F') {
      arr[idx] = '\0';
      far = atof(arr);
      cel = (far - 32) / 1.8;
     t0.setText(cel);
      return cel;
    }
    else arr[idx++] = c;
  }   
}

void loop() {
  
nexLoop(NULL);

tempEinlesen();
 
}

Fehlermeldung:
no matching function for call to 'NexText::setText(float&)'

Ich habe die Umrechnung gemacht, mehr nicht. Du hast jetzt die Celsiustemperatur.
Natürlich kan der String fürs Nextion einen Punkt enthalten. Alle ASCII-Zeichen <=0x7f sind erlaubt. Du musst nur das float wieder in eine Zeichenkette umwandeln.
atof hast Du ja schon kennengelernt. Das Gegenstück heißt dtostrf. Über Google kannst Du dessen Verwendung finden.

Ansonsten solltest Du beginnen, Dich mit den Grundlagen zu beschäftigen, damit Du auch begreifst, was Du an Hilfestellungen bekommst.

Gruß Tommy

Hallo,
das Nextion akzeptiert nur Zahl vom Typ INT.
Wenn Du das im Nextion darstellen willst, dann brauchst Du auf dem
Nextion ein Textfeld.

Wenn Du dann Deinen Wert 80.34F in einen String gewandelt hast, dann kannst
Du zum NextionTextFeld senden-

80.34F
oder
80.34
oder
80.3

oder was Du willst.
Lese Dir einmal die NextionReferenz durch, es werden nicht alle ASCII-Zeichen
angenommen. Punkt und Komma sind aber kein Problem.
Beispiel:

byte NexT[3] = {255,255,255};NextionTerminator
float Grad;

char WertFürNextion[15];
dtostrf(Grad, 0, 1, WertFürNextion);

Serial2.print("NextionGradTextfeld.txt=\"");//NextionTextfeld
Serial2.print(WertFürNextion);// DeinWertAlsText
Serial2.write('"');//Terminator
Serial2.write(NexT,3);//NextionTerminator

Gruß und Spaß
Andreas
P.S. keine Ahnung ob das mit der NextionLib funktioniert

Danke an alle.
Werde das mal alles nochmal in Ruhe durchgehen.

Nur zum Verständnis.
Was über seriell rein kommt ist immer ASCII und muss dann umgewandelt werden
Verstehe ich das richtig?
Für mich ist es besser ich habe ein Programm und kann es dann nachvollziehen an Beispielen.da kann man immer experimentieren und man kann besser daraus lernen.

Grüße
Stefan

Hallo,
"Was über seriell rein kommt ist immer ASCII und muss dann umgewandelt werden"
etwas über das reinkommen...

"Für mich ist es besser ich habe ein Programm und kann es dann nachvollziehen"
Du kannst noch nicht einmal die "serielle" nachvollziehen- wie soll das dann mit einem fertigen Sketch gehen?
Wir haben alles geliefert, was DU- brauchst. Das läuft mit diesen Informationen.

Nun wollen wir Bilder und YouTubeVideos über den Erfolg Deiner Arbeit sehen- und die Früchte unserer
Bemühungen einfahren. :wink:
Gruß und Spaß
Andreas

Was über seriell rein kommt ist immer ASCII

Das ist in dieser Verallgemeinerung falsch.

Bei dir im Programm kommen Bytes an.
Und ob du diese Bytes als Buchstaben/Zahlen betrachten darfst, sollte aus der Doku des Senders hervorgehen.