{"id":1274,"date":"2019-03-05T19:29:45","date_gmt":"2019-03-05T18:29:45","guid":{"rendered":"https:\/\/lobo.mensa.uberspace.de\/wp\/?p=1274"},"modified":"2019-03-11T19:13:33","modified_gmt":"2019-03-11T18:13:33","slug":"temperatur-und-luftfeuchtigkeit-messen","status":"publish","type":"post","link":"https:\/\/lobo.uber.space\/wp\/?p=1274","title":{"rendered":"Temperatur und Luftfeuchtigkeit messen"},"content":{"rendered":"\n<p>Ich m\u00f6chte meinen Raspberry-Pi zum Messen der Temperatur und Luftfeuchtigkeit verwenden.<\/p>\n<p><table><tr><td>Als Sensor viel dabei die Wahl auf den <a href=\"https:\/\/www.amazon.de\/dp\/B07L4WCFPZ\/\">DHT22<\/a> mit einer kleinen Platine, auf der bereits der ben\u00f6tigte Pull-Up Widerstand installiert ist. Ich habe mir gleich zwei davon zugelegt, schlie\u00dflich m\u00f6chte ich innen und au\u00dfen messen.<\/td><td><img decoding=\"async\" loading=\"lazy\" class=\"alignright wp-image-1289\" src=\"https:\/\/lobo.mensa.uberspace.de\/wp\/wp-content\/uploads\/2019\/02\/DHT22.jpg\" alt=\"DHT22\" width=\"243\" height=\"187\" srcset=\"https:\/\/lobo.uber.space\/wp\/wp-content\/uploads\/2019\/02\/DHT22.jpg 640w, https:\/\/lobo.uber.space\/wp\/wp-content\/uploads\/2019\/02\/DHT22-300x231.jpg 300w\" sizes=\"(max-width: 243px) 100vw, 243px\" \/><\/td><\/tr><\/table><\/p>\n\n\n\n<!--more-->\n\n\n\n<h3 class=\"wp-block-heading\">Die Hardware<\/h3>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignleft is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/lobo.mensa.uberspace.de\/wp\/wp-content\/uploads\/2019\/02\/DHT22_Kabel.jpg\" alt=\"\" class=\"wp-image-1290\" width=\"101\" height=\"76\" srcset=\"https:\/\/lobo.uber.space\/wp\/wp-content\/uploads\/2019\/02\/DHT22_Kabel.jpg 640w, https:\/\/lobo.uber.space\/wp\/wp-content\/uploads\/2019\/02\/DHT22_Kabel-300x225.jpg 300w\" sizes=\"(max-width: 101px) 100vw, 101px\" \/><\/figure><\/div>\n\n\n\n<p>Dem Sensor liegt auch ein kleines Anschlu\u00dfkabel bei, da mir dies nicht lang genug ist, habe ich jedoch ein anderes Kabel mit entsprechenden Steckern versehen.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignright is-resized\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/lobo.mensa.uberspace.de\/wp\/wp-content\/uploads\/2019\/02\/Kabel.jpg\" alt=\"\" class=\"wp-image-1292\" width=\"135\" height=\"101\" srcset=\"https:\/\/lobo.uber.space\/wp\/wp-content\/uploads\/2019\/02\/Kabel.jpg 640w, https:\/\/lobo.uber.space\/wp\/wp-content\/uploads\/2019\/02\/Kabel-300x225.jpg 300w\" sizes=\"(max-width: 135px) 100vw, 135px\" \/><\/figure><\/div>\n\n\n\n<p>Der Anschluss gestaltet sich relativ einfach: 3.3V und Masse vom Raspberry-Pi mit den jeweiligen Pins der Sensoren verbinden und den Datenanschluss jedes Sensors mit einem eigenen GPIO-Pin verbinden. Hier findet ihr eine <a href=\"https:\/\/www.raspberrypi.org\/documentation\/usage\/gpio\/README.md\">aktuelle Beschreibung der GPIO-Pins (Englisch)<\/a>. Wie man auf dem Bild unten sieht, ist mein Raspberry ein wenig \u00e4lter. Die Pinbelegung ist jedoch die gleiche soweit die Pins vorhanden sind (die ersten 26).<\/p>\n\n\n\n<table><tr><td><img decoding=\"async\" loading=\"lazy\" width=\"640\" height=\"480\" src=\"https:\/\/lobo.mensa.uberspace.de\/wp\/wp-content\/uploads\/2019\/02\/Raspi.jpg\" alt=\"Raspberry Pi mit angeschlossenem Kabel\" class=\"wp-image-1294\" srcset=\"https:\/\/lobo.uber.space\/wp\/wp-content\/uploads\/2019\/02\/Raspi.jpg 640w, https:\/\/lobo.uber.space\/wp\/wp-content\/uploads\/2019\/02\/Raspi-300x225.jpg 300w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/td>\n<td><img decoding=\"async\" loading=\"lazy\" width=\"640\" height=\"480\" src=\"https:\/\/lobo.mensa.uberspace.de\/wp\/wp-content\/uploads\/2019\/02\/DHT22_angeschlossen.jpg\" alt=\"DHT22 mit angeschlossenem Kabel\" class=\"wp-image-1291\" srcset=\"https:\/\/lobo.uber.space\/wp\/wp-content\/uploads\/2019\/02\/DHT22_angeschlossen.jpg 640w, https:\/\/lobo.uber.space\/wp\/wp-content\/uploads\/2019\/02\/DHT22_angeschlossen-300x225.jpg 300w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/td><\/tr><\/table>\n\n\n\n<h3 class=\"wp-block-heading\">Ansteuerung der Hardware<\/h3>\n\n\n\n<p>Die einfachste M\u00f6glichkeit den Sensor auszulesen ist Adafruit. Dies ist z.B. \u00fcber GitHub verf\u00fcgbar. Um dies zu benutzen, mu\u00df zuerst ein wenig Software installiert werden:<\/p>\n\n<div class=\"codecolorer-container bash blackboard\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/><\/div><\/td><td><div class=\"bash codecolorer\"><span class=\"kw2\">sudo<\/span> <span class=\"kw2\">apt-get update<\/span><br \/>\n<span class=\"kw2\">sudo<\/span> <span class=\"kw2\">apt-get install<\/span> build-essential python3-dev python3-openssl <span class=\"kw2\">git<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n<p>Nun kann Adafruit von GitHub geholt und installiert werden:<\/p>\n\n<div class=\"codecolorer-container bash blackboard\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/><\/div><\/td><td><div class=\"bash codecolorer\"><span class=\"kw2\">git clone<\/span> https:<span class=\"sy0\">\/\/<\/span>github.com<span class=\"sy0\">\/<\/span>adafruit<span class=\"sy0\">\/<\/span>Adafruit_Python_DHT.git<br \/>\n<span class=\"kw3\">cd<\/span> Adafruit_Python_DHT<br \/>\n<span class=\"kw2\">sudo<\/span> python3 setup.py <span class=\"kw2\">install<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n\n<p>Adafruit \u00fcbernimmt die Ansteuerung und das Auslesen des Sensors in C. Python ist hierf\u00fcr nicht schnell genug. Im <a href=\"https:\/\/cdn-shop.adafruit.com\/datasheets\/Digital+humidity+and+temperature+sensor+AM2302.pdf\">Datenblatt des DHT22<\/a> kann man lesen, wie der Sensor angesteuert und ausgelesen wird.<\/p>\n\n\n\n<p>Nun k\u00f6nnen wir relativ einfach \u00fcber das Modul Adafruit_DHT den Sensor auslesen. Leider ist der Zugriff auf GPIO beschr\u00e4nkt auf root. Damit die eigentliche Datenerfassung nicht als root laufen mu\u00df, das Auslesen des Sensors jedoch automatisch ohne Passworteingabe ablaufen kann, ben\u00f6tigen wir ein kleines Script, welches die Daten ausliest und \u00fcber sudo ohne Passworteingabe ablaufen darf.<\/p>\n\n\n\n\n<div class=\"codecolorer-container python blackboard\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/>13<br \/>14<br \/>15<br \/>16<br \/>17<br \/>18<br \/><\/div><\/td><td><div class=\"python codecolorer\"><span class=\"kw1\">import<\/span> <span class=\"kw3\">os<\/span><br \/>\n<span class=\"kw1\">import<\/span> <span class=\"kw3\">sys<\/span><br \/>\n<span class=\"kw1\">import<\/span> Adafruit_DHT<br \/>\n<br \/>\n<span class=\"kw1\">if<\/span> __name__ <span class=\"sy0\">==<\/span> <span class=\"st0\">&quot;__main__&quot;<\/span>:<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"kw1\">not<\/span> <span class=\"kw3\">os<\/span>.<span class=\"me1\">path<\/span>.<span class=\"me1\">exists<\/span> <span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/run\/wetter&quot;<\/span><span class=\"br0\">&#41;<\/span>:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">os<\/span>.<span class=\"me1\">mkdir<\/span> <span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/run\/wetter&quot;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw3\">os<\/span>.<span class=\"me1\">chown<\/span> <span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;\/run\/wetter&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">1000<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">1000<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <br \/>\n&nbsp; &nbsp; ports_allowed <span class=\"sy0\">=<\/span> <span class=\"br0\">&#91;<\/span><span class=\"nu0\">4<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">17<\/span><span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp; port <span class=\"sy0\">=<\/span> ports_allowed<span class=\"br0\">&#91;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"kw2\">len<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw3\">sys<\/span>.<span class=\"me1\">argv<\/span><span class=\"br0\">&#41;<\/span> &amp;gt<span class=\"sy0\">;=<\/span> <span class=\"nu0\">2<\/span>:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; port <span class=\"sy0\">=<\/span> <span class=\"kw2\">int<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw3\">sys<\/span>.<span class=\"me1\">argv<\/span><span class=\"br0\">&#91;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">if<\/span> <span class=\"kw1\">not<\/span> port <span class=\"kw1\">in<\/span> ports_allowed:<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"kw1\">print<\/span> <span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;(None, None)&quot;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exit <span class=\"br0\">&#40;<\/span><span class=\"nu0\">0<\/span><span class=\"br0\">&#41;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; <span class=\"kw1\">print<\/span> <span class=\"br0\">&#40;<\/span><span class=\"kw3\">repr<\/span> <span class=\"br0\">&#40;<\/span>Adafruit_DHT.<span class=\"me1\">read<\/span> <span class=\"br0\">&#40;<\/span>Adafruit_DHT.<span class=\"me1\">DHT22<\/span><span class=\"sy0\">,<\/span> port<span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n\n<p>Ich habe noch ein paar Zeilen erg\u00e4nzt (Zeile 6-8), die thematisch nicht in das Script geh\u00f6ren, aber es ist hier sehr einfach einzubauen. Am Verzeichnis \/run ist eine Ram-Disk (tmpfs) eingeh\u00e4ngt. Hier m\u00f6chte ich meine Daten zwischenzeitlich ablegen. Das Verzeichnis ist jedoch nur von root beschreibbar, die Daten werden jedoch vom Script im unter meinem normalen User abgelegt. Da nach dem Booten des Systems das Verzeichnis \/run leer ist, mu\u00df jedoch irgendwann ein Unterverzeichnis angelegt werden, in welches der normale Benutzer schreiben kann. Dies geschieht unter \/run\/wetter mit Benutzer-ID und Gruppen-ID 1000.<\/p>\n\n\n\n<p>Dieses kleine Programm speichere ich nun z.B. unter \/root\/read_DHT.py und erg\u00e4nze dann die Datei &#8222;\/etc\/sudoers&#8220; durch Aufruf von <code class=\"codecolorer text blackboard\"><span class=\"text\">sudo visudo<\/span><\/code> mit folgenden Zeilen. Dabei ist &#8222;user&#8220; nat\u00fcrlich der Benutzername des Benutzers, welcher das Script ausf\u00fchren k\u00f6nnen soll.<\/p>\n\n\n\n\n<div class=\"codecolorer-container text blackboard\" style=\"overflow:auto;white-space:nowrap;width:435px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/><\/div><\/td><td><div class=\"text codecolorer\">user ALL=(ALL) NOPASSWD: \/usr\/bin\/python3 \/root\/read_DHT.py 4<br \/>\nuser ALL=(ALL) NOPASSWD: \/usr\/bin\/python3 \/root\/read_DHT.py 17<\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n\n\n\n<p>Im Python-Skript sind in Zeile 10 die erlaubten Ports eingetragen. In der Sudoers-Datei m\u00fcssen alle erlaubten Portnummern eingetragen werden. Dies kann man, wie hier gezeigt, einfach \u00fcber mehrere Zeilen machen. Alternativ kann man z.B. in eckigen Klammern mehrere Ziffern angeben, welche an der Stelle erlaubt sein sollen. Die Angabe der Portnummer ben\u00f6tige ich, da ich mehr als einen Sensor anschlie\u00dfen m\u00f6chte.<\/p>\n\n\n\n<p>Nun kann, ich als &#8222;user&#8220; eingeloggt, den Sensor auslesen. Das kleine Script gibt mir dabei die ausgelesenen Werte in Form eines Strings zur\u00fcck, der der Python-Notation eines Tupels entspricht.<\/p>\n\n\n\n<p>Im n\u00e4chsten Beitrag geht es darum einen <a href=\"https:\/\/lobo.mensa.uberspace.de\/wp\/?p=1318\">Luftdrucksensor anzuschlie\u00dfen<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich m\u00f6chte meinen Raspberry-Pi zum Messen der Temperatur und Luftfeuchtigkeit verwenden. Als Sensor viel dabei die Wahl auf den DHT22 mit einer kleinen Platine, auf der bereits der ben\u00f6tigte Pull-Up Widerstand installiert ist. Ich habe mir gleich zwei davon zugelegt, schlie\u00dflich m\u00f6chte ich innen und au\u00dfen messen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[87,6,89,65,88],"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1274"}],"collection":[{"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1274"}],"version-history":[{"count":38,"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1274\/revisions"}],"predecessor-version":[{"id":1357,"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=\/wp\/v2\/posts\/1274\/revisions\/1357"}],"wp:attachment":[{"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1274"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1274"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lobo.uber.space\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1274"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}