====== Vergleich Temperatur- und Feuchtigkeitsfühler ====== **(DHT11, DHT22, DHT33, DS18x20, TMP36, Thermistor / DHT11, DHT22, DHT33)** {{:sensors:all-temp-sensors-small.png?580x240|Sensor Vergleichsgraph}} Wir wollten einmal wissen, wie sich die verschiedenen Temperatur- und Luftfeuchte-Sensoren, die wir verkaufen in der Praxis vergleichen. Deshalb haben wir mit den folgenden Sensoren einen kleinen Testaufbau erstellt, Messdaten mit aufgezeichnet und diese verglichen: | __Temperatur-Sensoren:__ | __Feuchte-Sensoren:__ | | [[http://shop.boxtec.ch/product_info.php/cPath/59_39_71/products_id/40242|DHT11]] | [[http://shop.boxtec.ch/product_info.php/cPath/59_39_71/products_id/40242|DHT11]] | | [[http://shop.boxtec.ch/product_info.php/cPath/59_39_71/products_id/40371|DHT22]] | [[http://shop.boxtec.ch/product_info.php/cPath/59_39_71/products_id/40371|DHT22]] | | [[http://shop.boxtec.ch/product_info.php/cPath/59_39_71/products_id/40541|DHT33]] | [[http://shop.boxtec.ch/product_info.php/cPath/59_39_71/products_id/40541|DHT33]] | | [[http://shop.boxtec.ch/product_info.php/cPath/59_39_71/products_id/40366|DS18x20]] | | | [[http://shop.boxtec.ch/product_info.php/cPath/59_39_71/products_id/40539|TMP36]] | | | [[http://shop.boxtec.ch/product_info.php/cPath/59_39_71/products_id/40179|Thermistor (Glas und Epoxy)]] | | ===== Beschreibung der verwendeten Sensoren ===== Bevor wir alle Sensoren zusammen auf ein Breaboard quetschen, schauen wir uns doch erst mal die einzelnen Teilnehmer und wie man diesen Messwerte entlockt genauer an: ==== DHT11 ==== Der DHT11 ist ein voll digitaler und vorkalibrierter lowcost Temperatur- und Feuchte-Sensor. Sie sprechen den Sensor mit einem seriellen Onewire-Protokoll an und erhalten darauf hin digitale Messwerte zurückgeliefert. Der Sensor benötigt Speisespannung, GND und eine Datenleitung. Der DHT11 verfügt über eine maximale Auflösung von 1°C. ==== DHT22 / DHT33 ==== Diese beiden Sensoren verfügen über die gleichen Eigenschaften wie der DHT11, da Sie aber eine feinere Auflösung von 0.1 (und eine höhere Genauigkeit) aufweisen benötigen sie ein leicht anderes Protokoll und damit entweder eine andere Library oder eine die beide unterstützt. Der DHT33 setzt ausserdem im Gegensatz zu den anderen beiden DHT-Sensoren einen DS18B20 zur Temperaturmessung ein, dies zeigt sich auch deutlich in den Vergleichen der beiden Sensoren. === Anschlussbelegung DHT Sensoren === | DHT11(RHT01) | DHT22(RHT03) | DHT33(RHT04) | | {{:sensors:rht01_beschriftet.jpg?280x335|DHT11 mit Anschlussbelegung}} | {{:sensors:rht03_beschriftet.jpg?280x330|DHT22 mit Anschlussbelegung}} | {{:sensors:rht04_beschriftet.jpg?280x330|DHT33 mit Anschlussbelegung}} | === DHT Libraries === * [[http://arduino.cc/playground/Main/DHTLib|DHTLib]] (für alle DHT Sensoren) * [[http://www.ladyada.net/learn/sensors/dht.html|DHT]] von Ladyada (für alle DHT Sensoren) ==== DS18x20 ==== {{ :sensors:ds18b20_con.png|DS18B20 Anschlussbelegung}} Der DS18x20 (wobei x für [[http://www.maxim-ic.com/datasheet/index.mvp/id/2812|B]] oder [[http://www.maxim-ic.com/datasheet/index.mvp/id/2815|S]] stehen kann) ist ein sehr beliebter digitaler Temperatur Sensor Dallas Semiconductors (mittlerweile Maxim-IC), bekannt auch darum, weil sich der Sensor parasitär, also über die Datenleitung speisen kann. Der Sensor kommt also auch mit 2 Leitungen (Signal und GND) aus und nicht nur das - als weiteres Leckerli können mehrere Sensoren auf diesen 2 Leitungen als Bus, dem OneWire Bus operieren. Die DS18x20 Sensoren sind alle vorkalibriert und haben eine Genauigkeit von 0.5°C über den gesamten Messbereich bei einer Auflösung von 9-12bit. Der [[http://www.arduino.cc/playground/Learning/OneWire|Arduino Playground Artikel über OneWire]] enthält sehr viele interessante Informationen zu diesen Sensoren und dem Bus System. === Parasitäre Speisung DS18x20 === Der Einfachheit halber haben wir uns für die parasitäre Speisung entschieden, d.h. wir schliessen nur GND und DATA an, hängen DATA aber über einen 4.7KOHM Pullup Widerstand auf 5V. Für den Sketch macht es danach keinen Unterschied wie der Sensor gespiesen wird, die parasitäre Speisung hat halt einfach gewisse Grenzen was Länge der Anschlusskabel und Menge der Sensoren auf einem einzelnen Bus angeht. 2 Sensoren auf einem Bus mit ca. 10m Kabel funktionieren aber in der Praxis mit parasitärer Speisung sehr gut. Idealerweise zieht man dann VDD auf GND, um Störungen zu vermeiden, es funktioniert aber in der Praxis auch ohne sehr zuverlässig. === DS18x20 Libraries === * [[http://milesburton.com/Dallas_Temperature_Control_Library|Dallas Temperature Control Library]] von Miles Burton * [[http://www.pjrc.com/teensy/td_libs_OneWire.html|OneWire Library]] von Paul Stoffregen ==== TMP36 ==== {{ :sensors:tmp36_con.png|TMP36 Anschlussbelegung}} Der TMP36 ist ein lowcost Analog-Temperatur Sensor mit einem linearen Anstieg. D.h. die Spannung am Ausgang steigt proportional mit der Temperatur und die Temperatur kann mit einer einfachen Formel von der gemessenen Spannung abgelesen werden. Die Formel dazu lautet: (voltage - 0.5) * 100 === Signal Rauschen beim TMP36 === In unserem Aufbau mit sehr vielen Sensoren zeigte sich nach ersten Tests ein Problem mit Rauschen auf dem analogen Ausgangs des TMP36. Das Problem äusserte sich insofern, dass die berechnete Temperatur des TMP36 offensichtlich um mehrere Grade zu tief war. Eine kurze Messung mit dem [[http://shop.boxtec.ch/product_info.php/products_id/40197|DSO Nano]] ergab, dass das Signal sehr stark verzerrt war und die Messungen auf dem Analog Eingang des Arduino eher die unteren Spitzen des Rauschens als einen Durchschnitt wiedergaben. Nachdem wir den Ausgang des TMP36 mit einem [[wpde>RC-Glied|RC-Glied]] //beruhigt// hatten schienen die Messwerte auch wieder plausibler zu werden. == Prinzipschaltung Signalglättung für den TMP36 Ausgang == {{:sensors:tmp36_rc_schem.png|RC Glied zur Signalglättung}} Mit einem 10KOHM Widerstand und einem 100nF Kondensator ergibt sich eine Zeitkonstante von 1ms, d.h. die Verzögerung der Messwerte beträgt 5ms. Damit können wir in diesem Zusammenhang leben. Wenn der TMP36 alleine auf einem Breadboard verwendet wird ist diese Problematik weniger zu beachten resp. kann vernachlässigt werden. == Weiterführende Informationen zu TMP36 == * [[http://www.ladyada.net/learn/sensors/tmp36.html|Ladyada: TMP36 Howto]] ==== Thermistor ==== [[wpde>Thermistor|Thermistoren]] sind Widerstände, die Ihren Widerstand reproduzierbar analog der Temperatur ändern. Thermistoren gibts in zwei Geschmacksrichtungen: [[wpde>Heissleiter|NTC]] und [[wpde>Kaltleiter|PTC]], bezeichnet jenachdem ob ihr Widerstand mit steigender Temperatur sich reduziert (NTC) oder bei steigender Temperatur erhöht (PTC). Das TC steht dabei für //Temperature coefficient//. Da nur sehr hochwertige Sensoren beinahe lineare Verläufe haben, ist die Berechnung dort etwas haariger, es wird dazu eine spezielle Gleichung benötigt, die Kurve des Sensors möglichst exakt beschreibt. Wir verwenden in unserem Aufbau den [[http://www.hacktronics.com/Tutorials/arduino-thermistor-tutorial.html|Code aus der Anleitung von Hacktronics]] zum Berechnen der Temperatur. In unserem Aufbau verwenden wir eine ganz einfache Serieschaltung mit einem 10KOHM Widerstand. D.h. bei 25GRAD müssten genau 2.5V am analogen Eingang des Arduino anstehen: {{:sensors:thermistor_setup_schem.png|Thermistor Beschaltung}} === Weiterführende Informationen zu Thermistoren === * [[wpde>Thermistor|Wikipedia Thermistor]] * [[http://www.hacktronics.com/Tutorials/arduino-thermistor-tutorial.html|Hacktronics: Arduino Thermistor Tutorial]] * [[http://www.arduino.cc/playground/ComponentLib/Thermistor|Arduino Playground: Reading a Thermistor]] * [[http://www.arduino.cc/playground/ComponentLib/Thermistor2|Arduino Playground: Reading a Thermistor]] ===== Messaufbau ===== Die zum Test verwendeten Sensoren wurden alle parallel auf einem Breadboard aufgebaut, was im Foto noch etwas chaotisch aussieht...: {{:sensors:templogger_1.jpg?700x500|Aufbau auf dem Breadboard}} ...ist im Fritzing Schema ev. etwas leichter zu durchschauen: {{:sensors:tempsensor_datalogger_bb.png|}} ===== Software ===== Die Daten sollen über den seriellen Anschluss an den PC zur Aufzeichnung und Auswertung übermittelt werden. Auf der Seite des PC wird dazu [[http://www.python.org/|Python]] mit dem [[http://pyserial.sourceforge.net/|pySerial Modul]] eingesetzt, das hat den Vorteil, dass das Script mit kleinen Anpassungen auf Linux, BSD, Win32 und MacOS laufen sollte. Damit auch Vergleiche mit externen Quellen, z.B. einem sehr exakten Hygrometer und/oder Thermometer angestellt werden können, bietet das Script die Möglichkeit externe Messwerte zu jedem Block optional manuell zu erfassen. In der Aufzeichnung wird dieser Wert dann solange verwendet bis ein neuer manuell eingegeben wurde. Zur grafischen Auswertung der Logdaten verwenden wir [[http://www.gnuplot.info/|Gnuplot]]. Das Tool ist zwar schon etwas angestaubt, aber ebenfalls für viele Plattformen verfügbar. ==== Arduino Sketch ==== Im Arduino Sketch senden wir einfach den Namen des Sensors und die Messwerte durch Tabulator getrennt, das sieht dann in etwa so aus: DHT11 24.00 25.00 DHT22 24.00 33.70 DHT33 23.20 30.50 DS18S20 23.19 Thermistor1 23.58 Thermistor2 23.58 TMP36 21.52 3 DHT11 24.00 25.00 DHT22 24.00 33.80 ... Der unterste Wert in einem Block ist die Laufzeit des Arduino in Minuten und dient nur dazu, dass wir auf PC-Seite einen kompletten Messblock einfach abgrenzen können. Im Sketch sind 30s als Pause zwischen Messwerterfassungen vorgesehen, d.h. es finden etwas weniger als 2 Messungen pro Minute statt. Wenn einen tiefere Frequenz gewünscht ist für z.B. Langzeitaufzeichnungen ist ein Wert von z.B. 1-5min sinnvoll. ==== Python Logger Script ==== Das Python Script verwendet nur Standardmodule und erwartet beim Aufruf den Namen des (virtuellen) seriellen Anschlusses unter dem das Arduino Board erreichbar ist. In unserem Fall ist dies ///dev/ttyUSB0//: ./simple_templogger.py /dev/ttyUSB0 Das Script zeichnet standardmässig in eine Datei //data.log// im gleichen Verzeichnis auf und gibt die erkannten Sensoren auf der Console aus: Externe Temperaturmessung: 22.9 Sensor T-extern: 22.9 Externe Feuchtemessung: 23 Sensor H-extern: 23 Sensor: DHT11 23.00 25.00 Sensor: DHT22 23.60 33.30 Sensor: DHT33 22.80 30.20 Sensor: DS18S20 22.87 Sensor: Thermistor1 23.14 Sensor: Thermistor2 23.23 Sensor: TMP36 21.52 **Achtung:** Wenn die Datei data.log bereits existiert hängt das Script am Ende der Datei an! In regelmässigen Abständen werden ausserdem die Spalten Namen als Kommentar in die Logdatei eingefügt. ==== Gnuplot Script ==== Gnuplot lässt sich mit einfachen Scripts steuern, so erstellt z.B. folgendes Gnuplot Script mit **gnuplot scriptname.gp** die untenstehende Grafik aus unseren Logdaten: set terminal png size 1024,800 set grid set ylabel "Relative Feuchte %" set output "all-hum-sensors.png" set xdata time set timefmt '%Y %m %d %H %M %S" set format x "%d.%m.%y" set timestamp "Last updated: %d.%m.%y %H:%M" #set size 1.2,1 plot 'data.log' every 2 using 1:14 title "DHT11" smooth csplines 12,\ 'data.log' every 2 using 1:15 title 'DHT22' smooth csplines 9,\ 'data.log' every 2 using 1:16 title "DHT33" smooth csplines 1,\ 'data.log' every 2 using 1:18 title "External H" smooth csplines 6 Die kompletten Gnuplot Scripte finden Sie im [[#Download|Download]]. ===== Download ===== {{:sensors:temp_datalogger.tgz|Arduino Sketch, Python Logging Script und Gnuplot Script (2012-01-28}} Alle Inhalte und Codes stehen unter der BSD Lizenz. //May the source be with you Luke!// ===== Fazit ===== ==== Versuch 1 Raumtemperatur ==== Über einen Zeitraum von ca. 24h wird die Raumtemperatur und Luftfeuchtigkeit im Labor aufgezeichnet, die Erfassung der manuellen Vergleichswerte erfolgt dabei nur sporadisch. Um etwas Bewegung in die Sache zu bringen wurde tagsüber ein Fenster schräg gestellt: === Temperatur === {{:sensors:all-temp-sensors-in.png?900x570|Temperatur über 24h}} === Luftfeuchte === {{:sensors:all-hum-sensors-in.png?900x680|Feuchte über 24h}} ==== Versuch 2 Aussentemperatur ==== Über einen Zeitraum von ca. 2h wird die Aussentemperatur und Luftfeuchtigkeit aufgezeichnet, die Erfassung der manuellen Vergleichswerte erfolgt dabei nur sporadisch. Die Mess-Schaltung benötigt etwas Zeit bis sie sich an die Ausstentemperatur "gewöhnt" hat. Danach wurde der Raum verschlossen und langsam beheizt um die Sensoren auf einem möglichst weiten Temperaturbereich vergleichen zu können: === Temperatur === {{:sensors:all-temp-sensors-out.png?900x570|Temperatur über 2h}} === Luftfeuchte === {{:sensors:all-hum-sensors-out.png?900x680|Feuchte über 2h}} ==== Schlussfolgerung ==== Die DS18x20 Sensoren (der DHT33 enthält ebenfalls einen DS18x20) liefern erwartungsgemäss sehr genaue und vergleichbare Temperaturen. Der DHT22 liefert ebenfalls angenehm vergleichbare und stabile Messwerte, tendiert aber dazu immer etwas zu hoch zu liegen. Der DHT11 hingegen ist angenehm genau, die grössten Abweichungen entstehen bei diesem Sensor dadurch, dass er nur eine Auflössung von 1Grad hat. Am meisten überrascht sind wir von den genauen Werten der Thermistoren, diese lieferten bei Raumtemperaturen durchwegs exakte und stabile Resultate über beide Sensoren hinweg. Bei anderen Temperaturen war die Abweichung deutlich grösser. Der TMP36 hat im Gegensatz zum DHT22 immer etwas zu kalt gehabt. Ansonsten sind die Messwerte stabil einfach immer etwas 1 Grad zu tief was sich mit einem Offset sicher korrigieren liesse. Alle Sensoren haben Ihre Vor- und Nachteile, für low-cost Anwendungen im Raumtemperaturbereich sind die Thermistoren aber sicher zu empfehlen. Wers gerne etwas digitaler hat dem kann mit den DS18x20 und den DHTxx Sensoren geholfen werden. Da wir für die Feuchtemessungen keine geeignet genaue Referenz zur Verfügung hatten, können wir hier keine Aussage machen. \\ \\ \\ ----