Temperatur Messung mit dem DS18B20 und Arduino Nano

Habe heute einen One-Wire DS18B20 Temperatursensor erhalten und ihn mit dem Arduino Nano verbunden. Der Messbereich des Sensors beträgt von -55°C bis +125°C bei ± 0,5°C Genauigkeit.

Mit den OneWire 2.2 und Dallas Temperature Control Library 3.7.2 Bibliotheken ist die
Temperaturmessung schnell zusammengebaut.

Hier das Foto des Aufbaus mit Schaltplan:

Arduino Nano Temp. Messung via 1-Wire
Arduino Nano Temp. Messung via 1-Wire

Das Programm (8038 byte) gibt zuerst die eindeutige ID des Sensors aus, (28-A2-9D-8A-04-00-00-2B) und dann jede Sekunde den neuen Messwert:


/* 
TWTemp Version 1.0 vom 14.06.2013 

8038 bytes

Thomas Wenzlaff http://www.wenzlaff.de

Temperature Sensor DS18B20 an Digitalen Port Pin 2 wie folgt verbunden
Links=Masse, 
Mitte=Data, 
Rechts=+5V, 
3300 to 4700 Ohm Widerstand von +5V nach Data.

Es wird erst die Adresse des 1-Wire-Device ausgegeben und dann wird die Temperaturmessung gestartet.

*/

/* Benötigte Bibliotheken importieren */
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2 /* Digitalport Pin 2 definieren */

OneWire ourWire(ONE_WIRE_BUS); /* Ini oneWire instance */

DallasTemperature sensors(&ourWire);/* Dallas Temperature Library für Nutzung der oneWire Library vorbereiten */

void setup()
{
delay(1000);
Serial.begin(9600);
Serial.println("Temperatur Messprogramm");
Serial.println("TWTemp 1.0 vom 14.06.2013");
Serial.println("http://www.wenzlaff.de");
delay(1000);

sensors.begin();/* Inizialisieren der Dallas Temperature library */

adresseAusgeben(); /* Adresse der Devices ausgeben */

Serial.print("Starte Temperatur abfragen ...");
}

void loop()
{
Serial.println();

sensors.requestTemperatures(); // Temp abfragen

Serial.print(sensors.getTempCByIndex(0) );
Serial.print(" Grad Celsius");
}

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

  Serial.print("Suche 1-Wire-Devices...\n\r");// "\n\r" is NewLine
  while(ourWire.search(addr)) {
    Serial.print("\n\r\n\r1-Wire-Device gefunden mit Adresse:\n\r");
    for( i = 0; i < 8; i++) {
      Serial.print("0x");
      if (addr[i] < 16) {
        Serial.print('0');
      }
      Serial.print(addr[i], HEX);
      if (i < 7) {
        Serial.print(", ");
      }
    }
    if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.print("CRC is not valid!\n\r");
      return;
    }
  }
  Serial.println();
  ourWire.reset_search();
  return;
}

Um die höchstmögliche Genauigkeit des Sensors auszulesen ist im Setup noch dieser Befehl nötig, damit dauert die Messung aber etwas länger:

So sieht die Ausgabe des Programms aus:

TWTemp Ausgabe
TWTemp Ausgabe

Als nächstes folgt dann der Zugriff via Java.

22 Antworten auf „Temperatur Messung mit dem DS18B20 und Arduino Nano“

  1. Mit einem BeagleBone hatte ich auch Temperatur-Messungen gemacht. Konnte auch interessante Phänomene in der Genauigkeit feststellen. z.B. beim verringern der Abfragerate werden die Ergebnisse genauer. Finde nur schade, dass man die Daten bwz. die Ergebnisse von einem Arduino nur sehr umständlich visualisieren kann. Kann man die sagen wir mal z.B. an ein Raspberry Pi übergeben?

  2. Hallo,

    vielen Dank dafür.
    Hat wunderbar funktioniert, auch wenn mich der Schaltplan erst mal etwas verwirrt hat.
    Übrigens sehr schöne Website 🙂

    Beste Grüße
    Martin

  3. Hallo, gibt es einen Sensor für 1 Wire mit dem ich die Abgastemperatur von meiner Heizung messen kann? Also über 125°C. Oder wie geht man mit einem A/D Wandler und PT1000 vor? Wie wird dieser dann adressiert? Leider sind da meine Kenntnisse nicht so gut. Vielen Dank für die Info!

  4. This report would have more information with
    „Show verbose output during compilation“
    enabled in File > Preferences.
    Arduino: 1.0.6 (Windows XP), Board: „Arduino Nano w/ ATmega328“
    C:\Programme\Arduino\libraries\DallasTemperature\DallasTemperature.cpp:9:26: error: WConstants.h: No such file or directory

  5. Hallo,
    Du hast eine schöne Webseite.
    Ich suche verzweifelt : DallasTemperature.h zum runterladen.

    Kannst Du mir bitte helfen?

    Besten Dank aus dem Badischen Süden

    Dieter Deck

  6. echt schönes Tutorial,

    an welcher Stelle ist der Auflösung einzufügen ?
    sensors.setResolution(TEMP_12_BIT); // Genauigkeit auf 12-Bit setzen

    vielen Dank
    und weiter so

  7. Hi,

    was mach ich falsch wenn mein Dallas immer nur -127°C anzeigt?
    Ich hab ihn an nem Arduino Mini Pro mit 3,3V laut Tante Google sollte das passen 🙁

  8. Lief und läuft auf Anhieb. Aufgrund eines vorher missglückten Versuches mit einer anderen Schaltung, denke ich, die parasitäre Anbindung des Sensors ist elementar.
    Danke für den Beitrag.

  9. Hallo,
    wenn ich mehrere Sonsoren anschließe kann ich diese ja über den Index mit sensors.getTempCByIndex(0) abfragen. Nun weiß ich aber nicht in welcher Reihenfolge die Sensoren indexiert werden, bzw. wenn ich die Schaltung erweitere wo sich dann der neue Sensor einreiht. Kann ich nicht einmal bei der Inbetriebnahme die Adressen der Sensoren auslesen und dann fest dem Index zuordnen?

  10. Hi

    Da ich keinen Nano benutze, aknn ich nicht sagen, wie Der Das wohl macht.
    (Hab hier 3 Nano rumliegen, wird aber wohl noch brauchen, bis ich da dran gehe)
    Akut habe ich vor, die DS18B20 mit einem nackten ATtiny auszulesen (und die Ergebnisse auf ein LED-Display mit einem MAX7219 auszugeben).
    Auf Letzteres bekomme ich bereits die Messwerte eines DHT22 angezeigt (wenn man im rechten Moment mit Mitlesen anfängt, klappt’s auch mit dem Sensor).

    Zurück zum DS18B20:
    Lauf dem Datenblatt sollte der Ablauf ungefähr so aussehen:
    Master zieht Bus auf Low (480µs), gibt wieder frei
    Slave(s) ziehen Bus auf LOW (??)
    Master sendet Befehl/Kommando, z.B. SearchRom.
    Daraufhin ziehen die Slaves den Bus auf LOW, Die als erstes BIT eine 1 haben.
    Danach ziehen die Slaves den Bus auf LOW, Die als erstes Bit eine 0 haben.
    Daran kann der Master erkennen, ob überhaupt wer da ist (ok, nach dem ersten SLave-Low-Impuls müsste Da auch wer sein) und, ob da Mehrere sind – wenn in beiden Slots ein LOW gesehen wird.
    Hier entscheidet der Master, wohin die Reise geht, indem Er entweder eine 1 oder eine 0 sendet.
    Alle Slaves, Die diese 1 (oder 0) an dieser Bitstelle haben, machen mit dem nächsten Bit weiter, die Anderen sind ab jetzt ruhig.
    So kann der Master die verschiedenen Slaves einzeln herausfinden und damit auch einzeln ansprechen.

    Wenn man die Alarm-Einstellungen nicht braucht, aknn man hier eine Art Chip-ID eintragen.
    Wenn irgendwo ein DS18B20 auszutausschen ist (man war mit der Lötflamme am Heizungsrohr dem Kammeraden doch zu nahe gekommen), muß man ’nur‘ den neu einzusetzenden Slave die alte ID des verbrannten DS18B20 eintragen.
    Da man diese IDs selber vergeben hat, sollte sich irgendwo ein Schmierzettel finden, wo ‚ID1=Puffer Vorlauf‘ drauf steht – so ist die eigentliche Laser-ID relativ egal, von wo die Temperatur ist (und wie man Diese anzeigt), hängt von der – nennen wir Sie, ‚hausinterne‘ ID ab.

    Für’s ’nur Mal so spielen‘ ist Das wohl etwas oversized, wenn die Tiere aber mal sinnvoll eingesetzt werden sollen, könnte dieser Ansatz (hab ich auch nur im INet gelesen) durchaus interessant sein.

    Die 8kB Programmgröße empfinde ich als schon sehr viel – im angedachten ATtiny45 sind ’nur‘ 4kB Platz, denke, von Hand programmiert sollte Dieser aber ausreichen.
    Viel mehr als ‚eine Hand von 1-wire-Sensoren‘ und ein irgendwie geartetes Anzeige-Gerät (zuvor die MAX7219-Displays, danach kommen wohl LCDs per Schieberegister dazu, da der ATtiny45 nur 5(6) IOs hat und damit ein LCD noch nicht auskommt.

    Wie Dem auch sei, schöne Seite und: Herrlich, Mal was in Deutsch 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.