ESP 8266I mit DS18B20 bekommt die Temperatur nicht gelesen

Hallo ich habe 2 Sensoren angeschlossen und den 4,7kohm Wiederstand .
Beim auslesen der Temperatur bekomme ich immer nur den fehlerwert -127°
was mache ich falsch ?

#include <ESP8266WiFi.h>                               
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

// WiFi Zugangsdaten
const char* ssid = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
const char* password = "xxxxxxxxxxxxxxxxxx";

// Telegram Bot Token und Chat ID
const char* botToken = "xxxxxxxxxxxxxxxx";
const char* chatId = "xxxxxxxxxx";

#define ONE_WIRE_BUS_1 4 //alter text #define ONE_WIRE_BUS_1 4
#define ONE_WIRE_BUS_2 4 //alter text #define ONE_WIRE_BUS_2 4
#define TEMPERATURE_PRECISION 9

const unsigned long BOT_MTBS = 1000; // Durchschnittliche Zeit zwischen Scan-Nachrichten
unsigned long bot_lasttime; // Zeitpunkt der letzten Nachrichtenüberprüfung

X509List cert(TELEGRAM_CERTIFICATE_ROOT);
WiFiClientSecure secured_client;
UniversalTelegramBot bot(botToken, secured_client);

DeviceAddress sensor_1 = {0x28, 0xC1, 0xCF, 0x43, 0xD4, 0xE1, 0x3C, 0xB8};
DeviceAddress sensor_2 = {0x28, 0x47, 0x39, 0x46, 0xD4, 0xDE, 0x36, 0x10};

OneWire oneWire_in(ONE_WIRE_BUS_1); //_1
OneWire oneWire_out(ONE_WIRE_BUS_2); //_1

DallasTemperature sensor_inhouse(&oneWire_in);
DallasTemperature sensor_outhouse(&oneWire_out);

DeviceAddress insideThermometer, outsideThermometer;

unsigned long previousMillis = 0;
const unsigned long interval = 1 * 60 * 60 * 1000; // Alle Stunde in Millisekunden

const uint32_t verzHell = 6000; // sollte sicher 1-2 Minuten sein
const uint32_t verzDunkel = 6000;
const uint32_t maxlaufzeit = 40000; // entsp. anpassen
const int hell = 1023;  
const int dunkel = 1013; 

// Pin´s 
const byte btnAuf = D5;    // Taster
const byte btnAb = D6;
const byte esOben = D2;    // Endschalter
const byte esUnten = D1;
const byte motorAuf = D8;   // Motoransteuerung
const byte motorAb = D7;
// Hilfsmerker 
bool manAuf;
bool manAb;
bool autoAuf; //auto Türe öffnen
bool autoAb;  //auto Türe schließen
bool oben;
bool unten;
const byte ldrpin = A0; // analoger LDR Pin
int ldr;

void handleNewMessages(int numNewMessages);

float temperatur;

void setup() {
  Serial.begin(115200);
   Serial.println("Dallas Temperature Control Library Demo - TwoPin_DS18B20");

    sensor_inhouse.begin();
    sensor_outhouse.begin();

      configTime(0, 0, "pool.ntp.org"); // UTC-Zeit über NTP abrufen
    secured_client.setTrustAnchors(&cert); // Root-Zertifikat für api.telegram.org hinzufügen

    // Verbindung zum WLAN herstellen
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("Verbindung zum WLAN wird hergestellt...");
    }
    Serial.println("Verbunden mit dem WLAN!");
    
  pinMode(btnAuf, INPUT_PULLUP);
  pinMode(btnAb, INPUT_PULLUP);
  pinMode(esOben, INPUT_PULLUP);
  pinMode(esUnten, INPUT_PULLUP);
  pinMode(motorAuf, OUTPUT);
  pinMode(motorAb, OUTPUT);
}

void loop() {

    if (millis() - bot_lasttime > BOT_MTBS) {
        int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
        while (numNewMessages) {
            handleNewMessages(numNewMessages);
            numNewMessages = bot.getUpdates(bot.last_message_received + 1);
        }

        bot_lasttime = millis();
    }
    unsigned long currentMillis = millis();

    if (currentMillis - previousMillis >= interval) {
        previousMillis = currentMillis;

         sensor_inhouse.requestTemperatures();
        float tempC_inhouse= sensor_inhouse.getTempCByIndex(0);
        String answer_inhouse= "Die aktuelle Temperatur im Innenbereich beträgt: " + String(tempC_inhouse) + " Grad Celsius";
        bot.sendMessage(chatId, answer_inhouse,"");

        sensor_outhouse.requestTemperatures();
        float tempC_outhouse= sensor_outhouse.getTempCByIndex(0);
        String answer_outhouse= "Die aktuelle Temperatur im Außenbereich beträgt: " + String(tempC_outhouse) + " Grad Celsius";
        bot.sendMessage(chatId, answer_outhouse,"");

        Serial.print("Requesting temperatures...");
        sensor_inhouse.requestTemperatures();
        sensor_outhouse.requestTemperatures();
        Serial.println(" done");

        Serial.print("Inhouse: ");
        Serial.println(sensor_inhouse.getTempCByIndex(0));
        Serial.print("Outhouse: ");
        Serial.println(sensor_outhouse.getTempCByIndex(0));}
        
  ldr = analogRead(A0);   // LDR einlesen
  autoAuf = LDRdunkelhell();
  autoAb = LDRhelldunkel();
  manAuf = !digitalRead(btnAuf);
  manAb = !digitalRead(btnAb);
  oben = !digitalRead(esOben);
  unten = !digitalRead(esUnten);

  Klappe();   // Klappe steuern
}

void handleNewMessages(int numNewMessages) {
    for (int i = 0; i < numNewMessages; i++) {
        telegramMessage &msg = bot.messages[i];

        if (msg.text == "/temperatur") {
            sensor_inhouse.requestTemperatures();
            float tempC_inhouse= sensor_inhouse.getTempCByIndex(0);

            String answer_inhouse= "Die aktuelle Temperatur im Innenbereich beträgt: " + String(tempC_inhouse) + " Grad Celsius";
            bot.sendMessage(msg.chat_id, answer_inhouse,"");

            sensor_outhouse.requestTemperatures();
            float tempC_outhouse= sensor_outhouse.getTempCByIndex(0);

            String answer_outhouse= "Die aktuelle Temperatur im Außenbereich beträgt: " + String(tempC_outhouse) + " Grad Celsius";
            bot.sendMessage(msg.chat_id, answer_outhouse,"");
        }
    }
}
void Klappe() {
  static uint32_t start;
  static uint32_t auszeit;
  bool aus=true;// Motor ist aus

  if ((manAuf || autoAuf ) && aus) { // Klappe auf
    Serial.println("Klappe auf fahren");
    digitalWrite(motorAuf, HIGH);
    digitalWrite(motorAb, LOW);
    start = millis();
  }

  else if ((manAb || autoAb) && aus) { // Klappe zu
    Serial.println("Klappe zu fahren");
    digitalWrite(motorAuf, LOW);
    digitalWrite(motorAb, HIGH);
    start = millis();
  }

  else if (manAb) digitalWrite(motorAuf, LOW); // manuell wechseln

  else if (manAuf) digitalWrite(motorAb, LOW);


if (millis() - start > maxlaufzeit || oben) { // oben stop
    digitalWrite(motorAuf, LOW);
}

if (millis() - start > maxlaufzeit || unten) { // unten stop
    digitalWrite(motorAb, LOW);
}

if (digitalRead(motorAuf) == HIGH || digitalRead(motorAb) == HIGH) {
    auszeit = millis();
}

if (millis() - auszeit > 100) aus = true;
else aus = false;

}

bool LDRhelldunkel() {
static uint32_t vorhin;
static bool merker; 
bool ret; 
ret = false;

if ( ldr < dunkel) {
if (millis() - vorhin >= verzDunkel && !merker) {
Serial.print("es ist dunkel Wert "); Serial.println(ldr);
ret = true;
merker = true;

// Nachricht an Telegram senden
            bot.sendMessage(chatId, "Guten Nacht wir gehen Schlafen!", "");
}
}
else {
vorhin = millis();
merker = false;
}
return (ret);
}

bool LDRdunkelhell() {
static uint32_t vorhin;
static bool merker; 
bool ret; 
ret = false;

if ( ldr > hell) {
if (millis() - vorhin >= verzHell && !merker) {
Serial.print("es ist hell Wert "); Serial.println(ldr);
ret = true;
merker = true;

// Nachricht an Telegram senden
            bot.sendMessage(chatId, "Guten Morgen wir sind Draussen!", "");
            
}
}
else {
vorhin = millis();
merker = false;
}
return (ret);
}

Vermutlich liegt dein Problem in den unnötig und hier fehlerhaft aufgebauten 2 OneWire-Bussen an einem Pin (GPIO4).
Du kannst zwar deine beiden Sensoren an einem Pin betreiben, darfst aber keine 2 Busse am selben Pin erstellen.
Sieh dir mal entsprechende Beispiele bei Fips an.
Auch sehe ich als Fehler, dass du den Pin GPIO4 und D2 doppelt verwendest.
Wenn du nur die GPIO Kennzeichnung verwendest, passieren solche Fehler eher nicht und diese Kennzeichnung ist auch eindeutig. Benennung mit Dx ist Boardabhängig und damit nicht eindeutig.

#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

// WiFi Zugangsdaten
const char *ssid = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
const char *password = "xxxxxxxxxxxxxxxxxx";

// Telegram Bot Token und Chat ID
const char *botToken = "xxxxxxxxxxxxxxxx";
const char *chatId = "xxxxxxxxxx";

#define ONE_WIRE_BUS D4 //alter text #define ONE_WIRE_BUS_1 4

#define TEMPERATURE_PRECISION 9

const unsigned long BOT_MTBS = 1000; // Durchschnittliche Zeit zwischen Scan-Nachrichten
unsigned long bot_lasttime; // Zeitpunkt der letzten Nachrichtenüberprüfung

X509List cert(TELEGRAM_CERTIFICATE_ROOT);
WiFiClientSecure secured_client;
UniversalTelegramBot bot(botToken, secured_client);

DeviceAddress sensor_1 = {0x28, 0xC1, 0xCF, 0x43, 0xD4, 0xE1, 0x3C, 0xB8};
DeviceAddress sensor_2 = {0x28, 0x47, 0x39, 0x46, 0xD4, 0xDE, 0x36, 0x10};

OneWire oneWire(ONE_WIRE_BUS); //_1


DallasTemperature sensors(&oneWire);

DeviceAddress insideThermometer, outsideThermometer;

unsigned long previousMillis = 0;
const unsigned long interval = 1 * 60 * 60 * 1000; // Alle Stunde in Millisekunden

const uint32_t verzHell = 6000; // sollte sicher 1-2 Minuten sein
const uint32_t verzDunkel = 6000;
const uint32_t maxlaufzeit = 40000; // entsp. anpassen
const int hell = 1023;
const int dunkel = 1013;

// Pin´s
const byte btnAuf = D5;    // Taster
const byte btnAb = D6;
const byte esOben = D2;    // Endschalter
const byte esUnten = D1;
const byte motorAuf = D8;   // Motoransteuerung
const byte motorAb = D7;
// Hilfsmerker
bool manAuf;
bool manAb;
bool autoAuf; //auto Türe öffnen
bool autoAb;  //auto Türe schließen
bool oben;
bool unten;
const byte ldrpin = A0; // analoger LDR Pin
int ldr;

void handleNewMessages(int numNewMessages);

float temperatur;

void setup()
{
  Serial.begin(115200);
  Serial.println("Dallas Temperature Control Library Demo - TwoPin_DS18B20");
  sensors.begin();
  configTime(0, 0, "pool.ntp.org"); // UTC-Zeit über NTP abrufen
  secured_client.setTrustAnchors(&cert); // Root-Zertifikat für api.telegram.org hinzufügen
  // Verbindung zum WLAN herstellen
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(1000);
    Serial.println("Verbindung zum WLAN wird hergestellt...");
  }

  Serial.println("Verbunden mit dem WLAN!");
  pinMode(btnAuf, INPUT_PULLUP);
  pinMode(btnAb, INPUT_PULLUP);
  pinMode(esOben, INPUT_PULLUP);
  pinMode(esUnten, INPUT_PULLUP);
  pinMode(motorAuf, OUTPUT);
  pinMode(motorAb, OUTPUT);
}

void loop()
{
  if (millis() - bot_lasttime > BOT_MTBS)
  {
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);

    while (numNewMessages)
    {
      handleNewMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }

    bot_lasttime = millis();
  }

  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval)
  {
    previousMillis = currentMillis;
    float tempC_inhouse = sensors.getTempCByIndex(0);
    String answer_inhouse = "Die aktuelle Temperatur im Innenbereich beträgt: " + String(tempC_inhouse) + " Grad Celsius";
    bot.sendMessage(chatId, answer_inhouse, "");
    sensor_outhouse.requestTemperatures();
    float tempC_outhouse = sensors.getTempCByIndex(1);
    String answer_outhouse = "Die aktuelle Temperatur im Außenbereich beträgt: " + String(tempC_outhouse) + " Grad Celsius";
    bot.sendMessage(chatId, answer_outhouse, "");
    Serial.print("Requesting temperatures...");
    sensors.requestTemperatures();
    Serial.println(" done");
    Serial.print("Inhouse: ");
    Serial.println(answer_inhouse);
    Serial.print("Outhouse: ");
    Serial.println(answer_outhouse);
  }

  ldr = analogRead(A0);   // LDR einlesen
  autoAuf = LDRdunkelhell();
  autoAb = LDRhelldunkel();
  manAuf = !digitalRead(btnAuf);
  manAb = !digitalRead(btnAb);
  oben = !digitalRead(esOben);
  unten = !digitalRead(esUnten);
  Klappe();   // Klappe steuern
}

void handleNewMessages(int numNewMessages)
{
  for (int i = 0; i < numNewMessages; i++)
  {
    telegramMessage &msg = bot.messages[i];

    if (msg.text == "/temperatur")
    {
      sensor_inhouse.requestTemperatures();
      float tempC_inhouse = sensor_inhouse.getTempCByIndex(0);
      String answer_inhouse = "Die aktuelle Temperatur im Innenbereich beträgt: " + String(tempC_inhouse) + " Grad Celsius";
      bot.sendMessage(msg.chat_id, answer_inhouse, "");
      sensor_outhouse.requestTemperatures();
      float tempC_outhouse = sensor_outhouse.getTempCByIndex(0);
      String answer_outhouse = "Die aktuelle Temperatur im Außenbereich beträgt: " + String(tempC_outhouse) + " Grad Celsius";
      bot.sendMessage(msg.chat_id, answer_outhouse, "");
    }
  }
}
void Klappe()
{
  static uint32_t start;
  static uint32_t auszeit;
  bool aus = true; // Motor ist aus

  if ((manAuf || autoAuf ) && aus)   // Klappe auf
  {
    Serial.println("Klappe auf fahren");
    digitalWrite(motorAuf, HIGH);
    digitalWrite(motorAb, LOW);
    start = millis();
  }
  else if ((manAb || autoAb) && aus)   // Klappe zu
  {
    Serial.println("Klappe zu fahren");
    digitalWrite(motorAuf, LOW);
    digitalWrite(motorAb, HIGH);
    start = millis();
  }
  else if (manAb)
  {
    digitalWrite(motorAuf, LOW);  // manuell wechseln
  }
  else if (manAuf)
  {
    digitalWrite(motorAb, LOW);
  }

  if (millis() - start > maxlaufzeit || oben)   // oben stop
  {
    digitalWrite(motorAuf, LOW);
  }

  if (millis() - start > maxlaufzeit || unten)   // unten stop
  {
    digitalWrite(motorAb, LOW);
  }

  if (digitalRead(motorAuf) == HIGH || digitalRead(motorAb) == HIGH)
  {
    auszeit = millis();
  }

  if (millis() - auszeit > 100)
  {
    aus = true;
  }
  else
  {
    aus = false;
  }
}

bool LDRhelldunkel()
{
  static uint32_t vorhin;
  static bool merker;
  bool ret;
  ret = false;

  if ( ldr < dunkel)
  {
    if (millis() - vorhin >= verzDunkel && !merker)
    {
      Serial.print("es ist dunkel Wert "); Serial.println(ldr);
      ret = true;
      merker = true;
      // Nachricht an Telegram senden
      bot.sendMessage(chatId, "Guten Nacht wir gehen Schlafen!", "");
    }
  }
  else
  {
    vorhin = millis();
    merker = false;
  }

  return (ret);
}

bool LDRdunkelhell()
{
  static uint32_t vorhin;
  static bool merker;
  bool ret;
  ret = false;

  if ( ldr > hell)
  {
    if (millis() - vorhin >= verzHell && !merker)
    {
      Serial.print("es ist hell Wert "); Serial.println(ldr);
      ret = true;
      merker = true;
      // Nachricht an Telegram senden
      bot.sendMessage(chatId, "Guten Morgen wir sind Draussen!", "");
    }
  }
  else
  {
    vorhin = millis();
    merker = false;
  }

  return (ret);
}

Da ich das nicht kompilieren kann hab ich keine Ahnung, ob das geht.

Ich hab mich auf D4 jetzt eingelassen....

Ok, sollte dann auch funktionieren, wenn sein Board das "versteht".

hallo und Danke für die schnelle Antwort
der Lösungsansatz hat mir zum Erfolg gebracht
das Programm von dir war fehlerhaft aber ich hatte dann die richtige Richtung
Danke nochmal

Prima das es funktioniert.
Es wäre doch schön und im Sinne des Forums, wenn du deine funktionierende Lösung hier präsentierst.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.