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