Temp messen mit DS18B20

Hallo,
ich habe mir mal digital Tempsensoren besorgt, leider krieg ich das irgendwie nicht hin.
Habe wie in diesem Dallas Temperature Control Library - MilesBurton.com aufgeführt 2 sensoren verbunden:

  • mittleren PIN an d10 und mit nem 4,7kOHm Widerstand an 5v
  • linken pin an gnd
  • rechten leer (also per one wire)
    => passt eigentlich und ich erhalte auch etwas über die serial ausgabe,allerdings keine temperatur:

o more addresseR=28 80 65 9C 3 0 0 20 Device is a DS18B20 family device.
P=1 B9 1 4B 46 7F FF 7 10 D1 CRC=D1
R=28 18 55 9C 3 0 0 B4 Device is a DS18B20 family device.
P=1 C1 1 4B 46 7F FF F 10 38 CRC=38
No more addresses.
R=28 80 65 9C 3 0 0 20 Device is a DS18B20 family device.
P=1 B9 1 4B 46 7F FF 7 10 D1 CRC=D1
R=28 18 55 9C 3 0 0 B4 Device is a DS18B20 family device.
P=1 FF FF FF FF FF FF FF FF FF CRC=C9
No more addresses.
R=28 80 65 9C 3 0 0 20 Device is a DS18B20 family device.
P=1 0 0 0 0 0 0 0 0 0 CRC=0
No more addresses.
No more addresses.
R=28 0 0 0 0 0 0 0 CRC is not valid!
No more addresses.
R=28 80 65 9C 3 0 0 0 CRC is not valid!
R=28 80 65 9C 3 0 0 80 CRC is not valid!
R=28 80 65 9C 3 0 0 40 CRC is not valid!
R=28 80 65 9C 3 0 0 C0 CRC is not valid!
R=28 80 65 9C 3 0 0 20 Device is a DS18B20 family device.
P=1 0 0 0 0 0 0 0 0 0 CRC=0
No more addresses.
No more addresses.
No more addresses.
No more addresses.
No more addresses.
No more addresses.
No more addresses.
No more addresses.
No more addresses.
No more addresses.
No more addresses.
No more addresses.
No more addresses.
No more addresses.
No more addresses.
No more addresses.
No more addresses.
No more addresses.
No more addresses.
No more addresses.

Diesen Code nutze ich:

#include <OneWire.h>

// DS18S20 Temperature chip i/o
OneWire ds(10);  // on pin 10

void setup(void) {
  // initialize inputs/outputs
  // start serial port
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];

  if ( !ds.search(addr)) {
      Serial.print("No more addresses.\n");
      ds.reset_search();
      return;
  }

  Serial.print("R=");
  for( i = 0; i < 8; i++) {
    Serial.print(addr[i], HEX);
    Serial.print(" ");
  }

  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.print("CRC is not valid!\n");
      return;
  }

  if ( addr[0] == 0x10) {
      Serial.print("Device is a DS18S20 family device.\n");
  }
  else if ( addr[0] == 0x28) {
      Serial.print("Device is a DS18B20 family device.\n");
  }
  else {
      Serial.print("Device family is not recognized: 0x");
      Serial.println(addr[0],HEX);
      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("P=");
  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();
}

Wo ich mir unsicher bin, kann ich die Library überhaupt nutzen oder ist die nur für den ds18S20?
Was ist genau der Unterschied?

Gruß
Thorsten

hallo,

ich hab mich in den letzten Tagen auch mit den Temperatursensoren von DALLAS beschäftigt:

=> http://www.amateurfunk.de/dl8ma/thermometer_dallas_ds1820.php

Teste doch einfach mal mein Beispielprogramm. Geht auch ohne LCD-Shield. Die Temperaturwerte werden auch über die serielle Schnittstelle ausgegeben.

Bei mir funktionieren beide Sensor-Varianten:

Gruss
Jürgen

If you need an excellent tutorial, you find it on bildr.org.
They have an artikle on the DS18B20 which is different from the DS18S20!!!

http://bildr.org/?s=ds18b20

Noorman:
If you need an excellent tutorial, you find it on bildr.org.
They have an artikle on the DS18B20 which is different from the DS18S20!!!

Search Results for “ds18b20” – bildr.org

Hi,
checked this out, seems to work though I get some values like 207 degrees.
I changed float TemperatureSum = tempRead/2-0.25+(CONT_PER_C-CONT_REMAIN)/CONT_PER_C;
to
float TemperatureSum = tempRead/16-0.25+(CONT_PER_C-CONT_REMAIN)/CONT_PER_C;
which seems to give me the correct values, not sure though.

Also, I need to use more than one tempsensor.
thx anyways

jmayer:
hallo,

ich hab mich in den letzten Tagen auch mit den Temperatursensoren von DALLAS beschäftigt:

=> http://www.amateurfunk.de/dl8ma/thermometer_dallas_ds1820.php

Teste doch einfach mal mein Beispielprogramm. Geht auch ohne LCD-Shield. Die Temperaturwerte werden auch über die serielle Schnittstelle ausgegeben.

Bei mir funktionieren beide Sensor-Varianten:

Gruss
Jürgen

Hi Jürgen,
auch deine version funktioniert, aber ich bekomme werte von über 200° aufs display.
Was genau muss ich ändern?
Kann ich mit deiner library auch mehrere sensoren in reihe schlaten und auslesen?

gruß
thorsten

hallo,

Ich vermute mal das die Erkennung des DS18B20 mit meiner Version 1 nicht klappt. Ich hab leider nur DS1822 bzw. DS18S20 Sensoren zur Verfügung.

In dem ersten Beispiel auf meiner Webseite kann man nur einen Sensor einlesen.

Inzwischen habe ich die Dallas Temperature Control Library genauer angeschaut und mein Code auf diese Library angepasst. Siehe Version 2 auf http://www.amateurfunk.de/dl8ma/thermometer_dallas_ds1820.php

In diesem Beispiel kann aber momentan auch nur ein Sensor am 1-Wire-Bus angeschlossen werden. Ich werde das aber noch erweitern ...

Gruss
Jürgen

Hi,
ich werd mir mal die datenblätter anschauen, kenne jetzt den unterschied nicht zwischen der S und B Version.
Aber wenn ich bei deinem Code aus

Whole = Tc_100 / 100; // Ganzzahlen und Brüche trennen
Fract = Tc_100 % 100;

das durch 8 teile:

Whole = Tc_100 / 8 / 100; // Ganzzahlen und Brüche trennen
Fract = Tc_100 / 8 % 100;

erhalte ich einen nachvollziehbaren Wert, aktuell in Höhe von 26,91° was gefühlt passen könnte, habe leider kein thermoemter hier im raum.
Kann das sein?
Gruß

EDIT////
nur ne Idee:
der DS18S20 arbeitet mit 9BIT
der DS18B20 mit 9-12BIT
=> die drei Bit unterschied ergeben ja genau den Wert 8, durch den ich immer teil. Bin jetzt echt ein Laie, daher mag das völliger schwachsinn sein, aber vielleicht hast du ja mehr plan um das mal zu checken.

Gruß

Hallo currymuetze,
ich hab mal ein paar Zeilen aus meinem Code kopiert.
So einfach geht das bei mir:
zur Info ich arbeite mit 6 Sensoren, deshalb die Vorgabe der Seriennummer. Habe sowohl den 18S20 als auch den 18B20
getestet und laufen eigentlich beide mit dem Programm.

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 22 // alle Temperaturfühler
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Sensor0 = {0x28, 0xBB, 0x7B, 0xDA, 0x02, 0x00, 0x00, 0xA9};
int sensoranzahl;
float Temperatur;
 void setup(void){
 Serial.begin(9600);
 sensors.begin(); sensoranzahl=sensors.getDeviceCount(), DEC; 
 }
void loop(void) 
{
 sensors.requestTemperatures();
  Temperatur = sensors.getTempC(Sensor0);
 Serial.print(Temperatur);
 }

This is my code to display sensor data from two ds18b20 sensors on two displays.
The sensors can just be connected parallel.

/************************************************************************************************
* Display temperature on serial display
* Requires an Arduino, DS18B20 & Serial LED display
* 
* Running on Arduino Uno & compatible
* 13/8/2011 arduino at esdivad.com
************************************************************************************************/

/***********************************************************************************************
* Resources
* http://www.milesburton.com/Dallas_Temperature_Control_Library
* Serial LED display:
* http://www.sparkfun.com/products/9765
* http://www.sparkfun.com/datasheets/Components/LED/7-Segment/SFE-0012-DS-7segmentSerial-v41.pdf
* http://www.arunet.co.uk/tkboyd/ec/ec1led4x7ser.htm
* C++:
* http://www.cplusplus.com/doc/tutorial/arrays/
************************************************************************************************/

#include <OneWire.h>
#include <DallasTemperature.h>
#include <NewSoftSerial.h>

// Port serial display is connected to 
int serialToDisplay0  	= 4; // serial LED display
int serialFromDisplay0 	= 5; // not used declared for clarity
int serialToDisplay1  	= 6; // serial LED display
int serialFromDisplay1 	= 7; // not used declared for clarity

// array declared global to modify by function and used in loop()
int temperature[2]; // 0 = round value, 1 = decimal value

// if we need serial debugging, just make this true
#define DEBUG false

// Setup serial LED displays
NewSoftSerial LedDisplay[2] = 	{ NewSoftSerial(serialFromDisplay0, serialToDisplay0),
				  NewSoftSerial(serialFromDisplay1, serialToDisplay1) };
				  
// Data wire is plugged into pin 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);

/************************************************************************************************
* void setup
************************************************************************************************/

void setup(void)
{
  pinMode(serialToDisplay0, OUTPUT);
  pinMode(serialToDisplay1, OUTPUT);
  
  int i;
  for ( i = 0; i < 2; i++)
  {
    // initialise serial LED displays
    LedDisplay[i].begin(9600);
    LedDisplay[i].print("v"); // reset display 
  }
    
  // Start up the sensors
  sensors.begin();
}

/************************************************************************************************
* void loop
************************************************************************************************/

void loop(void)
{ 

  int i;
  for ( i = 0; i < 2; i++)
  {
    // point position 1 & 5 on
    LedDisplay[i].print("w");
    LedDisplay[i].print(B00100010,BYTE);
    
    
    getTemperature(i);
   
    // print value to the display
    LedDisplay[i].print( temperature[0] );
    LedDisplay[i].print( temperature[1] );    
    
    // print celcius sign
    LedDisplay[i].print("C");
  } 
}

/************************************************************************************************
* getTemperature
************************************************************************************************/

void getTemperature( int sensorIndex )
{
   
  sensors.requestTemperatures(); // Send the command to get temperatures
  
  // get temperature from sensors and store the value in an array
  temperature[0] = sensors.getTempCByIndex(sensorIndex);
  temperature[1] = ( sensors.getTempCByIndex(sensorIndex) - temperature[0] ) * 10;
}

maverick1509:
Hallo currymuetze,
ich hab mal ein paar Zeilen aus meinem Code kopiert.
So einfach geht das bei mir:
zur Info ich arbeite mit 6 Sensoren, deshalb die Vorgabe der Seriennummer. Habe sowohl den 18S20 als auch den 18B20
getestet und laufen eigentlich beide mit dem Programm.

Hi,
hast du verschiedene Sensoren an einem String oder 6x den gleichen? Wenn ich das richtig sehe, hast du doch nur eine Seriennnummer (DeviceAddress Sensor0 = {0x28, 0xBB, 0x7B, 0xDA, 0x02, 0x00, 0x00, 0xA9}:wink: vorgegeben und nicht 6? Werd das heut abend mal ausprobieren, aber so ganz durchschaue ich die Logik noch nicht von den Lilbraries...
Gruß

Hallo,
genaugenommen sieht es etwas anders aus, hatte jetzt nur für einen Sensor gekürzt:

float Temperatur[6];
.
.
DeviceAddress Sensor0 = {0x28, 0xBB, 0x7B, 0xDA, 0x02, 0x00, 0x00, 0xA9};
DeviceAddress Sensor1 = {0x28, 0xA3, 0x82, 0xDA, 0x02, 0x00, 0x00, 0x06};
DeviceAddress Sensor2 = {0x28, 0x0C, 0x9E, 0xDA, 0x02, 0x00, 0x00, 0x23};
DeviceAddress Sensor3 = {0x28, 0x06, 0xCB, 0xDE, 0x02, 0x00, 0x00, 0xA5};
DeviceAddress Sensor4 = {0x28, 0x13, 0x81, 0xDA, 0x02, 0x00, 0x00, 0x4F};
DeviceAddress Sensor5 = {0x28, 0x47, 0xFA, 0x8D, 0x02, 0x00, 0x00, 0xFE};
.
.
Temperatur[0] = sensors.getTempC(Sensor0); Temperatur[1] = sensors.getTempC(Sensor1);
u.s.w.

ich habe im Moment 6x18B20 OneWire angeschlossen, hatte aber auch mit den 18S20
kein Probleme
Gruß
Bernward

Hallo,
habe hier schon mehrere Anwendungen mit dem DS18B20 realisiert. Die Adresse des Sonsors brauche ich bisher noch nicht.
Zuerst sollten mal die Programme unter Examples (Arduino 0022) funktionieren. Erst dann sollte man sich an die anderen Dinge im Umfeld wagen.
Für 4 Sensoren erfolgt bei mir die Abfrage in etwa :

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2

float Temp[4];
...
void TEMPsensoren()
{
sensors.requestTemperatures(); // Send the command to get temperatures
for(i=0; i<sensoranzahl; i++)Temp_=(sensors.getTempCByIndex(Sensor*-1));_
_
}*_
Unter Sensor[] steht dann die Reihenfolge der Sensoren, die bei Änderung im EEPROM abgespeichert wird und bei Programmstart jeweils neu eingelesen wird. So braucht man nicht jedesmal neu einstellen.
Gruss Kalli

Hallo Kalli,
das mit der Vorgabe der Adresse hat folgenden Hintergrund. So kann bei Defekt eines Sensors dieser problemlos
ausgetauscht werden ohne Eingriff in das Programm. Ich habe nämlich festgestellt, wenn du Sensoren tauschst ist nachher die
Reihenfolge ein völlig andere, d.h. wenn ein Sensor an Position 1 beim einlesen war ist er bei Austausch von Sensoren plötzlich
an Position 3 oder so. Und das hat natürlich große Auswirkung auf die Programmierung.
Gruß
Bernward

maverick1509:
Hallo Kalli,
das mit der Vorgabe der Adresse hat folgenden Hintergrund. So kann bei Defekt eines Sensors dieser problemlos
ausgetauscht werden ohne Eingriff in das Programm. Ich habe nämlich festgestellt, wenn du Sensoren tauschst ist nachher die
Reihenfolge ein völlig andere, d.h. wenn ein Sensor an Position 1 beim einlesen war ist er bei Austausch von Sensoren plötzlich
an Position 3 oder so. Und das hat natürlich große Auswirkung auf die Programmierung.
Gruß
Bernward

Hi,
aber änder sich beim AUstausch nicht auch die Adresse? Dachte jeder Sensor hat eine eigene Adresse....
Wie erhalte ich die Adresse überhaupt? Muss ich die einmalig über die library auslesen und dann manuell einfügen?
Gruß

Hallo,

mit dem Programm Tester (unter Examples) bekommt man die entsprechenden Daten der Sensoren.

Dallas Temperature IC Control Library Demo
Locating devices...Found 2 devices.
Parasite power is: OFF
Found device 0 with address: 28ECEC8D020000BA
u.s.w.
Nicht vergessen, bei dem Programm die eigene Portadresse eintragen (#define ONE_WIRE_BUS 7).
In meinen Programmen brauche ich die Adresse des Sensors nicht.
Bei dem Temperaturprogramm mit dem LCD Touch- Display kann ich die Sensoren an beliebige Plätze schieben (dadurch ist ein Austausch kein Problem), die Daten werden dann im EEPROM abgespeichert.
Das hatte ich wohl vergessen zu beschreiben. Genau aus dem Grund, dass sich die Reihenfolge ändert, habe ich das so gemacht. Ich habe bisher noch keine Programmfolge gefunden, um die Sensoradresse entsprechend zu vergleichen. Auch wenn ich das alles weiss, muss ich in das Programm eingreifen, sobald ein Sensor ausgetauscht wird.

Gruss Kalli

Hi,
alles hinbekommen, ist ja doch ganz easy, wenn die verkabelung passt :wink:
Eine Frage: dass ich bei 2 Tempfühlern im gleichen Breadboard eine Abweicheung von ca 0,5° habe, ist das tolerant oder müssten die 100%ig genau gleich sein?

Zweite Frage: Kann ich auch 2 Eingänge definieren und jeweils 2 Sensoren anbringen oder funktioniert die Library nur mit einem PIN/Strang?
(ob das SInn macht ist ne andere Frage :wink: )
#define ONE_WIRE_BUS 2

Gruß

Hallo currymuetze,

die Genauigkeit ist schon OK. Im Datenblatt steht +- 0,5 °C. Wenn Du es genau haben willst, musst Du Dir von 100 Stück 10 raussuchen, die gleiche Werte anzeigen (alle in ein Termostat stecken bei 40 ° C z.B.). Du musst darauf achten, dass die Sensoren einen guten Kontakt zu Messpunkt haben. Wenn das nicht so ist, ergeben sich schon ein paar Grad Temperaturunterschied.

#define ONE_WIRE_BUS 2 gibt den Datenport an, nicht die Anzahl der Sensoren. Nach meinen Erkenntnissen kann man nur ein Port benutzen. Da kann man ja genügend Sensoren anschlissen.
Ansonsten bin ich mit den Sensoren zufrieden. Die Anzeige ist hinreichend genau an und stabil ist es auch.
Auch HF vertragen die Dinger ganz gut (100 Watt im Umfeld).

Gruss Kalli