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-Pin 2, was lt. Datenplatt der Pin D4 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 😲