No more adresses - ESP32 und DS18B20

Hallo liebe Leute!

Ich quäle mich seit mehreren Tagen mit meinem ESP32 NodeMCU über OneWire fünf Temperatursensoren auszulesen.

Zuerst finde ich am Pin 15 keine OneWire-Devices. Auch wenn ich an anderen Pins suche, taucht keine Verbindung auf.

Wenn ich meine Arduino Uno verwende, werden die Sensoren ohne Probleme ausgelesen.

Hier ist der Code, den ich verwende (eigentlich die Standard-Demo):

#include <OneWire.h>

// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

#define ONE_WIRE_BUS 15
OneWire  ds(ONE_WIRE_BUS);  // on pin 10 (a 4.7K resistor is necessary)

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
}

Ich hoffe, Ihr könnt mir helfen.

Vielen Dank im Voraus,
Hannes

Noch kenne ich den ESP32 NodeMCU nicht, aber hast du mal einen anderen Pin versucht ?
Evtl. hast du den falschen gewählt.

Danke für die schnelle Antwort!

Diesen ESP32 NodeMCU (https://www.amazon.de - Link) habe ich bestellt und mehrere Pins probiert. Nirgendwo werden die Sensoren gefunden, am Arduino geht es ohne Problem...

Sorry, da muss ich passen, vermute aber, es liegt an deiner Pinzuordnung.

Das mit dem "Passen" wird sich ändern, werde kurzfristig einen zum Spielen bestellen.
Hilft dir jetzt leider nicht weiter, sorry.

Wie meine Vorredner schon geschrieben haben, bist Du Dir sicher dass das Pinout zu Deinem Vorhaben stimmig ist!?

Gruß SG

Also dass die Verkabelung passt bin ich mir sehr sicher, mit dem Arduino kann ich ja auslesen. Nur der Esp32 spielt nicht mit...

Habe jetzt um es einheitlich mit der Wirescheme mache, den OneWire-Pin auf 0 gelegt.

Zusätzlich habe ich mir alle Warnings in der IDE anzeigen lassen, da taucht das auf:

In file included from /tmp/arduino_modified_sketch_695383/DS18x20_Temperature.pde:1:0:
/home/johannes/Arduino/libraries/OneWire/OneWire.h:254:2: warning: #warning "OneWire. Fallback mode. Using API calls for pinMode,digitalRead and digitalWrite. Operation of this library is not guaranteed on this architecture." [-Wcpp]
 #warning "OneWire. Fallback mode. Using API calls for pinMode,digitalRead and digitalWrite. Operation of this library is not guaranteed on this architecture."
  ^

#define ONE_WIRE_BUS 15

Das passt nicht zu deinen Bildern!

Gruß Fips

Derfips:
Das passt nicht zu deinen Bildern!

Weiß ich, konnte den Pin im Plan nicht ändern und habe es auf 0 umgesteckt. Egal wo er hängt, erkennt er nichts. Alles schon versucht...

Hast du verstanden, was in der Warnung steht?
das ist wohl die Antwort.

Ja, habe die Warnung verstanden. Lange in der Library gesucht und nachdem ich sie geupdatet hat, ist die Warnung weg.

Leider findet er immer noch keine Devices...

Dann häng mal ne Led dran und mach auf dem Pin das Blink-Beispiel. Nur um ganz sicher zu sein, dass du auch den richtigen Pin ansprichst.

Hallo,

bei mir geht es :slight_smile: .

Allerdings steckt der mittlere PIN vom Sensor (DATA) am PIN D6 des NODEMCU und in Zeile 10 steht
#define ONE_WIRE_BUS D6.

Dann habe ich nur einen 1 k Widerstand und 3 DS18B20, mehr habe ich nicht...

uk1408:
bei mir geht es :slight_smile: .

#define ONE_WIRE_BUS D6.

Schön wenn es bei dir funktioniert, jedoch wo, bitte, ist an einem Esp32 der Pin D6?

variants/nodemcu-32s/pins_arduino.h

Gruß Fips

HannesVomLande:
...
ESP32 NodeMCU...

Sorry, da habe ich wohl was übersehen....

Hat der Arduino 5V und der ESP nir 3,3V?

Danke allen für die Hilfe. Mir scheint, dass einfach mein Board ein Problem hatte.

Habe mir jetzt noch ein zweites Modul von einem anderen Hersteller bestellt und da funktioniert es einwandfrei. Außerdem bin ich auf micropython umgestiegen, funktioniert echt super.

Nun zur Frage: Kann es sein, dass ich den alten Esp32 mit einem 16x4 LCD gekillt habe, weil er zu viel Saft gebraucht hat?

Schöne Woche noch! :wink:

HannesVomLande:
.....
Nun zur Frage: Kann es sein, dass ich den alten Esp32 mit einem 16x4 LCD gekillt habe, weil er zu viel Saft gebraucht hat?

Kommt darauf an, wie du es angeschlossen hast.
Wenn per I2C, dann müssen da Levelshifter zwischen.
Aber auch bei parallelen Anschluss dürfen die Datenleitungen nicht direkt verbunden werden.
Die LCD, die mir bekannt sind, arbeiten mit 5Volt, das ist für den ESP sicher zu viel.