Unterschied zwischen den Daten on DS18B20 und BME280?

Hallo zusamen,

gibt es einen Unterschied zwischen den Daten on DS18B20 und BME280?

Ich habe 3 Stück ESP8266-01 mit BME280 und den Abfragen von Temp und Humi und dem Veröffentlichen der Wert zu einem MQTT Broker. Die Werte werden übergeben und mit MQTTfx auch angezeigt.

Bei weiteren ESP8266-01 mit DS10B20 und der Abfrage von Temp und dem Veröffentlichen der Wert zu einem MQTT Broker. Die Werte werden übergeben und mit MQTTfx auch angezeigt.

Soweit so gut.

Wenn ich jetzt in openHab ein Thing mit den Channels erstelle, dann werden die Werte bei den BME280 richtig angezeigt.

Bei den DS1820 wird nur „NULL“ angezeigt.

Hier der Skretch mit dem BME280 (funktioniert)

// Achtung!!!!!
// um die openHAB Funktion zu nutzen, muss unter
// client.publish("esp8266-xxx/temperatur", temperatur_str);
// eine eindeutig ID vergeben werden. Hier "esp8266-xxx" xxx = IP-Adresse letze drei Ziffern

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <Arduino.h>
#include <Wire.h> 
#include <Adafruit_Sensor.h>  
#include <Adafruit_BME280.h>  
#include <PubSubClient.h>
   
Adafruit_BME280 bme; // I2C

const char* ssid = "xxx";
const char* pass =  "xxx";
const char* mqtt_server = "192.168.178.xx";
const char* user = "yyy";
const char* passwd = "yyy";

float temperatur;
float humidity;
char temperatur_str[8];
char humidity_str[8];
char text[30];

unsigned long altzeit;   // speicher für millis()
unsigned long lastRequest;

ESP8266WebServer server(80);
WiFiClient espclient;
PubSubClient client(espclient);
 
void setup() {
 
  Serial.begin(115200);
  connectToWiFi(); 

  client.setServer(mqtt_server, 1883);
  
  Wire.begin(0, 2);

//  bool status;
//  status = bme.begin();  
  if (!bme.begin(0x76)) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }

  server.on("/", handleRootPath);
  server.begin();
  
}
 
void loop() 
{
  server.handleClient();
  restartESP();
  getBMETempHumi();

  if (!client.connected()) {
    reconnect();
  }
  
  client.loop();
  
}

void getBMETempHumi()
{
  if (millis() - altzeit > 30000)    // sind 30sec vergangen ?
  {
    altzeit = millis();

    temperatur = bme.readTemperature();
    humidity = bme.readHumidity();
  
    Serial.print(F("Temperatur = ")); Serial.print(temperatur); Serial.println(" °C");
    Serial.print(F("Humidity   = ")); Serial.print(humidity); Serial.println(" %");

    dtostrf(temperatur, 6, 2, temperatur_str);
    client.publish("esp8266-160/temp", temperatur_str); 

    dtostrf(humidity, 6, 2, humidity_str);
    client.publish("esp8266-160/humi", humidity_str);
      
  }
}

void restartESP()
{
  const unsigned long zeit = 120000;
  static unsigned long intervall = zeit ;   
                                         
  if (millis() - lastRequest > intervall)
  {
    intervall += zeit;                      // "+=" endspricht a = a+b
    Serial.print("letzter Request "); Serial.println(millis() - lastRequest);
    Serial.println("Es sind über 2 Minuten vergangen ");
    if (intervall > 2 * zeit)               // nach 2*2 = 4 Min. 
    {
      Serial.println("Restart ESP");
      ESP.restart(); //ESP reset
    }
  }
}

void connectToWiFi() { 
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, pass);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println(WiFi.localIP());
  Serial.println("WiFi connected");
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");

    if (client.connect("esp8266-160", user, passwd)) {
      Serial.println("connected");
      
      client.subscribe("esp8266-160/temp");
      client.subscribe("esp8266-160/humi");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");

      delay(5000);
    }
  }
}

void handleRootPath(){
  Serial.println("Request temperatur...");
  temperatur = (bme.readTemperature()); 
  humidity = (bme.readHumidity());  

  dtostrf(temperatur, 6, 2, temperatur_str); // temperatur = floatveriable , 8 = gesamte Char mit ":" , 2 = Nachkommastellen , erzeuge Char-Variable
  dtostrf(humidity, 6, 2, humidity_str);
  strcat(text, temperatur_str);
  strcat(text, ":");
  strcat(text, humidity_str);
  
  server.send(200, "text/plain", String(text));
  text[0] = '\0';
}      

Hier der Code vom DS18B20 (funktioniert nicht)

// Achtung!!!!!
// um die openHAB Funktion zu nutzen, muss unter
// client.publish("esp8266-102/temperatur", temperatur_str);
// eine eindeutig ID vergeben werden. Hier "esp8266-xxx" xxx = IP-Adresse letze drei Ziffern

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <Arduino.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <PubSubClient.h>

const char* ssid = "xxx";
const char* pass =  "xxx";
const char* mqtt_server = "192.168.178.xx";
const char* user = "yyy";
const char* passwd = "yyy";

float temperatur;
char temperatur_str[8];
unsigned long altzeit;   // speicher für millis()
unsigned long  startzeit;   // Timeout 
int x = 0;

#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

ESP8266WebServer server(80);
WiFiClient espclient;
PubSubClient client(espclient);

void setup() {

  Serial.begin(115200);
  connectToWiFi(); 

  sensors.begin();

  client.setServer(mqtt_server, 1883);

  server.on("/", handleRootPath);
  server.begin();
}

void loop() {
  
  server.handleClient();  
  restartESP();
  getOneWireTemperature();

  if (!client.connected()) {
    reconnect();
  }
  
  client.loop();
  
}

void getOneWireTemperature()
{
  if (millis() - altzeit > 30000) {  // sind 30sec vergangen ?
    altzeit = millis();
    temperatur = sensors.getTempCByIndex(0);
    Serial.print("Temperatur ");Serial.println(temperatur);
   
    sensors.requestTemperatures();

    dtostrf(temperatur, 6, 2, temperatur_str);
    Serial.print("Temperatur ");Serial.println(temperatur_str);
    client.publish("esp8266-102/temp", temperatur_str);    
  }  
}

void restartESP()
{
   
  if (x == 1) {
    startzeit = millis();
     x = 0;
  }

  if (millis() - startzeit > 120000) {
    startzeit = millis();
    Serial.print("Startzeit ");Serial.println(millis() - startzeit); 
    Serial.println("Es sind über 2 Minuten vergangen ");
    Serial.println("Restart ESP");
    ESP.restart(); //ESP reset
  }
}

void connectToWiFi() { 
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, pass);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println(WiFi.localIP());
  Serial.println("WiFi connected");
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");

    if (client.connect("esp8266-102", user, passwd)) {
      Serial.println("connected");
 
      client.subscribe("esp8266-102/temp");
//      delay(1000);
      
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");

      delay(5000);
    }
  }
}

int handleRootPath() {

  Serial.print("Requesting temperatures...");
  Serial.println("DONE");
  server.send(200, "text/plain", String(temperatur));
  x = 1;
  return x;

}

Gibt es einen Unterschied oder habe ich einen Wurm drin?

Vielen Dank im Voraus
Horst

Warum meinst Du, ein restartESP(); im Loop wäre sinnvoll?
Außerdem kommt er dadurch nie bis zu getOneWireTemperature();, weil er vorher neu startet.

Gruß Tommy

Werden denn die Daten im seriellen Monitor richtig angezeigt ?
Wenn ja, liegt es vermutlich nicht am Sketch sonder in der weiteren Verarbeitung, die ich nicht kenne.

Der Neustart wird erst nach Ablauf von 120 Sekunden durchgeführt. Somit wird getOneWireTemperature(); erreicht.

Der Sinn bleibt dennoch fraglich.

Wo steht das? Bei mir ging das wesentlich schneller.

Gruß Tommy

In der Funktion. Oder hab ich ein Denkfehler?

Ok, sorry. Ich hatte das mit der Standartfunktion ESP.restart() verwechselt.
Fraglich bleibt der Sinn aber trotzdem, wie Du bereits angemerkt hast.

Gruß Tommy

Da sollte der TO mal erklären, warum der ESP alle 2 Minuten resetten soll.

Und die „Startzeit“ wird immer wieder zurück gesetzt, da x im normalen Fall auf 1 zurück fällt. Also nur ein Reset wenn etwas Hängen bleibt.

Ich denke auch, der Grund ist, das etwas in openHAB anders ist. Vor allem, da du die Werte in MQTT.fx siehst. Unterscheiden sich denn die Werte in MQTT.fx?

openHAB braucht auch etwas Zeit zum handeln neuer Items.
Ein Neustart von openHAB wurde durchgeführt?

Wie sehen denn die zwei Konfigurationen aus? Aber ich denke da bekommst du schneller Hilfe in einem openHAB Forum.
Dieses hat mir oft sehr gut geholfen.

Hallo,

mal kurz eine Stunde spazieren und hier geht die Post ab. Super.

Ihr habe ja selbst herausgefunden was es sind mit dem Reset auf sich hat.
Der Reset ist nur dazu da, wenn sich über 2 Minuten sich nichts tut. Sicherheitshalber.

Die Frage ist, warum verhalten sich die zwei Sketch unterschiedlich.

Zu den Fragen von Plumps:
a) Unterscheiden sich denn die Werte in MQTT.fx?

Nein.

b) openHAB braucht auch etwas Zeit zum handeln neuer Items.

Mehr als 2 Min. gewartet. (sollte sich nach 30 Sek. ändern)

c) Ein Neustart von openHAB wurde durchgeführt?

Ja

d) Wie sehen denn die zwei Konfigurationen aus?

Ich habe im openHab jeweils die Things mit den Channel und Links gleich eingetragen.
Was mir jedoch aufgefallen ist, wenn ich im Channel den Wert als Number abfrage, dann bekomme n "NULL" als Antwort und wenn ich als String abfrage, dann wird ein Wert angezeigt.

Mit deinem Vorschlag, im openHab Forum Hilfe zu suchen, hab ich natürlich schon vorher gemacht. Leider ohne Erfolg.

Gruß
Horst

Und warum beantwortest du nicht alle Fragen ?

Hallo HotSytems,

Sorry.

Geht es um die Frage von Dir?

a) Da sollte der TO mal erklären, warum der ESP alle 2 Minuten resetten soll.

Weil es immer wieder Aussetzer bei der Abfrage der Werte über den WEB-Server gibt.

b) Werden denn die Daten im seriellen Monitor richtig angezeigt ?

Ja

Gruß
Horst

Ok, dann trifft meine Aussage in Post #3 auch zu.
Hat mit dem Sketch weniger zu tun, eher mit den nachgeschalteten Diensten.

Ergänzung:
Natürlich nur, wenn das Format und Inhalt der Variablen übereinstimmen.

Um welche Temperaturen handelt es sich? Wenn es um Umgebungstemperaturen geht, sind 30 Sekunden völlig überzogen. Da genügt ein Messabstand von 5 Minuten.

Gruß Tommy

Hallo,

Da genügt ein Messabstand von 5 Minuten.

Klar, aber ich habe keine Lust jedes mal 5 Min. zu warten bis ich sehe, dass es nicht funktioniert.

Horst

Jetzt habe ich doch noch was gesehen.

Bei der Frage von Plumps:
a) Unterscheiden sich denn die Werte in MQTT.fx?

Es gibt einen Unterschied:
Bei den Werten von BME280 wird die Zahl so angezeigt

"21.45" (ohne Anführungszeichen)

Bei dem Wert vom DS18B20 so

" 21.45"

Also mit einem Leerzeichen vor der ersten Ziffer.

Könnte dass das Problem sein?
Wie kann ich dass verhindern?

Gruß
Horst

In openHAB (welche Version eigentlich) kann man auch Strings in Zahlen wandeln. In openHAB 3 sogar relativ einfach über Metadaten. Dies ist dann aber nur optisch.
Auch eine Konvertierung direkt am Thing ist möglich. Und auch bei der Übergabe zum Item.
Ist dies aber überhaupt nötig? Als Anzeige reichen Strings. Willst du damit rechnen?

Gib mir mal bitte den Link zu deinem Thema im openHAB Forum.

Ob es tatsächlich daran liegt, kannst du doch leicht testen.
Verwende einen eigenen temporären Wert, den du in die Varible einfügst.

Ganz sicher sogar.

Vermutlich in dieser Zeile. Mit dtostrf kenn ich mich nicht aus. Müsstest du nachschlagen.

Du kannst dir den Inhalt von Variablen auf dem SerialMonitor ausgeben lassen. So kannst du den auf die Schliche kommen, wo das Leerzeichen entsteht.

Wenn das tatsächlich so ist, werde ich meine Aussage in #13 revidieren.