Probleme mit OneWire

Hallo zusammen,

ich versuche seit einiger zeit einen Themperatursensor DS18B20 mit einem ESP 8266_12E aus zu lesen doch mit nur sehr geringem Erfolg.

Ich habe den Sensor so angeschlossen wie es in den ganzen Tutorials erklärt wird. Mit Widerstand zwischen + (rot) und Daten (gelb). Da ich keinen 4,7 kOhm wieder stand zur Hand hatte habe ich ein 5,1 kOhm Widerstand verwendet. Aber macht das was aus?

Ich benutze die Bildbibliothek “OneWire.h” und das Beispiel DS18x20_Temperature aber ich erhalte nur die Meldung auf der Console dass keine Adresse gefunden wurde. Ich habe mehrere port und mehrere Sensoren ausprobiert.

kann mir jemand einen Tipp geben?

Gruß Chrisbie

Sensor richtig rum angeschlossen ? (GND, Datapin , VDD) datapin an Arduino Pin D10, wie im Beispiel angegeben?

Mehr fällt mir jetzt auch nicht zu ein. Kontrolliere nochmals genau, ob du wirklich den Sensor richtig angeschlossen hast, und nicht nur glaubs ihn richtig angeschlossen zu haben. Also wenn die Beinchen nach UNTEN schauen und Du auf die FLACHE seite des Sensors schaust ist LINKS GND, MITTE DATA , und RECHTS ist VDD die an 5V des Arduino angeschlossen werden.

Wenn Du da nicht ganz sicher bist, dass die sensoren jeweils richtig angeschlossen waren, soltest Du zum weiteren testen einen NEUEN sensor, den Du nocht nicht angeschlossen hattest , nehmen.

LG Stefan

SCHALTPLAN auf Papier und Echtfoto bitte! Danach die Frage klären: Woher sind die 5V für den DS, woher die 3.3V für den ESP?

Chrisbie:
mit einem ESP 8266_12E

Deltaflyer:
datapin an Arduino Pin D10

@Stefan an einem ESP 8266_12E gibt es keinen Pin D10!

Und ein DS18B20 am Pin 10 (GPIO10) wird wahrscheinlich nicht funktionieren.

Gruß Fips

Deltaflyer: ..... Mehr fällt mir jetzt auch nicht zu ein. Kontrolliere nochmals genau, ob du wirklich den Sensor richtig angeschlossen hast, und nicht nur glaubs ihn richtig angeschlossen zu haben. Also wenn die Beinchen nach UNTEN schauen und Du auf die FLACHE seite des Sensors schaust ist LINKS GND, MITTE DATA , und RECHTS ist VDD die an 5V des Arduino angeschlossen werden. .....

Da der TO von Farben der Anschlusskabel schreibt, verwendet er vermutlich die "wasserdichten" Sensoren. Bitte immer den kompletten Post lesen.

@Chrisbie Und der Widerstandswert den du verwendest, ist ok.

Zeige uns mal deinen Sketch.

Ok, Dieter , hast Recht, mein Fehler. Sorry.

LG Stefan

Hi

Falsche Adresse ist ja durchaus möglich - da JEDER 1-wire-Sensor Seine eigene Adresse hat (und Diese Einzig sein soll), musst Du schon die passende Adresse abfragen. Die Lib bietet mit Sicherheit eine Methode, den nächsten Sensor zu suchen wie auch Eine, diese Suche zu resetten (wenn kein nächster Sensor gefunden wurde). Hatte die Suche auch schon Mal in Assembler auf einem ATtiny45 zusammen geschrieben - mit Arduino und Lib ist's aber deutlich einfacher ;)

Bei falschem Anschluss wird der Sensor tierisch heiß - Meine haben bisher sämtliche Misshandlungen schadlos überstanden, zumindest differieren die Werte der verschiedenen Sensoren nur gering - hier zählt schon der kleinste Luftzug, daß selbst Sensoren, Die nebeneinander im Steckbrett sitzen, völlig auseinander laufen können.

MfG

Also heiß wurde der Sensor nicht.

Als scetch habe ich das Beispiel aus der LIB genommen.

#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!
// https://github.com/milesburton/Arduino-Temperature-Control-Library

OneWire  ds(10);  // 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");
}

habe aber auch andere beispiele versucht.

/*
 *    Example-Code that emulates a DS18B20
 *
 *    Tested with:
 *    - https://github.com/PaulStoffregen/OneWire --> DS18x20-Example, atmega328@16MHz as Slave
 *    - DS9490R-Master, atmega328@16MHz and teensy3.2@96MHz as Slave
 */

#include "OneWireHub.h"
#include "DS18B20.h"  // Digital Thermometer, 12bit

constexpr uint8_t pin_led       { 13 };
constexpr uint8_t pin_onewire   { 8 };

auto hub    = OneWireHub(pin_onewire);

auto ds18b20 = DS18B20(DS18B20::family_code, 0x00, 0x00, 0xB2, 0x18, 0xDA, 0x00); // DS18B20: 9-12bit, -55 -  +85 degC
auto ds18s20 = DS18B20(0x10, 0x00, 0x00, 0xA2, 0x18, 0xDA, 0x00);                 // DS18S20: 9   bit, -55 -  +85 degC
auto ds1822  = DS18B20(0x22, 0x00, 0x00, 0x22, 0x18, 0xDA, 0x00);                 // DS1822:  9-12bit, -55 - +125 degC

bool blinking(void);

void setup()
{
    Serial.begin(115200);
    Serial.println("OneWire-Hub DS18B20 Temperature-Sensor");
    Serial.flush();

    pinMode(pin_led, OUTPUT);

    // Setup OneWire
    hub.attach(ds18b20);
    hub.attach(ds18s20);
    hub.attach(ds1822);

    // Test-Cases: the following code is just to show basic functions, can be removed any time
    Serial.print("Test - set Temperatures to -56 degC (out of range): ");
    ds18b20.setTemperature(int8_t(-56));
    Serial.println(ds18b20.getTemperature());

    Serial.print("Test - set Temperatures to -55 degC: ");
    ds18b20.setTemperature(int8_t(-55));
    ds18s20.setTemperature(int8_t(-55));
    Serial.print(ds18b20.getTemperature());
    Serial.print(", ");
    Serial.println(ds18s20.getTemperature());   // ds18s20 is limited to signed 9bit, so it could behave different

    Serial.print("Test - set Temperatures to 0 degC: ");
    ds18b20.setTemperature(int8_t(0));
    ds18s20.setTemperature(int8_t(0));
    Serial.print(ds18b20.getTemperature());
    Serial.print(", ");
    Serial.println(ds18s20.getTemperature());

    Serial.print("Test - set Temperatures to 21 degC: ");
    const int8_t temperature = 21;
    ds18b20.setTemperature(temperature);
    ds18s20.setTemperature(temperature);
    ds1822.setTemperature(temperature);
    Serial.print(ds18b20.getTemperature());
    Serial.print(", ");
    Serial.println(ds18s20.getTemperature());

    Serial.print("Test - set Temperatures to 85 degC: ");
    ds18b20.setTemperature(int8_t(85));
    ds18s20.setTemperature(int8_t(85));
    Serial.print(ds18b20.getTemperature());
    Serial.print(", ");
    Serial.println(ds18s20.getTemperature());

    Serial.print("Test - set Temperatures to 126 degC (out of range): ");
    ds1822.setTemperature(int8_t(126));
    Serial.println(ds1822.getTemperature());


    Serial.println("config done");
}

void loop()
{
    // following function must be called periodically
    hub.poll();
    // this part is just for debugging (USE_SERIAL_DEBUG in OneWire.h must be enabled for output)
    if (hub.hasError()) hub.printError();

    // Blink triggers the state-change
    if (blinking())
    {
        // Set temp
        static float temperature = 20.0;
        temperature += 0.1;
        if (temperature > 30.0) temperature = 20.0;
        ds18b20.setTemperature(temperature);
        ds18s20.setTemperature(temperature);
        ds1822.setTemperature(temperature);
        Serial.println(temperature);
    }
}

bool blinking(void)
{
    constexpr  uint32_t interval    = 1000;          // interval at which to blink (milliseconds)
    static uint32_t nextMillis  = millis();     // will store next time LED will updated

    if (millis() > nextMillis)
    {
        nextMillis += interval;             // save the next time you blinked the LED
        static uint8_t ledState = LOW;      // ledState used to set the LED
        if (ledState == LOW)    ledState = HIGH;
        else                    ledState = LOW;
        digitalWrite(pin_led, ledState);
        return 1;
    }
    return 0;
}

alles ohne erfolg.

Der NudeMCU_V3 wird über USB mit 5V versorgt, die 3,3V kommen von Pin 3V des NudeMCU_V3.

Verschieden Ports habe ich ebenfalls getestet.

Was mich etwas verwirrt ist die Tatsache dass ich eben eine Beschreibung gefunden habe die mir folgenden Farbcode zeigt:
schwarz = ground
gelb = VCC
rot = daten

ich bin bisher von diesem Farbcode ausgangen:
schwarz = ground
gelb = daten
rot = VCC

welches ist denn nun richtig?

Gruß Chrisbie

versuche mal statt des 5,1k einen 3,3k Widerstand

Was mich etwas verwirrt ist die Tatsache dass ich eben eine Beschreibung gefunden habe die mir folgenden Farbcode zeigt: schwarz = ground gelb = VCC rot = daten

ich bin bisher von diesem Farbcode ausgangen: schwarz = ground gelb = daten rot = VCC

welches ist denn nun richtig?

Da solltest du am Besten mal deinen Lieferanten fragen. Die bisher von mit verwendeten, haben immer die Daten auf einem gelben oder weißen Kabel.

Oder du probierst es aus.