Get Temperature Via DS18B20

In einem früheren Eintrag habe ich das Stichwort Temperaturmessung erwähnt, jedoch nicht gezeigt, wie man dies auf dem Arduino bewerkstelligt. Das möchte ich jetzt nachholen.

Das Modul

Hierfür nutze ich das günstige und sehr einfach zu verwendende Thermometer DS18B20. Dieses nutzt den One-Wire-Datenbus um so mit anderen Geräten kommunizieren zu können. Der große Vorteil daran ist, dass die Daten eines, aber auch mehrerer Sensoren über nur eine Datenleitung gesendet werden. Daher auch der Name.

Sensor.jpg

Zusätzlich stelle ich hier gleich einen LC-Display vor, welcher mir I2C angesteuert werden kann. Normale 2-zeilige LCD’s (HD44780) verbrauchen sehr viele Pins am Arduino. Bei größeren Projekten kann dies ein Ausschlusskriterium sein. Deshalb nutze ich gerne die sparsamere Version der Datenübertragung – I2C.

Der Schaltplan

One-Wire bezieht sich nur auf die Datenübertragung. Zusätzlich benötigen die Sensoren noch Masse (GND) und optional eine Versorgung (Vcc). Ich sage bewusst optional, da die Datenleitung zugleich auch als Versorgungsleitung genutzt werden kann. In diesem Fall legt man dann auch den Vcc-Pin auf Ground. Ja: Vcc auf GND.

In meinem Fall verbinde ich jedoch Vcc mit +5V, denn das Kabel ist vorhanden und es stört auch nicht weiter. Die meisten Module, welche 1-Wire einsetzen arbeiten auch mit 3,3V als Versorgung. Diese können dann auch am Raspberry Pi verwendet werden.

DS18B20

Für das folgende Beispiel benötigt man eine Hand voll Bauteile:

  • Arduino UNO/Nano
  • 2 DS18B20 Thermometer
  • 1 4.7kΩ Widerstand für den Datenbus
  • Jumper-Wire

.

Temperature_OneWire_Steckplatine

Die Pinbelegung des Thermometers sieht dabei wie folgt aus:

ds18b20_pinout.jpg

Wer so wie ich ein wasserdichtes Gehäuse nutzt, der muss sich an den Farben des Kabels orientieren, um den Sensor richtig anzuschließen:

  • Pin 2: Gelb
  • +5V: Rot
  • Ground: Schwarz

 

Cables

.

Um alles zu fixieren gibt es hier noch den Schaltplan:

Temperature_OneWire_Schaltplan

Wie man erkennen kann, steck wirklich nicht viel hinter dem Aufbau. Es gibt sogar Sensoren mit integriertem Widerstand zu kaufen, diese sind jedoch unverhältnismäßig teuer.

Apropos Preis:  3,00€ für zwei Sensoren ist unschlagbar.

Liquid Crystal Display via I2C

Bei dem Display handelt es sich um das sehr weit verbreitete HD44780 Liquid Crystal Display. Ihm wird lediglich ein Rucksack-Modul verpasst, welches die I2C-Befehle in HD44780er-Befehle umwandelt.

Display.jpg

Das Display-Modul nutzt wie bereits erwähnt den I2C-Bus. Er wird genau wie der letzte von mir vorgestellte Display angeschlossen:

  • SDA: A4
  • SCL: A5
  • Vcc: +5V
  • GND: Ground

.

Backpack.jpg

Wer das Display nicht nutzen mag, der kann das Programm trotzdem auf das Arduino laden, denn die Temperatur wird nicht nur am LCD ausgegeben, sondern auch auf dem seriellen Monitor.

Das Programm

GitHub.

Im Verzeichnis auf GitHub findet man 5 Ordner. Die beiden namens Dallas Temperature und OneWire sind benötigte Programmbibliotheken für die Temperaturmessung. Das Verzeichnis namens LiquidCrystal_I2C beinhaltet die Bibliothek für den Display. Alle drei müssen in das Standard-Bibliotheken Verzeichnis von Arduino (../Arduino/Libraries/) kopiert werden. Ist dies erledigt, so kann man das erste Programm öffnen und auf das Arduino laden.

Temperature.ino

In Zeile 13 findet man die Definition, welche den Pin angibt, an dem die Datenleitung verbunden wird. In diesem Fall an Pin 2.

#define ONEWIRE_BUS 2

Um die Anzahl der angeschlossenen Sensoren herauszufinden nutze ich die Funktion

oneWire.search(Address))

So kann ich später zwischen allen verwendeten Sensoren automatisch umschalten lassen. Bis jetzt ist es mir noch nicht gelungen, automatisch herauszufinden, welcher Sensor welchen Index bekommt. Um es dennoch in Erfahrung zu bringen nehme ich einen Sensor in die Hand und warte, welcher Index die Temperatur ändert. Um überhaupt eine Temperatur auslesen zu können benötigt man zwei Funktionen:

oneWireSensors.requestTemperatures();
float Temp = oneWireSensors.getTempCByIndex(i);

Das Index der Funktion getTempCByIndex bezieht sich auf den Sensor. Sensor 1 hat Index 0, Sensor 2 hat Index 1, usw.

Im Großen und Ganze war es das. Die restlichen Zeilen im Programm sind dazu da, alle 2 Sekunden einen anderen Sensor am Display anzuzeigen, ohne dass das Programm gestoppt wird. Denn mit der delay(ms); Funktion wird das Programm angehalten. Nutzt man so wie ich einen Timer, kann man in der Zwischenzeit anderes erledigen, etwa Daten auf dem seriellen Monitor in kürzeren Zeitabständen ausgeben.

Temp.jpg

Vielleicht noch eine Kleinigkeit: Der Bus ist schon recht langsam. Es können je nach Anzahl der Sensoren bis zu wenige Sekunden vergehen, bis die Daten ausgelesen und verarbeitet sind.

Temperature_Scale.ino

Dieses Programm ist eine kleine Erweiterung des ersten um eine Skala. Es wird zwar nur mehr ein Sensor unterstützt, dessen Temperatur wird nun aber in Bezug auf die Grenzen des Sensors angezeigt.

Temp_Scala.jpg

Die Scala kann auch als Ladebalken oder Ähnliches genutzt werden. Dazu muss man nur die Funktion

void Scale (int Row, int Value, int Minimum_Value, int Maximum_Value)

einbinden und aufrufen. Row ist die Zeile auf dem Display, Value jener Wert, der dargestellt werden soll, und Min-& Max Value sind eben die Grenzen.

Will man also den Wert des Sensors in Zeile 2 innerhalb seines Einsatzgebietes darstellen (von -55°C bis +125°C), dann muss man die Funktion wie folgt aufrufen:

Scale(1, int(Temperature), -55, 125);

Das war es auch schon wieder. Ein Kommentar ist bei Fragen immer erwünscht!

 

 

 

 

Advertisements

3 Gedanken zu “Get Temperature Via DS18B20

  1. Genau das was ich suche 😉 jedoch betreibe ich einen Raspberry PI b+ und Raspbian 2x DS18B20 (1x Wasserdicht und 1x normal) und habe mir auch das HD44780 bestellt. Ist dein Script auch für raspberry nutzbar?

    Gefällt mir

    1. Grundsätzlich kannst du das selbe Ziel auch mit dem Raspberry erreichen. Allerdings habe ich den Temperatursensor noch nicht am RPi genutzt und habe deshalb auch kein Script parat.
      Nach kurzem Überfliegen des Inhalts kann ich dir diese Seite ( https://www.webnist.de/temperatur-sensor-ds1820-am-raspberry-pi-mit-python/ ) empfehlen. Hier wird Python genutzt, um die Sensordaten auszuwerten.

      Denn wenn du Python nutzt, dann kannst du für den Display einfach der Anleitung auf meiner Website ( http://www.deloarts.com/de/raspberry/16x2_i2c_display/ ) folgen. Bei Fragen kannst du diese gern hier stellen.

      Gefällt mir

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s