INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
BME 280 float -> string problem
24.02.2020, 15:21 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2020 23:06 von Bitklopfer.)
Beitrag #1
BME 280 float -> string problem
Hallo,

ich verzweifle an einem Problem bei der Umwandlung einer floatvariablen in einen String. Der Code stammt aus dem Netz, ich habe ihn modifiziert.

U.a. werden aus einem BME 280 an einem ESP 8266 die Temperatur, Luftfeuchtigkeit und der Luftdruck asugelesen. Dazu sind vorher ensprechende float Variable definiert worden.
Dieser werden auch korrekt eingelesen, was ich über den Serial Monitor nachvollziehen kann. Dann werden die Werte in Strings umgewandelt, was prinzipiell auch funktioniert, wird auch über den Serial Monitor richtig ausgegeben bis auf einen Wert:

Die Floatvariable hu wird in den humidityString[7] umgewandelt:

dtostrf (hu, 5, 2, humidityString);

und sollte dann mit Serial.println(humidityString); im Monitor erscheinen.

Das klappt bei der Temperatur und beim Luftdruck problemlos, bei der Luftfeuchtigkeit wird stattdessen nur eine einstellige Ganzzahl ausgegeben, während der Originalstring korrekt angezeigt wird:

Das sieht im Monitor so aus (jeweils Parameter: Floatzahl / String):

15:18:36.116 -> BME280 /BH1750 /Bodenfeuchtesensor - test
15:18:46.266 -> Temperatur = 11.92 / 11.9
15:18:46.266 -> Luftfeuchtigkeit = 78.35 / 6
15:18:46.266 -> Luftdruck mBar = 998.06 / 998.06
15:18:46.266 -> Luftdruck mmHg = 748.65 / 749
15:18:46.266 -> Taupunkt = 7.59 / 8
15:18:46.266 -> Bodenfeuchte = 6.06 / 6
15:18:46.266 -> Helligkeit = 0.00 / 0


Was mache ich falsch? Oder habe ich da etwas grundlegendes nicht verstanden?
(Hoffe, ich habe das alles richtig geschildert, bin Anfänger; evt. Fehler bitte ich nachzusehen... :-)

Stephan

------------------------------------------------------------------------------
Hier der Code:
Code:
#include <Wire.h>
#include <ESP8266WiFi.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <BH1750.h>

//#define BMP_SCK 13
//#define BMP_MISO 12
//#define BMP_MOSI 11
//#define BMP_CS 10

//Definitionen für BME 280
float hu, t, p, pin, dp;
char temperatureFString[6];
char dpString[6];
char humidityString[7];
char pressureString[7];
char pressuremmHgString[6];

//Definitionen für Lichtsensor BH1750
float lux;
char luxString[6];

//Definitionen für kapazit. Bodenfeuchtesensor
float bor, bo;
char bohumString[3];


Adafruit_BME280 bme; // I2C
BH1750 lightMeter; //I2C
// replace with your "ESP8266-NodeMCU-12E-BME280" (The first channel you created) channel’s thingspeak API write key,
String apiKey = "Hier steht der API Key";
// replace with your routers SSID
const char* ssid = "Hier steht meine SSID";
// replace with your routers password
const char* password = "Hier das Routerpasswort";

const char* server = "api.thingspeak.com";
WiFiClient client;


/**************************  
*   S E T U P
**************************/
// only runs once on boot
void setup() {
  // Initializing serial port for debugging purposes
  Serial.begin(115200);
  delay(10);
  Wire.begin(D3, D4); // Make sure you have D3 & D4 hooked up to the BME280
  Wire.setClock(100000);
  // Connecting to WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
    // Printing the ESP IP address
  Serial.println(WiFi.localIP());
  Serial.println(F("BME280 /BH1750 /Bodenfeuchtesensor - test"));

  lightMeter.begin();
  if (!bme.begin()) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
}

  /**************************  
*  L O O P
**************************/
void loop() {
    
    //BME 280 auslesen
    hu = bme.readHumidity();
    t = bme.readTemperature();
    
    dp = t-((100.0-hu)/5);
    
    p = bme.readPressure()/100.0F;
    pin = 0.7501*p;

    dtostrf(t, 5, 1, temperatureFString);
    dtostrf (hu, 5, 2, humidityString);
    dtostrf(p, 8, 2, pressureString);
    dtostrf(pin, 5, 0, pressuremmHgString);
    dtostrf(dp, 5, 0, dpString);

    //Bodenfeuchte auslesen
    bor = analogRead(A0);
    bo = ((bor * -1 + 657)/330)*100;
    dtostrf(bo, 3, 0, bohumString);

    //Licht auslesen
    lux = lightMeter.readLightLevel();
    dtostrf(lux, 5, 0, luxString);
    
    delay(10000);

    Serial.print("Temperatur = ");
    Serial.print(t);
    Serial.print(" / ");
    Serial.println(temperatureFString);
    Serial.print("Luftfeuchtigkeit = ");
    Serial.print(hu);
    Serial.print(" / ");
    Serial.println(humidityString);
    Serial.print("Luftdruck mBar = ");
    Serial.print(p);
    Serial.print(" / ");
    Serial.println(pressureString);
    Serial.print("Luftdruck mmHg = ");
    Serial.print(pin);
    Serial.print(" / ");
    Serial.println(pressuremmHgString);
    Serial.print("Taupunkt = ");
    Serial.print(dp);
    Serial.print(" / ");
    Serial.println(dpString);
    Serial.print("Bodenfeuchte = ");
    Serial.print(bo);
    Serial.print(" / ");
    Serial.println(bohumString);
    Serial.print("Helligkeit = ");
    Serial.print(lux);
    Serial.print(" / ");
    Serial.println(luxString);
    
    if (client.connect(server,80))  // "184.106.153.149" or api.thingspeak.com
    {
        String postStr = apiKey;
        postStr +="&field1=";
        postStr += String(temperatureFString);
        postStr +="&field2=";
        postStr += String(humidityString);
        postStr +="&field3=";
        postStr += String(pressuremmHgString);
        postStr +="&field4=";
        postStr +=String(dpString);
        postStr +="&field5=";
        postStr +=String (bohumString);
        postStr +="&field6=";
        postStr +=String (luxString);
        postStr += "\r\n\r\n";
        
        client.print("POST /update HTTP/1.1\n");
        client.print("Host: api.thingspeak.com\n");
        client.print("Connection: close\n");
        client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
        client.print("Content-Type: application/x-www-form-urlencoded\n");
        client.print("Content-Length: ");
        client.print(postStr.length());
        client.print("\n\n");
        client.print(postStr);    
    }
    client.stop();
    //every 5 Min  
    delay(300000);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2020, 15:42 (Dieser Beitrag wurde zuletzt bearbeitet: 24.02.2020 15:58 von Tommy56.)
Beitrag #2
RE: BME 280 float -> string problem
Stelle Deinen Sketch bitte in Codetags.
Wie das geht, steht hier.

Ansonsten kann ich den Fehler nicht nachvollziehen:
Code:
void setup() {
  Serial.begin(115200);
  Serial.println("Start");
  float hu = 78.35;
  Serial.println(hu);
  char s[7];
  dtostrf(hu,5,2,s);
  Serial.println(s);
}
Gib Dir doch mal hu direkt aus.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2020, 16:12
Beitrag #3
RE: BME 280 float -> string problem
(24.02.2020 15:21)drstewa schrieb:  #include <ESP8266WiFi.h>

https://www.arduinoforum.de/arduino-Foru...-und-ESP32

Ist das Unterforum für den Esp.. echt so schwer zu finden?


Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.02.2020, 23:49 (Dieser Beitrag wurde zuletzt bearbeitet: 25.02.2020 01:20 von Bernd666.)
Beitrag #4
RE: BME 280 float -> string problem
Moin drstewa,

blöder Fehler. Schau dir mal die Stringlängen von pressureString an.
In meinem Beispiel kommt der Fehler auch.
Du hast "char pressureString[7];" gesetzt und machst dann das "dtostrf(p, 8, 2, pressureString);".

Code:
void setup()
{
  Serial.begin(115200);
  Serial.println("Start");
  float hu = 78.35;
  float p = 989.55;
  char s1[7];
  char s2[7];            //<--- Fehler! sollte 8 sein
  dtostrf(hu,5,2,s1);
  dtostrf(p, 8, 2, s2);  //<--- Fehler! Oder hier 6 sein
  Serial.print("hu  :");
  Serial.print(hu);
  Serial.print(" / ");
  Serial.println(s1);
  Serial.print("pr  :");
  Serial.print(p);
  Serial.print(" / ");
  Serial.println(s2);
}
void loop()
{
  
}

73 de Bernd
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.02.2020, 20:16
Beitrag #5
RE: BME 280 float -> string problem
Hallo Tommy, hallo Bernd,

ich sehe vielleicht den Wald vor lauter Bäumen nicht:
Es geht um die Umwandlung von hu in humidityString. Die entscheidenden Zeilen sind:
...
float hu;
char humidityString[7];
...
hu = bme.readHumidity();
...
dtostrf (hu, 5, 2, humidityString);
...
Serial.print(hu);
Serial.print(" / ");
Serial.println(humidityString);

Führt zur Ausgabe:
Luftfeuchtigkeit = 41.40 /
....................................
Die Variable hu wird also korrekt ausgelesen und auch ausgegeben. Der String wird nicht ausgegeben, ist also offenbar leer.

Verstehe ich das richtig:
Ich definiere doch einen 7 Zeichen langen String.
Dann wird die floatzahl xx.xx in den humidityString eingelesen und zwar 4 Stellen vor dem Dezimalpunkt und 2 dahinter. Richtig?
Warum geht das hier nicht?
Habe das auch mit anderen Einstellungen versucht: Eigentlich ist hu 5 Stellen lang mit Dezimalpunkt, der String ist dann 5 Stellen lang, bei der Umwandlung 3 (2 vor dem Komma, dann das Komma) und 2 nach dem Komme. Geht auch nicht...

Ratlose Grüße und sorry für meine Anfängerfehler, die ich im Forum gemacht habe und noch mache ...

Stephan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.02.2020, 20:50 (Dieser Beitrag wurde zuletzt bearbeitet: 25.02.2020 20:58 von Tommy56.)
Beitrag #6
RE: BME 280 float -> string problem
Code:
float hu = 45.67;
char humidityString[7];
dtostrf(hu,5,2,humidityString);
Funktioniert problemlos, sowohl für UNO, als auch für ESP8266.
Sorry, aber ich kann Dein Problem nicht nachvollziehen.

5 Zeichen incl. '.' + '\0' = 6 Zeichen. 1 Zeichen Reserve, falls doch mal 100 %RH raus kommen sollte, ist ok.
Die 5 ist die Gesamtlänge, auf die aufgefüllt wird. Wenn hu größer ist, wird auch das größere ausgegeben.
Prüfe mal dp, ob das zu groß wird und überschreibt. Evtl. mal dpString einfach zum Testen auf [10] setzen.
Ansonsten die Füllung aller anderen Zeichenketten auskommentieren und schrittweise wieder einkommntieren.

Auf dem ESP kannst Du auch mit sprintf arbeiten, was auf den AVR für float nicht geht.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.02.2020, 22:26 (Dieser Beitrag wurde zuletzt bearbeitet: 25.02.2020 22:35 von Bernd666.)
Beitrag #7
RE: BME 280 float -> string problem
Moin!

Ok, ich mach es mal deutlicher. Habe dafür den Code aus dem Originalsketch entnommen.

Code:
void setup()
{
  Serial.begin(115200);
  Serial.println("Start");
  //Definitionen für BME 280
  float hu, t, p, pin, dp;
  char temperatureFString[6];
  char dpString[6];
  char humidityString[7];
  char pressureString[7];
  char pressuremmHgString[6];
  
  hu = 78.35;  // Luftfeuchte
  p = 989.55;  // Luftdruck

  dtostrf (hu, 5, 2, humidityString);
  dtostrf(p,6, 2, pressureString);   // <------ Hier ist der Fehler. Im Original stand da 8 statt 6!!

  Serial.print("Luftfeuchtigkeit = ");
  Serial.print(hu);
  Serial.print(" / ");
  Serial.println(humidityString);
  Serial.print("Luftdruck mBar = ");
  Serial.print(p);
  Serial.print(" / ");
  Serial.println(pressureString);
  
}
void loop()
{
  
}

Nun die Ausgaben:
Code:
Mit dem Fehler:

22:18:25.267 -> Luftfeuchtigkeit = 78.35 / 5
22:18:25.301 -> Luftdruck mBar = 989.55 /   989.55

Fehler berichtigt:

22:20:21.116 -> Luftfeuchtigkeit = 78.35 / 78.35
22:20:21.116 -> Luftdruck mBar = 989.55 / 989.55

73 de Bernd
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.02.2020, 22:28 (Dieser Beitrag wurde zuletzt bearbeitet: 25.02.2020 22:32 von Tommy56.)
Beitrag #8
RE: BME 280 float -> string problem
Wenn Du dann noch schreiben würdest, wo Du den Fehler siehst, wäre es sinnvoller.
Also der Druck war das Problem. Deshalb hatte ich ja geschrieben: Alle Umwandlungen auskommentieren und schrittweise wieder einkommentieren.
Denn die Feuchte selbst konnte es nicht gewesen sein.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Esp32 FIFO-Problem miq19 7 586 22.08.2020 14:33
Letzter Beitrag: miq19
  float -> char Umwandlung Problem ESP8266 und BME 280 drstewa 2 1.034 24.02.2020 23:08
Letzter Beitrag: Bitklopfer
  MQTT / RSL problem am Wemos D1 Mini myreal84 7 1.354 19.01.2020 13:42
Letzter Beitrag: Fips
  Wie weise ich einen String aus einer Datei zu? Pfeilebastler 4 884 30.12.2019 19:57
Letzter Beitrag: Fips
  esp32 Float in EEPROM schreiben lesen wwilhelm 8 2.435 02.12.2019 11:13
Letzter Beitrag: wwilhelm
Question ESP32 Webserver Problem opitzh 31 4.641 28.11.2019 16:27
Letzter Beitrag: Tommy56
  Flash-Problem ESP32 Jonny 3 1.675 25.09.2019 18:56
Letzter Beitrag: Tommy56
  Wemos D1 mini - MQTT Problem PetA90 6 2.301 13.07.2019 21:40
Letzter Beitrag: PetA90
  Interrupt Problem Gandalf 6 2.009 12.05.2019 14:59
Letzter Beitrag: Tommy56
  Problem mit Login bei ESP8266 mit ESP-Easy Koenig 2 1.503 05.05.2019 20:11
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste