Frage wegen Dallas Senoren Auslesen

Hallo
Ich bin gerade am ausprobieren mehre DS 1820 Auszulesen.
Meine Frage ist die Folgende.
Wie lese ich die Sensoren korrekt aus.
Ich mache es so. Habe einen Code der alle Adresse der Sensoren ausliest,
das sieht dann so aus in Serial Monitor.

--Suche gestartet--
Device is a DS18S20 : 0x10, 00x4, 00x7, 0xDD, 00x1, 00x8, 00x0, 0x37
Device is a DS18S20 : 0x10, 0x47, 0x11, 00x2, 00x2, 00x8, 00x0, 0x84
Device is a DS18B20 : 0x28, 0xF1, 0xB9, 0xDC, 00x2, 00x0, 00x0, 0xBB
Device is a DS18B20 : 0x28, 0xEB, 0xBA, 0xDC, 00x2, 00x0, 00x0, 0x61
Device is a DS18B20 : 0x28, 0xE7, 0xA0, 0xDC, 00x2, 00x0, 00x0, 0xDD
--Suche beendet--

Und trage dann die 5 Sensoren so ein wie Abgebildet:

DeviceAddress Thermometer_1 = { 0x10, 0x04, 0x07, 0xDD, 0x01, 0x08, 0x00, 0x37 };
DeviceAddress Thermometer_2 = { 0x10, 0x47, 0x11, 0x02, 0x02, 0x08, 0x00, 0x84 };
DeviceAddress Thermometer_3 = { 0x28, 0xF1, 0xB9, 0xDC, 00x2, 00x0, 00x0, 0xBB };
DeviceAddress Thermometer_4 = { 0x28, 0xEB, 0xBA, 0xDC, 00x2, 00x0, 00x0, 0x61 };
DeviceAddress Thermometer_5 = { 0x28, 0xE7, 0xA0, 0xDC, 00x2, 00x0, 00x0, 0xDD };

Die ersten 4 Adressen erkennt er korrekt, bei der 5 macht er Probleme.
Was mache ich da Falsch.
Die 5 Sensoren sind alle Parallel angeschlossen und am
1 Ds 1820 ist zwischen +5 Volt und Signal ein 4.7 KOhm Widerstand mit 1 % angeschlossen.

Danke Stefan

Hallo ba1083

welchen Sketch benützt Du zum auslesen?
Solch einen könnte ich auch gut gebrauchen.

Hallo
Den Hier

#include <OneWire.h>
 
OneWire ow(9);
 
void setup(void)
{
  Serial.begin(9600);
  lookUpSensors();
}
 
void lookUpSensors()
{
  byte address[8];
  int i=0;
  byte ok = 0, tmp = 0;
 
  Serial.println("--Suche gestartet--");
  while (ow.search(address))
  {
    tmp = 0;
    //0x10 = DS18S20
    if (address[0] == 0x10)
    {
      Serial.print("Device is a DS18S20 : ");
      tmp = 1;
    }
    else
    {
      //0x28 = DS18B20
      if (address[0] == 0x28)
      {
        Serial.print("Device is a DS18B20 : ");
        tmp = 1;
      }
    }
    //display the address, if tmp is ok
    if (tmp == 1)
    {
      if (OneWire::crc8(address, 7) != address[7])
      {
        Serial.println("but it doesn't have a valid CRC!");
      }
      else
      {
        //all is ok, display it
        for (i=0;i<8;i++)
        {
          if (address[i] < 9)
          {
            Serial.print("0");
          }
          Serial.print("0x");
          Serial.print(address[i],HEX);
          if (i<7)
          {
            Serial.print(", ");
          }
        }
        Serial.println("");
        ok = 1;
      }
    }//end if tmp
  }//end while
  if (ok == 0)
  {
    Serial.println("Keine Sensoren gefunden");
  }
  Serial.println("--Suche beendet--");
}
 
void loop(void)
{
  //do nothing :)
}

Hallo.
poste mal den Sketch mit den fest eingegebenen Adressen - aber bitte in
Code Tags (das ist Formatierungsfeld mit dem #)
Gruß
Reinhard

Hallo,

der Code ist aus dem Arduino Playground One wire.

Nehmt die fertige Dallas Library. Bsp. Sketche sind enthalten.
http://www.milesburton.com/?title=Dallas_Temperature_Control_Library

Hallo
Diesen Code verwende ich.
Nur zur Info für mich.
Ich Trage die Adressen der Sensoren so ein wie mir das der Serial Monitor ausgibt.
Ist das so richtig.
Und noch eine Frage.
Spielt es eine Rolle ob auf den Sensoren DS1820 steht oder DS18B20
Weil 2 sind DS1820 und 3 sind DS18B20

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 9
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress Thermometer_1 = { 0x10, 0x04, 0x07, 0xDD, 0x01, 0x08, 0x00, 0x37 };
DeviceAddress Thermometer_2 = { 0x10, 0x47, 0x11, 00x2, 00x2, 00x8, 00x0, 0x84};
DeviceAddress Thermometer_3 = { 0x28, 0xF1, 0xB9, 0xDC, 00x2, 00x0, 00x0, 0xBB};
DeviceAddress Thermometer_4 = { 0x28, 0xEB, 0xBA, 0xDC, 0x02, 0x00, 0x00, 0x61 };
DeviceAddress Thermometer_5 = { 0x28, 0xE7, 0xA0, 0xDC, 0x02, 0x00, 0x00, 0xDD };

float Temperatur_1;
float Temperatur_2;
float Temperatur_3;
float Temperatur_4;
float Temperatur_5;

void setup ()  
{
Serial.begin(9600); //initialisieren serielle Schnittstelle auf 9600 Baud
Serial.println("Start"); //Start ausgeben
 sensors.begin();
  // Einstellung der Auflösung auf 10 bit
  sensors.setResolution(Thermometer_1, 10);
  sensors.setResolution(Thermometer_2, 10);
  sensors.setResolution(Thermometer_3, 10);
  sensors.setResolution(Thermometer_4, 10);
  sensors.setResolution(Thermometer_5, 10);

} 


void loop()
{
  sensors.requestTemperatures();
  float Temperatur_1 = sensors.getTempC(Thermometer_1);
  float Temperatur_2 = sensors.getTempC(Thermometer_2);
  float Temperatur_3 = sensors.getTempC(Thermometer_3);
  float Temperatur_4 = sensors.getTempC(Thermometer_4);
  float Temperatur_5 = sensors.getTempC(Thermometer_5);
  
  Serial.print("1.Temperature ist: ");
  Serial.println(Temperatur_1);
  Serial.print("2.Temperature ist: ");
  Serial.println(Temperatur_2);
  Serial.print("3.Temperature ist: ");
  Serial.println(Temperatur_3);
  Serial.print("4.Temperature ist: ");
  Serial.println(Temperatur_4);
  Serial.print("5.Temperature ist: ");
  Serial.println(Temperatur_5);
  Serial.println();
  delay(2000);
}

Danke Stefan

ba1083:
Spielt es eine Rolle ob auf den Sensoren DS1820 steht oder DS18B20
Weil 2 sind DS1820 und 3 sind DS18B20

Das ist keine so gute Idee. Der DS1820 macht nur 9 Bit. Und braucht dafür die gleiche Zeit wie der DS18B20 für 12 Bit: 750ms. Die Timings dieser Lib sind teilweise für die B-Version ausgelegt!

Es gibt zwei einfache Möglichkeiten das zu umgehen (wobei Option 1 besser ist!):
1.) asynchron abfragen und das Delay per Hand machen, d.h. in setup() sensors.setWaitForConversion(false) machen und zwischen requestTemperatures() und getTempC() 750ms warten. Siehe auch die zwei entsprechenden Beispiele in der Lib dazu.
2.) statt dem requestTemperatures() für alle Sensoren, die Methode requestTemperaturesByAddress() verwenden und von jedem Sensor einzeln eine Wandlung anfordern. Diese Methode fragt ab welchen Sensor-Typ man hat und macht das Timing korrekt:

if (deviceAddress[0] == DS18S20MODEL)
{
    delay(750);  // max value found in datasheet
    return true;
}

requestTemperatures() dagegen fragt nur die globale Auflösungs-Variable ab und macht danach das Timing. Und zwar mit den Werten für den DS18B20!

Der Nachteil ist natürlich, dass du dann das Delay 5 mal drin hast, statt einmal. Das verlangsamt das ganze dann ziemlich. Deshalb ist Option 1 deutlich besser :slight_smile:

So oder so kannst du den DS1820 nicht mit 10 Bit betreiben. Du kannst zwar die Methode aufrufen, aber es wird dann kein Kommando geschickt. Ist also für die Sensoren überflüssig. Die arbeiten fest mit 9 Bit.
Es schadet daher aber auch nichts einfach setResolution(10) zu machen. Dann arbeiten alle DS18B20 mit 10 Bit. Das ist vielleicht sowieso besser, da ich in der Lib nicht sehe, dass mit der setResolution() Methode per Adresse mal die globale Auflösungs-Variable geändert wird. In der Version die alle Sensoren setzt wird das dagegen macht.

Hallo
Danke an ALLE für die Hilfe.