Temperaturmessung mit dem Arduino

Cookies ermöglichen eine bestmögliche Bereitstellung dieser Webseite. Mit der Nutzung von test-wetterstation.de erklären Sie sich damit einverstanden, dass wir Cookies verwenden.

In unserem Artikel „Temperaturmessung mit dem Raspberry Pi“ haben wir uns bereits mit der Temperaturmessung mittels Kleincomputer beschäftigt. Damals kam zur Messung ein Raspberry Pi mit DHT22 zum Einsatz. Nun möchten wir die eingesetzte Hardware noch ein wenig herunterschrauben: Im heutigen Artikel basieren unsere Messungen auf einen Arduino Uno Bord. Uns stellt sich die Frage, wie man Temperatursensoren an diesen kleinen Alleskönner anschließen kann. Doch weiter interessiert uns auch die Frage, wie genau die Sensoren die Temperatur messen.

Für den heutigen Test haben wir die Temperatursensoren LM35, DHT11, DHT22 und den DS18B20 einem genauen Test unterzogen. Auch wenn sich die je zwei Sensoren von außen stark ähneln, unterscheiden sie sich zum Teil grundlegend in ihrer technischen Beschaffenheit und der Art und Weise, wie die Ermittlung der Temperatur zustande kommt. Ferner weichen die Sensoren auch im Preis zum Teil deutlich voneinander ab. Daher liegen die folgenden Fragen förmlich auf der Zunge: Welcher Sensor liefert die besten Ergebnisse? Und: Welches ist der günstigste Temperatursensor, der noch akzeptable Ergebnisse liefert?

arduino aufbau
Im Praxistest: Der LM35, DHT11, DHT22 und DS18B20. Alle Temperatursensoren mussten zeigen, wie genau sie die Temperatur ermitteln.

Arduino: Das LCD Display

Die Ausgabe von Daten erfolgt bei dem kleinen Bastelcomputer in der Regel über die serielle Schnittstelle. Für einen Test ist diese Ausgabe durchaus ausreichend. Wenn man den Arduino jedoch unabhängig von einem Rechner betreiben möchte, muss man die Daten anderweitig visualisieren. Hier bietet sich ein LCD-Display an. In unserem Test benutzen wir ein Hitachi-kompatibles Display, welches recht einfach über den Arduino anzusprechen ist. Auch sind die Kosten von rund 2,50 Euro für ein solches Display, direkt aus China geliefert, überschaubar. Leider sind für den Aufbau mehr Kabel notwendig, als Anfängern lieb sein dürfte. Doch mit ein wenig Begeisterung sollte diese Hürde schnell zu meistern sein.

Schaltplan Arduino mit LCD Display

fritzing-lcd

Schritt für Schritt Anleitung: Arduino mit LCD Display (Video)

Benötigte Elemente

Sketch Arduino mit LCD Display

//ACHTUNG: Leerstelle in Include vor/nach spitzer Klammer entfernen!
#include < LiquidCrystal.h >

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
// Definition von LCD: 16 Zeichen, 2 Zeilen
lcd.begin(16, 2);

// Wir schreiben in die erste Zeile:
lcd.print("test-");

// Wir setzen den Cursor in die zweite Zeile
lcd.setCursor(0, 1);
lcd.print("wetterstation.de");
}

void loop() {

// Wir schalten das Display aus
lcd.noDisplay();

// Und warten ...
delay(500);

// Und schalten das Display wieder an ...
lcd.display();

// Und warten wieder
delay(500);
}

Grundsätzliches

Da einige Sensoren eine gewisse „Aufwärmzeit“ benötigen, starten wir im Sketch (Programmcode) bei allen Sensoren zuerst mit einem „delay(2000);“, also einer Wartezeit von zwei Sekunden. Vorher sind keine vernünftigen Messwerte zu erwarten.

Auch sind die hier vorgestellten Sensoren nicht dazu geeignet, in Sekundenbruchteilen Messungen zu wiederholen. Eine Wartezeit von ein bis zwei Sekunden zwischen zwei Messungen sollte in der Praxis zu guten Messwerten führen.
 

Technische Daten (Herstellerangaben)

TypLM35DHT11 DHT22DS18B20
Temperaturbereich:-40 bis +110 °C0 bis 50 °C, ±2 °C-40 bis +80 °C, ±0.5-55 bis 125°C,
± 0,5°C bei -10° bis +85°C
Messbereich Feuchte:keine20 - 90 RH0 - 100 RHkeine
Versorgungsspannung:-0,2 bis +35 VDC 3,3 bis 5,5 VDC3,3 bis 5,5 VDC3,3 bis 5 VDC
Größe (L x B x H):5 (20) x 4 x 5mm16 (24) x 13 x 6mm20 (33) x 5 x 8mm5 (20) x 4 x 5mm
Amazon-Preis:*3,94 EUR4,29 EURPreis nicht verfügbar6,99 EUR
Bei Amazon kaufenBei Amazon kaufenBei Amazon kaufenBei Amazon kaufen

Der LM35 am Arduino

Beim LM35 handelt es sich um einen analogen Temperatursensor. Im Gegensatz zu digitalen Sensoren liefert der Sensor temperaturabhängig eine Ausgangsspannung, die über den analogen Eingang des Arduino gemessen wird. Eine Formel rechnet die Spannung in eine Temperatur um. Das Problem bei analogen Temperatursensoren ist, dass sie eine Spannung abhängig von der Eingangsspannung liefern. Wenn die Versorgungsspannung des Board schwankt, zum Beispiel beim Betrieb mittels einer Batterie, schwankt somit auch die Temperaturgenauigkeit. Daher kann nur bei einer gleichbleibender Versorgungsspannung – beispielsweise durch ein Netzteil – eine konstante Temperaturgenauigkeit erreicht werden. Dies haben wir in unseren Messungen beachtet, wenn auch in den Videos ein Batteriepack zum Einsatz kam.
 

Temperaturgenauigkeit des LM35 erhöhen:

Prinzipiell sollte man sich nie auf nur einen Messwert verlassen, wenn man beabsichtigt, temperaturabhängige Aktionen auszuführen. Hier bieten sich mehrere Messungen hintereinander an, aus denen dann ein Durchschnitt gebildet wird. Es macht auch Sinn, extreme „Ausreißer“ in einem Messzyklus zu eliminieren.
Kalibrieren kann man den LM35, wenn man mittels eines Referenzmessgerätes die Temperatur-Differenz ermittelt und diese Ungenauigkeit im Programmcode berücksichtigt.
 

Schaltplan Arduino mit LM35

fritzing-lm35

Schritt für Schritt Anleitung: Arduino mit LM35 (Video)

Benötigte Elemente

Sketch Arduino mit LM35

//ACHTUNG: Leerstelle in Include vor/nach spitzer Klammer entfernen!
#include < LiquidCrystal.h >

//LCD Display
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

#define sensorPin 0 // LM35 auf Ausgang A0 (analog) setzen

void setup() {
lcd.begin(16, 2);
}

void loop(){

int rawvoltage = analogRead(sensorPin);
float millivolts = (rawvoltage/1024.0) * 5000;
float celsius = millivolts/10;

lcd.setCursor(0, 0);
lcd.print("Temperatur:");

lcd.setCursor(11, 0);
lcd.print(celsius);

//Warte
delay(2000);
}

Messwerte des LM35

 Startnach 1 Minutenach 5 Minutennach 10 Minuten
LM3526,37 °C21,48 °C20,02 °C20,00 °C
Referenz19,7 °C19,9 °C20,3 °C19,5 °C
Abweichung6,67 °C1,58 °C-0,28 °C0,5 °C

 Startnach 1 Minutenach 5 Minutennach 10 Minuten
LM356,84 °C6,84 °C6,84 °C4,88 °C
Referenz6,2 °C6,3 °C6,4 °C2,2 °C
Abweichung0,64 °C0,54 °C0,44 °C2,68 °C

 Startnach 1 Minutenach 5 Minutennach 10 Minuten
LM3528,81 °C31,74 °C34,18 °C36,13 °C
Referenz28,4 °C28,2 °C28,5 °C28,5 °C
Abweichung0,41 °C3,54 °C5,68 °C7,63 °C

Der DHT11 am Arduino

Im Gegensatz zu den Sensoren LM35 und DS18B20 ermitteln die Temperatursensoren DHT11 und 22 auch die Luftfeuchtigkeit. Diese geben wir auf unserem LCD Display aus, werden die Werte aber nicht weiter hinterfragen.
Grundsätzliche Unterschiede der folgenden Sensoren zum LM35 ist der, dass diese Sensoren nun die Daten digital über einen Datenbus übertragen (1-Wire Protocol).  Ausführlicher werden wir uns beim DS18B20 mit dem 1-Wire-Protocol beschäftigen.

Meist wird der DHT11 wie in unserem Beispiel in einer 4-Pin-Version geliefert. Es sind jedoch auf Versionen mit einem Breakout-Board erhältlich, die nur die notwendigen drei Pins besitzen. Für unsere Zwecke sind beide Versionen nutzbar.

Schaltplan Arduino mit DHT11

fritzing-dht11

Schritt für Schritt Anleitung: Arduino DHT11 (Video)

Benötigte Elemente

Sketch Arduino mit DHT11

//ACHTUNG: Leerstelle in Include vor/nach spitzer Klammer entfernen!
#include < LiquidCrystal.h >

//LCD Display
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//Adafruit DHT library https://github.com/nethoncho/Arduino-DHT22/tree/a655c6299b019cf53173139dad824466486591c8
#include "DHT.h"
#define DHTPIN 8 // Ich nutze Digital-PIN 8
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

void setup() {
lcd.begin(16, 2);
}

void loop() {

//Warte
delay(2000);

//Lese die Luftfeuchtigkeit
float h = dht.readHumidity();

// Lese die Temperatur in Celsius
float t = dht.readTemperature();

lcd.setCursor(0, 0);
lcd.print("Temperatur:");
lcd.setCursor(0, 1);
lcd.print("Humidity:");

lcd.setCursor(11, 0);
lcd.print(t);
lcd.setCursor(11, 1);
lcd.print(h);
}

Messwerte des DHT11

 Startnach 1 Minutenach 5 Minutennach 10 Minuten
DHT1123,0 °C21,0 °C20,0 °C20,0 °C
Referenz17,9 °C17,8 °C17,6 °C17,3 °C
Abweichung5,1 °C3,2 °C2,4 °C2,7 °C

 Startnach 1 Minutenach 5 Minutennach 10 Minuten
DHT118,0 °C9,0 °C8,0 °C9,0 °C
Referenz6,1 °C6,0 °C5,3 °C5,7 °C
Abweichung1,9 °C3,0 °C2,7 °C3,3 °C

 Startnach 1 Minutenach 5 Minutennach 10 Minuten
DHT1129,0 °C29,0 °C29,0 °C30,0 °C
Referenz29,5 °C28,3 °C29,2 °C28,8 °C
Abweichung-0,5 °C0,7 °C-0,2 °C1,2 °C

Der DHT22 am Arduino

Der DHT22 hat eine gewisse Ähnlichkeit mit dem DHT11. Doch schon beim Blick auf die technischen Daten zeigt sich, dass hier deutliche Unterschiede bestehen. Der DHT 11 hat laut Herstellerangaben einen Temperaturbereich von 0 bis 50 Grad Celsius bei einer Abweichung von +/- 2 Grad. Der DHT22 misst dagegen zwischen -40 und +80 Grad Celsius bei einer Abweichung von +/- 0,5 Grad Celsius. Dieser Vorteil schlägt sich auch im Preis nieder. Je nach Bezugsquelle ist der DHT22 rund zwei Euro teurer.
Auch der Messbereich der Luftfeuchtigkeit, die in diesem Test nicht weiter betrachtet wird, ist gegenüber dem DHT11 deutlich höher und genauer.
 

Der DHT22 am Arduino
Der DHT22: Der Sensor hat vier Pins, wovon jedoch nur drei genutzt werden. Links im Bild die Bauart mit Platine. Bei dieser Version werden nur die notwenigen drei Pins aus der Platine herausgeführt. Auch ist bei dieser Bauart kein Vorwiderstand mehr notwendig.

Video: Schritt für Schritt Anleitung: Arduino DHT22

Benötigte Elemente

Schaltplan Arduino mit DHT22

fritzing-dht22

Sketch Arduino mit DHT22

//ACHTUNG: Leerstelle in Include vor/nach spitzer Klammer entfernen!
#include < LiquidCrystal.h >
//LCD Display
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//Adafruit DHT library https://github.com/nethoncho/Arduino-DHT22/tree/a655c6299b019cf53173139dad824466486591c8
#include "DHT.h"
#define DHTPIN 8 // Ich nutze Digital-PIN 8
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE);

void setup() {
lcd.begin(16, 2);
}

void loop() {

//Warte
delay(2000);

// Lese die Luftfeuchtigkeit
float h = dht.readHumidity();

// Lese die Temperatur in Celsius
float t = dht.readTemperature();

lcd.setCursor(0, 0);
lcd.print("Temperatur:");
lcd.setCursor(0, 1);
lcd.print("Humidity:");

lcd.setCursor(11, 0);
lcd.print(t);
lcd.setCursor(11, 1);
lcd.print(h);
}

Messwerte des DHT22

 Startnach 1 Minutenach 5 Minutennach 10 Minuten
DHT2221,3 °C19,8 °C18,1 °C17,6 °C
Referenz17,2 °C17,2 °C17,1 °C17,6 °C
Abweichung4,1 °C2,6 °C1,0 °C0,0 °C

 Startnach 1 Minutenach 5 Minutennach 10 Minuten
DHT227,8 °C7,6 °C7,8 °C7,9 °C
Referenz7,2 °C7,6 °C7,7 °C7,9 °C
Abweichung0,6 °C0,0 °C0,1 °C0,0 °C

 Startnach 1 Minutenach 5 Minutennach 10 Minuten
DHT2228,6 °C28,3 °C29,1 °C29,4 °C
Referenz28,5 °C28,6 °C29,0 °C29,2 °C
Abweichung0,1 °C-0,3 °C0,1 °C0,2 °C

Arduino mit 4x DHT22: Es ist möglich, mehrere DHT22 an einem Arduino anzuschließen

4x DHTL Temperatursensor am Arduiuno
Kann an einen Arduino mehr als ein Temperatursensor angeschlossen werden? In diesem Beispiel haben wir vier DHT22 (3-polige Version) an den Arduino angeschlossen. Die Temperatursensoren werden mit Spannung (rot/blau, äußere Pins) versorgt. Der mittlere Pin (gelbes Kabel) dient zur Datenübertragung.

Für einen Testhaben wir vier DHT22-Sensoren an einen Arduino angeschlossen. Ziel war es herauszufinden, ob man einerseits mehrere Temperatursensoren anschließen kann, aber auch , wie sich die Sensoren verhalten. Im Test zeigte sich, dass die Werte, die wir auf unserem Display ablesen können, durchaus vergleichbar und akzeptabel sind. Die Temperatur und Luftfeuchtigkeit wich jeweils nur um wenige Zehntel voneinander ab.

In einem weiteren Test wollten wir herausfinden, ob die Kabellänge zwischen Arduino und Temperatursensor Einfluss auf die Anzeige hat. Wir haben zwei Sensoren mit einem selbstgelöteten Kabel verbunden (Sensor 1 und 2). Sensor 3 und 4 sind auf dem Steckboard verblieben. Sensor 1 wurde mit einem 1,5 Meter langen Kabel verbunden. Sensor 2 mit einer Kabellänge von drei Metern. Die angezeigten Messwerte waren alle in der bisher gewohnten Toleranz.

Sicherlich ist es interessant zu prüfen, ob ein Sensor auch bei einem 10, 20 oder gar 30 Meter langen Anschlusskabel funktioniert. Dies werden wir bei Gelegenheit nachholen.

Wie viele Temperatursensoren kann man an einen Arduino anschließen?

Die einfache Antwort: So viele, wie es freie Digitalports am Arduino gibt. Abzuziehen sind der Port 0 und 1 sowie die Ports, die ggfls. durch ein Display belegt werden.

Zur Anzeige nutzen wir ein SSD1306 OLED 7Pin-Display (128*64). Dieses Display ist zwar klein, doch kann sehr viel mehr angezeigt werden, als auf dem oben verwendeten Hitachi-kompatiblem Display. Das SSD1306 Display ist auch als 4-Pin-Version erhältlich, was die Verkabelung noch einmal deutlich reduziert.

Der DS18B20 am Arduino

Auch wenn die Äußerlichkeiten zwischen dem LM35 und dem DS18B20 nicht von der Hand zu weisen sind, unterscheiden sich die Sensoren grundlegend. Bei einem Blick auf das Schaltbild fällt auf, dass der DS18B20 nicht am analogen Pin, wie der LM35, sondern an einem digitalen Pin angeschlossen wird. Analoge Temperatursensoren liefern temperatur- und eingangsspannungsabhängig eine Zielspannung zurück. Diese Spannung wird gemäß Spezifikation in einen Temperaturwert umgerechnet. Durch schwankende Versorgungsspannungen des Arduino treten bei analogen Sensoren dadurch Ungenauigkeiten auf. Diese Ungenuigkeit tritt bei einem digitalen Sensor nicht auf. Auch die Kabellänge zum Sensors ist bei einem digitalen Temperatursensor nicht mehr so stark begrenzt, wie bei einem analogen Sensor. Somit ist dieser Sensor der optimale Kandidat, wenn ständig mehrere unterschiedliche Messungen vorgenommen werden sollen. Des Weiteren ist dieser Sensor recht günstig und sogar in einer wasserdichten Version zu haben. Diese Vorteile sprechen für die Beliebtheit, die dem DS18B20 widerfährt.

In unserem Testaufbau installieren wir den Sensor im sogenannten „normal mode“. Hier werden drei Kabel zum Anschluss benötigt. Im sogenannten „parasitären Modus“ („parasite mode“) reichen zwei Kabel für den Anschluss. Der Sensor wird dann über die Datenleitung im Strom versorgt. Wenn mehr als ein Sensor an ein Board angeschlossen werden und auch die Länge der Versorgungsleitung länger als in unserem Test sein soll, ist der „normal mode“ von Vorteil.

Das zugrunde liegende 1-Wire-Protokoll ist relativ kompliziert. Dankenswerter Weise gibt es die entsprechende Bibliothek „MAX31850 DallasTemp“, die über den Library-Manager der Arduino-Programmierumgebung installiert werden kann.
 

Schritt für Schritt Anleitung: Arduino DS18B20 (Video)

Benötigte Elemente

Schaltplan Arduino mit DS18B20

fritzing-ds18b20

Sketch Arduino mit DS18B20

//ACHTUNG: Leerstelle in Include vor/nach spitzer Klammer entfernen!
#include < OneWire.h >
#include < DallasTemperature.h >
#include < LiquidCrystal.h >

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const unsigned long Baud_Rate = 9600;
const unsigned char One_Wire_Bus = 8;

OneWire oneWire(One_Wire_Bus);
DallasTemperature sensoren(&oneWire);

int Anzahl_Sensoren = 0;

void setup() {
//LCD vorbereiten
lcd.begin(16, 2);

sensoren.begin();
Serial.begin(Baud_Rate);

//Hier schauen wir, wieviel Sensoren angeschlossen sind
Anzahl_Sensoren = sensoren.getDeviceCount();
}

void loop() {
//Warte
delay(2000);

sensoren.requestTemperatures();

//Hier lesen wir den ersten Sensor (0) aus
float temperatur = sensoren.getTempCByIndex(0);

lcd.setCursor(0, 0);
lcd.print("Temperatur:");
lcd.setCursor(0, 1);
lcd.print("Anzahl Sens.:");

lcd.setCursor(11, 0);
lcd.print(temperatur);
lcd.setCursor(15, 1);
lcd.print(Anzahl_Sensoren);
}

Messwerte des DS18B20

 Startnach 1 Minutenach 5 Minutennach 10 Minuten
DS18B2024,81 °C22,19 °C21,25 °C21,1 °C
Referenz20,8 °C20,8 °C21,1 °C21,12 °C
Abweichung4,01 °C1,39 °C0,15 °C-0,02 °C

 Startnach 1 Minutenach 5 Minutennach 10 Minuten
DS18B206,44 °C6,5 °C6,56 °C6,56 °C
Referenz5,0 °C5,1 °C5,2 °C5,6 °C
Abweichung1,44 °C1,4 °C1,36 °C0,96 °C

 Startnach 1 Minutenach 5 Minutennach 10 Minuten
DS18B2033,13 °C30,69 °C28,69 °C30,25 °C
Referenz30,6 °C31,8 °C34,9 °C33,3 °C
Abweichung2,53 °C-1,11 °C-6,21 °C-3,05 °C

Fazit

Leider können wir keinen eindeutigen Sieger küren. Der LM35 mag für viele Anwendungen reichen, hat uns aber nicht überzeugt. Gleiches gilt für den digitalen DHT11. Hier würden wir in jedem Fall auf den DHT22 zurückgreifen, der zwar deutlich teurer, aber auch genauere Ergebnisse liefert. Eine Sonderstellung nimmt der DS18B20 ein. Im 10´er Pack, direkt aus China geliefert, ist dieser Sensor für rund fünf Euro zu haben. Seine Messgenauigkeit reicht zwar nicht an die des DHT22, doch wenn auch auf die Messung der Feuchte verzichtet werden kann, sollte dieser Temperatursensor für die meisten Anwendungen genügen.

2 Gedanken zu „Temperaturmessung mit dem Arduino“

  1. Hallo,

    danke für den Bericht. Aber ich habe eine Frage für euch, ist es möglich mehrere Temp.sensoren zu erfassen und in einer Editor- oder Excel Datei die Messdaten speichern ? wenn, wie soll es funktionieren ?

    Danke im Voraus 🙂
    Gruß

    Antworten
  2. Thanks! The sketch for DHT22 LC UNO is working perfectly. The info about the accuracy of the sensors is also very good.

    Antworten

Schreibe einen Kommentar

87 − 80 =