Mittlerweile haben sich einige Temperatursensoren für ESP32 und Arduino bei mir angesammelt. Zeit für einen Vergleich, ob die Sensoren ähnliche Werte liefern. Bei der Programmierung des CO2-Sensors MH-Z19B war aufgefallen, dass dessen Temperaturmessungen im Vergleich mehrere Grad über denen anderer Sensoren lagen. Auch die zum Vergleich genutzten Sensoren lieferten Werte, die tlw. um mehr als 1°C voneinander abwichen.
Also schien ein Vergleich der Umweltsensoren mit Temperaturmessung, die im Lauf der Zeit in meiner Bauteile-Sammlung gelandet sind, sinnvoll. Die meisten Sensoren messen mehrere Daten und arbeiten z.B. auch als Luftfeuchtigkeitssensor. Neben sechs Exemplaren des reinen Temperatursensors DS18B20 sind DHT11 und DHT22, AM2320, SHT20, AHT20 und BMP280 Bestandteil des Vergleichs. Außer Konkurrenz lief der DS3231 – ein Echtzeituhr-Modul, bei dem die Temperaturmessung eher als Zugabe zu betrachten ist.
Das Teilnehmerfeld: 13 Sensoren für ESP32 und Arduino
Die meisten Sensoren habe ich bereits im Blog vorgestellt und mit dem ESP32 oder einem Arduino Nano eingesetzt. Folgende Bauelemente sind auf dem Breadboard gelandet:
- DHT11 und DHT22 (im Bild rechts die Nummern 1 und 2) – zwei verbreitete Temperatur- und Luftfeuchtigkeitssensoren als Module
- SHT20 (3) – Sensormodul mit I2C-Anschluss (Messung von Temperatur und Luftfeuchtigkeit)
- AM2320 (4) – Sensor mit I2C-Anschluss (Temperatur und Luftfeuchtigkeit)
- DS18B20 – ein häufig verwendeter Temperatursensor; dreimal als einfacher Sensor (also im TO92-Kunststoffgehäuse mit drei Anschluss-Pins; 5, 6 und 7) und dreimal in wasserdichter Edelstahlhülse mit Kabel (zweimal 9 und 11)[1]Identifiziert habe ich die Sensoren anhand ihrer eindeutigen Hardware-Adresse – eine 8 Byte lange Zeichenfolge, die immer mit 0x28 beginnt. Meine Sensoren unterscheiden sich alle an der zweiten … Continue reading
- AHT20 (10) – ein weiterer Sensor für Temperatur und Luftfeuchtigkeit mit I2C-Schnittstelle; gemeinsam mit dem BMP280 auf einem Modul verbaut
- BMP280 (10) – ein Luftdruck- und Temperatursensor (I2C-Modul gemeinsam mit dem AHT20)
- DS3231 (8) – ein Echtzeituhr-Modul mit I2C-Anschluss
Das DS3231-Modul lief „außer Konkurrenz“ mit, da der Sensor kein Umweltsensor ist, sondern dazu gedacht ist, die Ganggenauigkeit der Uhr bzw. des Schwingquarzes zu verbessern. Lt. Datenblatt[2]DS3231-Datenblatt als PDF; Angaben zur Temperaturmessung u.a. auf S. 15; Quelle: datasheets.maximintegrated.com/en/ds/DS3231.pdf soll der im Chip integrierte Temperatursensor normalerweise alle 64 Sekunden eine Messung durchführen (oder auf Benutzeranfrage), und die Auflösung ist mit Schritten von 0,25°C die gröbste im Feld.
Aufbau auf dem Breadboard
Soweit möglich wurden die Sensoren direkt auf ein Breadboard gesteckt. Alle Sensoren mit I2C-Schnittstelle waren mit den Standard-Pins eines ESP32 (DevKitC V4) verbunden: SDA an GPIO 21, SCL an GPIO 22.
Die DS18B20 nutzten eine gemeinsame Datenleitung. Zwei der kabelgebundenen Sensoren waren mit Schraubklemmen angeschlossen, beim dritten sind Drähte an die Kabelenden gelötet, sodass er direkt eingesteckt werden konnte. Damit die Messfühler der Sensoren mit Kabel sich nicht zu weit weg von den anderen Sensoren befanden, wurden die Kabel aufgerollt unter dem Breadboard platziert, ohne dass das Breadboard die Messfühler verdeckte.
Die DS3231-Echtzeituhr und der AHT20-BMP280-Kombisensor haben keine Anschlusspins – sie wurden „fliegend” mit Dupont-Kabeln angeschlossen.
Auswertung
Die Sensoren wurden alle 10 Sekunden abgefragt und die Werte für Temperatur und Luftfeuchtigkeit gespeichert. Die Messungen liefen über gut zwei Tage (knapp 52 Stunden) – insgesamt sind so je Sensor gut 18.200 Messwerte zusammengekommen.
Der DHT22 hat sechsmal keine Messwerte geliefert – alle in einem Zeitraum von 24 Minuten. Beim AM2320 fehlte ein Messwert.
Die in den Diagrammen eingezeichnten Mittelwerte wurden ohne den DS3231 berechnet.
Beim Temperatur- und Luftfeuchtigkeitssensor AHT20 konnte ich keine Werte für die Luftfeuchtigkeit auslesen – der Sensor lieferte immer »0,0«. Auch beim Betrieb an einem Arduino Nano-Nachbau änderte sich daran nichts. Ob der Sensor defekt ist oder ob es an der verwendeten Programmbibliothek[3]Adafruit AHTx0; github.com/adafruit/Adafruit_AHTX0 liegt, versuche ich noch herauszufinden. Aus dem Vergleich der Luftfeuchtigkeitssensoren fiel der AHT20 damit heraus.
[Nachtrag vom 02.02.2021: Der Sensor scheint defekt zu sein. Auch mit zwei anderen Bibliotheken (Seeed_Arduino_AHT20 und SparkFun_Qwiic_Humidity_AHT20) änderte sich weder am ESP32 noch am Arduino Nano etwas – die Messung der Temperatur funktioniert, die der Luftfeuchtigkeit nicht.]
Diagramm: Temperatursensoren
Im Diagramm über den kompletten Zeitraum ist gut zu erkennen, wie nachts die Temperatur absinkt oder wie beim Lüften in kurzer Zeit die Temperatur etwas stärker heruntergeht. Die Spitze nach unten im linken Bildviertel resultiert daraus, dass die Schaltung ein paar Minuten direkt am offenen Fenster stand; dabei ging die Temperatur auf unter 12°C herunter. Damit mehr Platz für die „normalen” Messwerte bleibt, habe ich diesen Teil im Diagramm abgeschnitten.
Um die einzelnen Sensoren etwas besser auseinanderhalten zu können, sind hier die Messwerte eines Ausschnitts von vier Stunden separat dargestellt.
Diagramm: Luftfeuchtigkeitssensoren
Mehrere Module enthalten einen Luftfeuchtigkeitssensor, deshalb habe ich diese Daten ebenfalls gemessen und verglichen. Auch hier sieht man im Diagramm, wann es kühler wird: Da sich die absolute Luftfeuchtigkeit nur wenig ändert, steigt die relative Luftfeuchtigkeit (RF; relative Feuchte) beim Sinken der Temperatur, denn kühlere Luft kann weniger Feuchtigkeit aufnehmen.
Da der DHT11 nur ganzzahlige Werte liefert (keine Nachkommastellen), machen sich Änderungen, die sich nicht sofort stabilisierten, als Zickzack und damit als flächige Darstellung im Diagramm bemerkbar – ähnlich wie bei den Temperaturwerten.
Ergebnis – Sensoren im Vergleich
Der Temperatursensor im DS3231-Modul war der Ausreißer nach oben. Wie oben geschrieben: Das Modul wird nicht als Umweltsensor verkauft, sondern als Echtzeituhr. Es bewegte sich immer im Bereich der im Datenblatt angegebenen Genauigkeit von ±3°C und ist also nicht zu beanstanden (kann aber keinen „richtigen” Temperatursensor ersetzen).
Auch der DHT11 lag im Diagramm ziemlich weit oben – ca. 1°C über dem Mittelwert. Man sieht auch, dass seine Messwerte leicht schwankten: Zwischen aufeinander folgenden Messungen lagen sehr oft 0,2-0,3 Grad nach oben oder unten. Im Ausschnitts-Diagramm erkennt man deutlich die dunkelrote Zickzacklinie, im Gesamt-Diagramm entstand daraus ein dunkelroter, gezackter Streifen.
Auch die Messwerte des SHT20 (hell-orange) und eines DS18B20 mit Kabel (grün) lagen i.d.R. mehr als ein halbes Grad über dem Mittelwert.
Ausreißer nach unten bei den Temperatursensoren war einer der DS18B20 mit Kabel: Die blassgrüne Linie lag meist mehr als ein halbes Grad unter der nächstniedrigeren Messung und etwa ein bis eineinhalb Grad unter dem Mittelwert. Auch die beiden nächsten Messreihen (dunkelblaue und gelbe Linien) gehören zu DS18B20 (diesmal im TO92-Gehäuse).
Der dritte DS18B20-Sensor im TO92-Gehäuse (hellblau) lag zusammen mit dem AHT20 (mittelblau) wenige Zehntel Grad unter dem Mittelwert. Sehr dicht am Mittelwert waren der DHT22 (graue Linie) und der BMP280 (hellrot), ein anderer DS18B20 mit Kabel (orange) und der AM2320 (violett).
Bei der Messung der Luftfeuchtigkeit zeigte der Vergleich, dass der AM2320 permanent deutlich niedrigere Werte als die anderen Sensoren maß.
Um diese optischen Eindrücke aus den Diagrammen zu prüfen, habe ich ergänzend ein paar Zahlen berechnet:[4]Siehe Wikipedia: Mittlere absolute Abweichung vom arithmetischen Mittel und Mittlere quadratische Abweichung
- die mittlere absolute Abweichung vom Mittelwert (also der durchschnittlichen Betrag, um den der Sensor vom Mittelwert abweicht, egal ob nach oben oder unten)
- die mittlere quadratische Abweichung vom Mittelwert; hierbei fallen größere Abweichungen (und Ausreißer) deutlich stärker ins Gewicht als kleine
Temperatursensor | mittl. absolute Abweichung | mittl. quadratische Abweichung |
---|---|---|
AHT20 | 0,15 | 0,04 |
AM2320 | 0,19 | 0,05 |
DS18B20 (0xFF; TO92) | 0,24 | 0,06 |
BMP280 | 0,23 | 0,07 |
DHT22 | 0,25 | 0,09 |
DS18B20 (0x48; Kabel) | 0,34 | 0,15 |
DS18B20 (0xFA; TO92) | 0,47 | 0,23 |
DS18B20 (0xB0; Kabel) | 0,40 | 0,25 |
SHT20 | 0,51 | 0,36 |
DS18B20 (0xC7; TO92) | 0,76 | 0,59 |
DHT11 | 0,62 | 0,63 |
DS18B20 (0x91; Kabel) | 1,22 | 1,58 |
DS3231 | 1,68 | 2,92 |
Luftfeuchtigkeitssensor | mittl. absolute Abweichung | mittl. quadratische Abweichung |
---|---|---|
DHT22 | 0,23 | 0,08 |
SHT20 | 0,64 | 0,54 |
DHT11 | 0,58 | 0,64 |
AM2320 | 0,92 | 1,03 |
Fazit
Aus den Messungen zu schließen, dass AHT20, DHT22 und BMP280 die genauesten Sensoren sind, wäre nicht angebracht. Da ich kein geeichtes Thermometer und Hygrometer habe und erst recht keine Laborbedingungen zum Messen, sagen diese Messungen nichts darüber aus, welcher Sensor „richtig” misst. Der Mittelwert ist nur ein schwacher Ersatz für einen exakten Referenzwert. Zum anderen können auch Sensoren eines Modells relativ weit streuen, wie man an den DS18B20 sieht. Zu den DS18B20 lässt sich insgesamt sagen, dass sie eher etwas niedrigere Temperaturwerte messen als die kombinierten Sensoren.
Der AM2320 misst anscheinend die Temperatur sehr genau, weicht aber bei der relativen Luftfeuchtigkeit deutlich von den anderen Sensoren ab. Ich habe noch einen anderen AM2320 (anderweitig) in Benutzung, der sich ähnlich zu verhalten scheint. Bei ein paar Überprüfungen der Werte scheint er bei den Temperaturen im Mittelbereich zu liegen, bei der Luftfeuchtigkeit aber eher 3-4 Prozentpunkte (und mehr) unterhalb der anderen Sensoren.
Bis auf einen DS18B20 liegen die Temperatursensoren meist im Bereich von deutlich weniger als ±1°C um den Mittelwert, also relativ dicht beieinander. Für hobbymäßige Anwendungen reicht das nach meiner Meinung gut aus. Präzisions-Messinstrumente kann man bei einem Stückpreis von 1 € für die einfachen DS18B20 bis zu etwa 5 € für einen DHT22 auch nicht unbedingt erwarten.
Zwei Sensoren halte ich nach den Messungen für weniger empfehlenswert als die anderen: Beim DHT11 stören mich die schwankenden Messwerte und die deutliche Abweichung nach oben bei der Temperaturmessung
, bei den AM2320 die zu niedrigen Messwerte bei der relativen Luftfeuchtigkeit. Mangelnde Genauigkeit scheint ein generelles Problem der AM2320-Sensoren zu sein – auch der kommerzielle Anbieter Adafruit, der nicht nur Geräte entwickelt und viele – auch hier im Blog genutzte – Bibliotheken als Open Source zur Verfügung stellt, sondern natürlich die angebotene Hardware verkaufen will, platziert in der Produktbeschreibung einen entsprechenden Hinweis.
Beim DHT11 könnte man das Zickzack-Verhalten etwas abmildern, indem man kurz nacheinander mehrere Messungen macht und nur den Mittelwert weiter verwendet.[5]Das Datenblatt zum DHT11 empfiehlt mind. 2 Sekunden Abstand zwischen den Messungen. Wenn man z.B. nur jede Minute oder seltener einen Messwert benötigt, könnte man zu Beginn des Messintervalls … Continue reading Das Problem der zu hohen Messwerte kriegt man damit aber nicht in den Griff.
Der Vergleich zeigt, dass vermutlich keiner der Sensoren den tatsächlichen Wert von Temperatur oder Luftfeuchtigkeit trifft. Bevor man damit also z.B. eine Steuerung zur Heizung oder Belüftung seines Treibhauses, Aquariums, Terrariums etc. aufbaut, würde ich erst einmal eine Zeit lang die Sensorwerte mit einem anderen Messgerät vergleichen, z.B. einem Thermometer, auf dessen Werte man sich bisher verlassen hat. Wenn man weiß, dass der Sensor in dem üblichen Temperaturbereich z.B. immer ca. 1°C mehr anzeigt als das Thermometer (das in diesem Fall den Referenzwert liefert), kann man das bei der Programmierung einer Temperatursteuerung entsprechend berücksichtigen.
Im Blog gibt es auch eine Seite mit einer Vergleichstabelle einiger technischer Daten der Temperatur- (und Luftfeuchtigkeits-)Sensoren. Dort und in den Beiträgen zu den einzelnen Sensoren sind die jeweiligen Datenblätter verlinkt.
03.04.2021: Ergänzungen im Fazit zum AM2320 und zum Einsatz bei Steuerungen (Orientierung an Referenzwert)
Fußnoten
1↑ | Identifiziert habe ich die Sensoren anhand ihrer eindeutigen Hardware-Adresse – eine 8 Byte lange Zeichenfolge, die immer mit 0x28 beginnt. Meine Sensoren unterscheiden sich alle an der zweiten Stelle, deshalb habe ich diese als Kennung verwendet. |
---|---|
2↑ | DS3231-Datenblatt als PDF; Angaben zur Temperaturmessung u.a. auf S. 15; Quelle: datasheets.maximintegrated.com/en/ds/DS3231.pdf |
3↑ | Adafruit AHTx0; github.com/adafruit/Adafruit_AHTX0 |
4↑ | Siehe Wikipedia: Mittlere absolute Abweichung vom arithmetischen Mittel und Mittlere quadratische Abweichung |
5↑ | Das Datenblatt zum DHT11 empfiehlt mind. 2 Sekunden Abstand zwischen den Messungen. Wenn man z.B. nur jede Minute oder seltener einen Messwert benötigt, könnte man zu Beginn des Messintervalls 5 Messungen im 2-Sekunden-Abstand machen – dann kann man nach 8 Sekunden einen etwas verlässlicheren Mittelwert berechnen. |
Themenverwandte Beiträge
Typische 7-Segment-Anzeigen bestehen aus sieben LEDs (meist plus einer weiteren für den Dezimalpunkt...
LittleFS ist ein Dateisystem für den Flash-Speicher verschiedener Mikrocontroller. Auf den ESP-Contr...
Der HC-SR501 ist ein sog. PIR-Bewegungssensor - „PIR” steht dabei für pyro-elektrischer (auch: passi...
Der BH1750 ist ein Sensor zum Messen der Stärke des Umgebungslichts. Er misst die Beleuchtungsstärke...
Danke für die Mühe und das Veröffentlichen der Werte.
Sehr gute und verständlich strukturierte Zusammenfassung. Der wissenschaftliche Schreibstil gefällt mir sehr. Vielen Dank für deinen Beitrag!
Vielen Dank dir und der/dem Verfasserer*in des vorigen Kommentars für das positive Feedback! 🙂
Hallo Heiko, ich bin gerade zufällig auf Deiner Seite gelandet. Ich bin auch gerade am Testen bzw. am wundern, warum meine Sensoren so stark abweichen. Zwei BME280 weichen bei Temperaturen erheblich ab. Der Luftdruck ist auf 1hPa gleich, die Luftfeuchte 29% und 33% – und die Temperatur 22,9°C und 24,5°C !!!
Allerdings heizt auch mein ESP8266 im WLAN Betrieb und auf dem anderen Board vermutlich die LED Hintergrund-Beleuchtung. Ausgehend, daß die Wärme aufsteigt, habe ich nun eine senkrechte Position gewählt.
– Ein fertig gekautes Gerät (Netatmo) zeigt 22,5°C an!
Mal sehen was geschieht!
By the Way: Ein DHT21 (AM2301) hat mehr als 1.5°C gerauscht – Blocken der Versorgungsspannung hat so gut wie nichts geholfen! Beim DHT22 wird auch ein 100nF Blockkondensator empfohlen. Der hat das Rauschen auch etwas verbessert, Wobei dieser Sensor deutlich besser als der AM2301 ist! In “ESPhome” ist auch eine SW-digitale Filterung mit sehr guten Eigenschaften möglich.
Mega gutes Projekt 🙂
Hatte ich auch schonmal überlegt, aber jetzt konnte ich hier alles schön übersichtlich nachlesen.
Danke auch für deine anschauliche Darstellung für deine Installation des MHZ19, darüber bin ich hier überhaupt gelandet.
Fantastische Arbeit. Trotz aller genannten Einschränkungen ein sehr guter Leitfaden und exzellente Informationsquelle. Respekt, wer sich so viel Mühe gibt.
Auch ich habe mich damit beschaeftigt und bin ueber ein hochpraezises Instrument im Eigenbau von M. Fulde gestossen(Hygrotherm). Der benutzt einen SHT85 Sensor (hochpraezise) der von einem AVR ATmega16-16PU gesteuert wird (in Eigenprogrammierung). Zu sagen waere hier das ein Miniluefter zum Anblasen benutzt wird, da kaum verlaessliche Werte moeglich sind mit einem nur dastehenden Sensor.
http://www.kleinmaeusiges.de/html/menue/elektronik/frameset_projektemygeigerlecontent.html