Temperaturmessung mit dem Arduino

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//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%, ±5% RH0 - 100%, ±2% 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
Preis (unverb.):3,30 EUR3,99 EUR5,69 EUR3,97 EUR (Wasserdicht)

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//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.
 

Video: Schritt für Schritt Anleitung: Arduino DHT22


 

Benötigte Elemente

 

Schaltplan Arduino mit DHT22

fritzing-dht22
 

Sketch Arduino mit DHT22

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//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

 

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//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.

VN:F [1.9.22_1171]
War dieser Testbericht informativ? Bitte bewerte den Wetterstation Test:
Rating: 4.4/5 (9 votes cast)
Temperaturmessung mit dem Arduino, 4.4 out of 5 based on 9 ratings

2 Kommentare

  1. Badre sagt:

    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ß

  2. Schango sagt:

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

Verfasse einen Kommentar

Hinweis: Es werden nur themenrelevante Kommentare veröffentlicht. Kommentare mit Links werden aufgrund von Link-Spam prinzipiell nicht veröffentlicht!