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: 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
Schritt für Schritt Anleitung: Arduino mit LCD Display (Video)
Benötigte Elemente
- HD44780 1602 LCD Module Display
- Original Arduino Uno Rev.3 oder UNO-R3 Rev3 Arduino kompatibles Board
- Nettes Set mit Potis, Widerständen und Schaltern
- Steckboard (Breadboard) oder als Set: Breadboard + Kabelbrücken
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)
Typ | LM35 | DHT11 | DHT22 | DS18B20 |
---|---|---|---|---|
Temperaturbereich: | -40 bis +110 °C | 0 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: | keine | 20 - 90 RH | 0 - 100 RH | keine |
Versorgungsspannung: | -0,2 bis +35 VDC | 3,3 bis 5,5 VDC | 3,3 bis 5,5 VDC | 3,3 bis 5 VDC |
Größe (L x B x H): | 5 (20) x 4 x 5mm | 16 (24) x 13 x 6mm | 20 (33) x 5 x 8mm | 5 (20) x 4 x 5mm |
Amazon-Preis:* | Preis nicht verfügbar | 4,99 EUR | 9,99 EUR | 7,99 EUR |
Bei Amazon kaufen | Bei Amazon kaufen | Bei Amazon kaufen | Bei 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
Schritt für Schritt Anleitung: Arduino mit LM35 (Video)
Benötigte Elemente
- 5 x LM 35 DZ Temperatur Sensor / Digital Thermometer
- Original Arduino Uno Rev.3 oder UNO-R3 Rev3 Arduino kompatibles Board
- Nettes Set mit Potis, Widerständen und Schaltern
- Steckboard (Breadboard) oder als Set: Breadboard + Kabelbrücken
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
Start | nach 1 Minute | nach 5 Minuten | nach 10 Minuten | |
---|---|---|---|---|
LM35 | 26,37 °C | 21,48 °C | 20,02 °C | 20,00 °C |
Referenz | 19,7 °C | 19,9 °C | 20,3 °C | 19,5 °C |
Abweichung | 6,67 °C | 1,58 °C | -0,28 °C | 0,5 °C |
Start | nach 1 Minute | nach 5 Minuten | nach 10 Minuten | |
---|---|---|---|---|
LM35 | 6,84 °C | 6,84 °C | 6,84 °C | 4,88 °C |
Referenz | 6,2 °C | 6,3 °C | 6,4 °C | 2,2 °C |
Abweichung | 0,64 °C | 0,54 °C | 0,44 °C | 2,68 °C |
Start | nach 1 Minute | nach 5 Minuten | nach 10 Minuten | |
---|---|---|---|---|
LM35 | 28,81 °C | 31,74 °C | 34,18 °C | 36,13 °C |
Referenz | 28,4 °C | 28,2 °C | 28,5 °C | 28,5 °C |
Abweichung | 0,41 °C | 3,54 °C | 5,68 °C | 7,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
Schritt für Schritt Anleitung: Arduino DHT11 (Video)
Benötigte Elemente
- DHT11
- Original Arduino Uno Rev.3 oder UNO-R3 Rev3 Arduino kompatibles Board
- Nettes Set mit Potis, Widerständen und Schaltern
- Steckboard (Breadboard) oder als Set: Breadboard + Kabelbrücken
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
Start | nach 1 Minute | nach 5 Minuten | nach 10 Minuten | |
---|---|---|---|---|
DHT11 | 23,0 °C | 21,0 °C | 20,0 °C | 20,0 °C |
Referenz | 17,9 °C | 17,8 °C | 17,6 °C | 17,3 °C |
Abweichung | 5,1 °C | 3,2 °C | 2,4 °C | 2,7 °C |
Start | nach 1 Minute | nach 5 Minuten | nach 10 Minuten | |
---|---|---|---|---|
DHT11 | 8,0 °C | 9,0 °C | 8,0 °C | 9,0 °C |
Referenz | 6,1 °C | 6,0 °C | 5,3 °C | 5,7 °C |
Abweichung | 1,9 °C | 3,0 °C | 2,7 °C | 3,3 °C |
Start | nach 1 Minute | nach 5 Minuten | nach 10 Minuten | |
---|---|---|---|---|
DHT11 | 29,0 °C | 29,0 °C | 29,0 °C | 30,0 °C |
Referenz | 29,5 °C | 28,3 °C | 29,2 °C | 28,8 °C |
Abweichung | -0,5 °C | 0,7 °C | -0,2 °C | 1,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
- DHT22/AM2302 digital Sensor
- Original Arduino Uno Rev.3 oder UNO-R3 Rev3 Arduino kompatibles Board
- Nettes Set mit Potis, Widerständen und Schaltern
- Steckboard (Breadboard) oder als Set: Breadboard + Kabelbrücken
Schaltplan Arduino mit 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
Start | nach 1 Minute | nach 5 Minuten | nach 10 Minuten | |
---|---|---|---|---|
DHT22 | 21,3 °C | 19,8 °C | 18,1 °C | 17,6 °C |
Referenz | 17,2 °C | 17,2 °C | 17,1 °C | 17,6 °C |
Abweichung | 4,1 °C | 2,6 °C | 1,0 °C | 0,0 °C |
Start | nach 1 Minute | nach 5 Minuten | nach 10 Minuten | |
---|---|---|---|---|
DHT22 | 7,8 °C | 7,6 °C | 7,8 °C | 7,9 °C |
Referenz | 7,2 °C | 7,6 °C | 7,7 °C | 7,9 °C |
Abweichung | 0,6 °C | 0,0 °C | 0,1 °C | 0,0 °C |
Start | nach 1 Minute | nach 5 Minuten | nach 10 Minuten | |
---|---|---|---|---|
DHT22 | 28,6 °C | 28,3 °C | 29,1 °C | 29,4 °C |
Referenz | 28,5 °C | 28,6 °C | 29,0 °C | 29,2 °C |
Abweichung | 0,1 °C | -0,3 °C | 0,1 °C | 0,2 °C |
Arduino mit 4x DHT22: Es ist möglich, mehrere DHT22 an einem Arduino anzuschließen
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.
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
- 10 x DS18B20 Digitale Temperaturfühler
- Original Arduino Uno Rev.3 oder UNO-R3 Rev3 Arduino kompatibles Board
- Nettes Set mit Potis, Widerständen und Schaltern
- Steckboard (Breadboard) oder als Set: Breadboard + Kabelbrücken
Schaltplan Arduino mit 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
Start | nach 1 Minute | nach 5 Minuten | nach 10 Minuten | |
---|---|---|---|---|
DS18B20 | 24,81 °C | 22,19 °C | 21,25 °C | 21,1 °C |
Referenz | 20,8 °C | 20,8 °C | 21,1 °C | 21,12 °C |
Abweichung | 4,01 °C | 1,39 °C | 0,15 °C | -0,02 °C |
Start | nach 1 Minute | nach 5 Minuten | nach 10 Minuten | |
---|---|---|---|---|
DS18B20 | 6,44 °C | 6,5 °C | 6,56 °C | 6,56 °C |
Referenz | 5,0 °C | 5,1 °C | 5,2 °C | 5,6 °C |
Abweichung | 1,44 °C | 1,4 °C | 1,36 °C | 0,96 °C |
Start | nach 1 Minute | nach 5 Minuten | nach 10 Minuten | |
---|---|---|---|---|
DS18B20 | 33,13 °C | 30,69 °C | 28,69 °C | 30,25 °C |
Referenz | 30,6 °C | 31,8 °C | 34,9 °C | 33,3 °C |
Abweichung | 2,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.
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ß
Thanks! The sketch for DHT22 LC UNO is working perfectly. The info about the accuracy of the sensors is also very good.
Wirklich sehr gut erklärt! Bei mir wird auf dem Display ständig Temperatur: nan30 und Humidity:nan.0 angezeigt. Wie bekomme ich den Bug weg?