DS18B20 wollen nicht!

Hallo,
ich verzweifle noch, ich bekomme die Temperatur-Schaltung einfach nicht ans laufen...

Könnt ihr einen Fehler erkennen?

Hier ein Foto der Schaltung: Link

Hier der Code

#include <OneWire.h>

// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// // Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

/*
 * The setup function. We only start the sensors here
 */
void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
}

/*
 * Main function, get and show the temperature
 */
void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  // After we got the temperatures, we can print them here.
  // We use the function ByIndex, and as an example get the temperature from the first sensor only.
  float tempC = sensors.getTempCByIndex(0);

  // Check if reading was successful
  if(tempC != DEVICE_DISCONNECTED_C) 
  {
    Serial.print("Temperature for the device 1 (index 0) is: ");
    Serial.println(tempC);
  } 
  else
  {
    Serial.println("Error: Could not read temperature data");
  }
}
//
// 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[9];
  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");
}

Die DS18B20 hatte ich in evay gekauft. Hier ein Screenshot - sieht schon seriös aus.
Als Hardware habe ich allerdings einen DDCarduino uno
Habe aber auch noch einen Mega 2560 hier liegen...

Ich hatte zuvor noch alibaba Sensoren - dachte das wären ggf Fakesensoren gewesen. Diese wurden in der Schaltung heiß - aber die hier werden auch schon recht warm...

Wenn Temperatursensoren warm werden, ist garantiert etwas faul.
Wie hast Du die angeschlossen? Hast Du einen PullUp-Widerstand dran?
Das Bild kann alles und nichts bedeuten. Im besten Fall, dass ein PullUp dran ist.

Gruß Tommy

Ja habe einen 4,7k dran.
Das Schaltbild ist quasi dieses hier

Du solltest Dein Bild hier rein hängen. Dein Link führt in ein paar Tagen ins Leere und kein M;ensch wird dann noch nachvollziehen können, was Du da gebaut hast. Siehe auch hier

Bitte schau nochmal ins Datenblatt.
Die PIN-Beschreibung ist von unten mit Sicht auf die Pins. Nicht von oben.

@Tommy56 kannst Du mal bitte die Anleitung:

mit dem Datenblatt vergleichen?

Meine wurden auch mal sehr heiß. Da hatte ich sie verpolt. Also VCC mir GND vertauscht. Wegschmeissen und neue kaufen. Wie sollen die z.B. Raumtemperatur messen, wenn sie 100 Grad warm sind? Also wenn die auch nur minnimal warm oder gar heiß wurden, dann waren das keine Fakesensoren sondern sie sind verglüht wegen Verpolung.

Das sollte so passen. Wenn sie allerdings schon mal verpolt waren oder Fakes sind, bringt das nichts.
Das warm werden ist ein Fehlermerkmal. Das darf nicht auftreten.

Gruß Tommy

Wen er das wie im #3 gemacht hat ist doch in Ordnung GND Out VCC

Ich habe mal China DS verpolt hat das überlebt, nicht dass das Transistoren sind

Aber auch nur, wenn er zuvor damit keinen Fehler (verpolt) gemacht hat.

Was mir am den Foto der Firma Naltronic stutzig mach ist die Aufschrift, selbst Originale kann man kaum lesen, außer dem sind die 'Gelasert' nicht bedrückt, sogar China Nachbau ist nicht lesbar

Das habe ich auch schon geschafft, aber darauf sollte man sich nicht verlassen. Bei mir hat der aktive USB-Hub wohl rechtzeitig abgeschaltet.
Der Gedanke mit den Transistoren kam mir auch schon.

Gruß Tommy

heisst jetzt was?

also der Anschluss sollte stimmen. Flache Seite vorn, Beinchen unten, dann ist links an GND, mitte an Pin 2, rechts an Plus 5V. Zwischen Plus und Pin 2 liegt noch ein 4,7k

Der Code ist korrekt so?
Im Seriellen Monitor kommt nur

"No more addresses."

Falls Du den Code aus #1 meinst, da sind 2 mal loop und setup drin, der kann nicht compilieren. Außerdem arbeitet der eine an Pin 2, der andere an 10.

Stell das mal klar, was Du wirklich für einen Code verwendest.

Gruß Tommy

1 Like

und später im loop

Hallo bei der Durchsicht Deines Codes ist mir aufgefallen das Du zwei Instanzen angelegt hast. Beim Auslesen beziehst Du dich auf die ds.. Instanz, dafür hast Du aber keine DallasTemperatur Instanz.
ich denke da ist beim kopieren was falsches reingerutscht.
Heinz

1 Like

Mach ein Foto von Deinem Aufbau, das man sowohl den Controller als auch das Steckbrett sieht. Mit allen Kabeln ununterbrochen.
Dann geht das auch zu erläutern, was Dein Fehler ist. So ist das nur stochern im Nebel.

So, ihr habt recht. Erstmal Ordnung reinbringen.

Aber ein paar mehr Bilder, damit man alles besser erkennen kann.




Beim kopieren scheint tatsächlich was schief gelaufen zu sein.

Habe nun diesen Code auf dem Arduino: Fehlermeldung:

"Dallas Temperature IC Control Library Demo
Requesting temperatutDallas Temperature IC Control Library Demo
Requesting temperatures...DONE"

// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

/*
 * The setup function. We only start the sensors here
 */
void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // Start up the library
  sensors.begin();
}

/*
 * Main function, get and show the temperature
 */
void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  // After we got the temperatures, we can print them here.
  // We use the function ByIndex, and as an example get the temperature from the first sensor only.
  float tempC = sensors.getTempCByIndex(0);

  // Check if reading was successful
  if(tempC != DEVICE_DISCONNECTED_C) 
  {
    Serial.print("Temperature for the device 1 (index 0) is: ");
    Serial.println(tempC);
  } 
  else
  {
    Serial.println("Error: Could not read temperature data");
  }
}

Das hört sich nach Totalausfall an.
In den Beispielen gibt es in der DallasTemperature das example oneWireSearch.
Eimal ausführen.
Wenn keine Sensoradresse, dann kaputt.
Neuen Sensor.

1 Like

ok, danke
ich schau mal ob ich das Beispiel finde. Ich kann aber davon ausgehen, dass die Schaltung soweit OK ist - nicht dass ich mir danach den nächsten zerschieße (falls der DS nicht vorher schpn defekt / oder falsch war)?

Da die lib installiert ist, sollte es da sein :wink:

Soweit sieht es erstmal ok aus.
Und PIN 2 stimmt.

1 Like

findetnet :frowning: