@dieterh … Guten Abend … es hat perfekt funktioniert . Echt klasse und lieben Dank für Deine klasse ergänzende Beschreibung. In diesem kleinen Projekt hab ich echt viel gelernt. So das man jetzt alle Möglichkeiten hat mit RedMatic/NideRed über MQTT sich alles anzeigen lassen kann was das Smarte Herz begehrt.
Lieben Dank bis bald Dirk
Probleme mit OneWire DS18B20
-
So also erstmal vorab. Ich habe mein Setup mit einem Arduino UNO getestet und da klappt alles super, also an der Verkabelung oder dem Sensor kann es nicht liegen.
Was ich versuche:
Ich versuche derzeit einen DS18B20 Sensor an einem ESP - genau dem d1 mini - zu betreiben. Das Problem ist, dass ich dafür OneWire benötige.Was ist das Problem:
Also das Problem an dem ganzen ist, dass ich nicht genau mit der Bib umgehen kann und daher einen Code aus dem Internet besorgt habe und diesen Anpassen wollte.
Hat auf dem Arduino auch super geklappt wie bereits beschrieben. Jedoch wenn ich das Setup und Code an meinem d1 mini teste erhalte ich beim Kompilieren keinen Fehler, aber mein Programm gibt aus, dass an dem angegeben Pin kein OneWire Gerät hängt.Worauf habe ich es eingegrenzt
Nun da eigentlich alles funktioniert glaube ich, dass die Bibliothek die Pin Bezeichnung nur in einer bestimmten Angabe nimmt.
Beispiel: Bei uno war D2 als Angabe eine 2
Was ich dachte: Ok beim mini geb ich ja d1 als 5 an. Dann mache ich das doch einfach hochladen und zack geil. Aber ne darüber findet die Bibliothek keine Antwort.Und ich kenne mich leider nicht gut genug mit der Adressierung der Pins aus, um meinen Fehler zu beheben. Ich hoffe ihr könnt mir dabei helfen…
Hier noch der Code mit dem ich teste
#include <OneWire.h> #include <DallasTemperature.h> //SETTINGS #define ONE_WIRE_BUS 2 //DATA PORT DALLAS 18B50, DIGITAL 2 int res = 11; //TEMPERATURE RESOLUTION //END SETTINGS OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DeviceAddress tempDeviceAddress; unsigned long lastTempRequest = 0; int delayInMillis = 0; float temperature = 0.0; //END DALLAS //Filter float temp = 0; void setup() { Serial.begin(115200); Serial.println(F("DALLA 18B20")); Serial.print(F("DALLAS Library Version: ")); Serial.println(DALLASTEMPLIBVERSION); Serial.println(""); sensors.begin(); sensors.setResolution(tempDeviceAddress, res); sensors.setWaitForConversion(false); sensors.requestTemperatures(); delayInMillis = 750 / (1 << (12 - res)); lastTempRequest = millis(); if (!sensors.getAddress(tempDeviceAddress, 0)) { Serial.println(F("Error connecting to Sensor.")); } else { Serial.print(F("Sensor found at address :")); printAddress(tempDeviceAddress); Serial.println(""); Serial.print(F("Test read temperature : ")); temperature = sensors.getTempCByIndex(0); Serial.print(temperature); Serial.println(F(" degree Celsius")); sensors.setResolution(tempDeviceAddress, res); sensors.requestTemperatures(); Serial.println(""); } } void loop() { if (millis() - lastTempRequest >= delayInMillis) { temp = sensors.getTempCByIndex(0); sensors.setResolution(tempDeviceAddress, res); sensors.requestTemperatures(); delayInMillis = 750 / (1 << (12 - res)); lastTempRequest = millis(); //Filter temperature = temperature - 0.035 * (temperature - temp) ; //Output Serial.print(temperature); Serial.println (F(" degree Celsius")); } } void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } }
-
Hallo Gauweiler42!
#define ONE_WIRE_BUS 2 //DATA PORT DALLAS 18B50, DIGITAL 2
Du definierst den
ONE_WIRE_BUS
mit dem GPIO-Pin2
, was lt. Datenplatt der PinD4
an deinem D1 Mini ist. Ich habe gerade deinen Code 1:1 kopiert und getestet, da ich auch noch einen DS18B20 rumfliegen habe. Da ich keinen Pull-Down etc. verwende, pendelt sich der Wert nach ein paar Durchgängen ein und bleibt stabil. Meine ausgabe im Monitor sieht so aus:21.62 degree Celsius 21.62 degree Celsius 21.62 degree Celsius 21.62 degree Celsius 21.62 degree Celsius 21.62 degree Celsius
Dein Code funktioniert also, du hast scheinbar nur den falschen Pin verwendet. Nimm den Pin
D4
und dein Code funktioniert.Gruß Dieter
-
Noch ein kleiner nachtrag, dein Code lässt sich übrigens auf ein sehr großes mimimum kürzen:
#include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 2 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); void setup(){ Serial.begin(115200); sensors.begin(); } void loop(){ sensors.requestTemperatures(); Serial.print(sensors.getTempCByIndex(0)); Serial.println(" °C"); delay(1000); }
Ausgabe:
21.75 °C 21.75 °C 21.75 °C 21.75 °C
-
Hey danke für die schnelle Antwort. Das sieht alles gut aus, aber dennoch erhalte ich mit genau deinem Code und der richtigen Verkabelung an D4 immer nur -104.0C ausgegeben und ich glaube mein Wasser hat bisschen mehr Temperatur
Hab ich da eine falsche Bib installiert eigentlich ja nicht auf dem Arduino klappt ja alles. Lötstellen sind auch überprüft und neu gemacht.
Hast du noch ne Ahnung woran das liegen könnte? 5V liegen an hab gemessen, aber am gelben Kabel liegt keine Spannung an sollte da eigentlich Spannung drauf sein?
-
Ok sorry hat sich erledigt. Ich hatte die 5V nicht übers board bezogen, sondern über extern war scheinbar ein Problem…
-
Das klingt aber komisch… Löse DQ mal von D4 und lade dein Programm auf den D1 Mini und lass ihn starten. Wenn er gebootet hat legst du DQ kurz auf High durch anlegen an 5V / 3V - erst danach verbindest du DQ mit D4. Was passiert dann?
-
Sorry hab alles schon verbaut und unter Wasser angebracht