[HowTo] Temperatur und Feuchtigkeitssensor DHT11/DHT22 an SaS

HarryHase

Mitglied
Mitglied seit
16 Feb 2006
Beiträge
657
Punkte für Reaktionen
34
Punkte
28

Vorab einen riesen Dank an JL3 für SaS und die Unterstützung bei der Integration!


Die GPIO des Raspberry wollen ja genutzt werden und ich hatte im Netz nach einem Temperatursensor gesucht, da bin ich über den DHT11 gestolpert der spotbillig ist. Wenn man den Sensor mit den Wiederständen auf der Platine kauft kann man ihn direkt an die gpio des Raspberry klemmen.

Der Unterschied zwischem dem DHT11 und DHT22 ist die Messgenauigkeit und der Messbereich. Der DHT22 kostet das 2-3 fache, also auch noch verträglich. Der DHT11 ist blau, der 22 weiß oder schwarz. Sie sind pinkompatibel.
$_12.JPG

Dann die Verdrahtung zum Raspberry ist recht einfach.

Unbenannt-rasp.jpg

Also ist der Sensor an GPIO 4 angeschlossen. Entsprechend kann man da weitere Sensoren anschließen.

- - - Aktualisiert - - -

so nun die Installation:

Code:
cd /root
sudo apt-get update
sudo apt-get install build-essential python-dev python-openssl git [COLOR=#333333]wiringPi[/COLOR]
git clone https://github.com/adafruit/Adafruit_Python_DHT.git && cd Adafruit_Python_DHT
cd Adafruit_Python_DHT
sudo python setup.py install

dann mal testen

Code:
cd examples
sudo ./AdafruitDHT.py 11 4

Ergebnis:
Code:
Temp=23.0*  Humidity=39.0%

soweit so gut

- - - Aktualisiert - - -

jetzt machen wir uns ein skript womit wir die Werte in eine Textdatei schreiben (sieht in recht umständlich aus, könnte aber später bei vielen Sensoren helfen, mal sehen)

Ich mache alles in /media/usbstick um die sd-Karte nicht zu strapazieren!

Code:
mkdir /media/usbstick/dht11

Das script

Code:
nano /media/usbstick/dht11/getdht11.sh

Code:
#!/bin/bash
/root/Adafruit_Python_DHT/examples/AdafruitDHT.py 11 4 > /media/usbstick/dht11/dht11_1.txt

- - - Aktualisiert - - -

jetzt brauchen wir noch ein psg für SensorandSwitch (ich arbeite noch mit 5.00.4916)


------
-------- jetzt wird es wackelig bei mir ... ich bekomme es nicht hin dass das script aufgerufen wird, klar könnte ich das im cron starten, aber ...
------

psgDHT11-1.php

Code:
<?php


    /*
        +---------------------------------------------------------------------+
        |                                                                     |
        |   SensorAndSwitch                                      PSG-Script   |
        |                                                                     |
        +---------------------------------------------------------------------+
    */


    include __DIR__."/../include/psg.php";
    $gerarray=getGerInfo(substr(basename(__FILE__,".php"),3));


    if ($gerarray["Counter"]>=4) {
        $ver="V#V 1.00#";
        
                $befehl='sudo /media/usbstick/dht11/getdht11.sh';
        $url=$helperurlpi."?befehl=".encodiere($befehl,33455);
        $Status=web($url,$post);
        
        $befehl="tac /media/usbstick/dht11/dht11_1.txt | cut -c6-9";
        $url=$helperurlpi2."?befehl=".encodiere($befehl,33455);
        $temp1=web($url,$post);
                
        $befehl="tac /media/usbstick/dht11/dht11_1.txt | cut -c22-25";
        $url=$helperurlpi2."?befehl=".encodiere($befehl,33455);
        $feucht1=web($url,$post);
        
        $echo='P#<div style="font-size:16px;text-align:right;width:240px;position:absolute;top:-5px;">Luftfeuchtig. : '.sprintf("%.1f",$feucht1).' °C<br />Temperatur  : '.sprintf("%.1f",$temp1).' °C</div>*HTML#'.$ver;
      
                                       }
    else {
        $echo=$ver."C##";
         }
    echo $echo;
    exit;
?>
 
Zuletzt bearbeitet:
Ich denke, der Fehler liegt hier
Die Textdatei mit den Werten wird schließlich auf dem $helperurlpi geschrieben, wie soll man sie dann auf dem $helperurlpi2 lesen können...
zwinkern.gif

korrigiert nun:
PHP:
<?php


    /*
        +---------------------------------------------------------------------+
        |                                                                     |
        |   SensorAndSwitch                                      PSG-Script   |
        |                                                                     |
        +---------------------------------------------------------------------+
    */


    include __DIR__."/../include/psg.php";
    $gerarray=getGerInfo(substr(basename(__FILE__,".php"),3));


    if ($gerarray["Counter"]>=4) {
        $ver="V#V 1.00#";
        
                $befehl='sudo /media/usbstick/dht11/getdht11.sh';
        $url=$helperurlpi."?befehl=".encodiere($befehl,33455);
        $Status=web($url,$post);
        
        $befehl="sudo tac /media/usbstick/dht11/dht11_1.txt | sudo cut -c6-9";
        $url=$helperurlpi."?befehl=".encodiere($befehl,33455);
        $temp1=web($url,$post);
                
        $befehl="sudo tac /media/usbstick/dht11/dht11_1.txt | sudo cut -c22-25";
        $url=$helperurlpi."?befehl=".encodiere($befehl,33455);
        $feucht1=web($url,$post);
        
        $echo='P#<div style="font-size:16px;text-align:right;width:240px;position:absolute;top:-5px;">Luftfeuchtig. : '.sprintf("%.1f",$feucht1).' °C<br />Temperatur  : '.sprintf("%.1f",$temp1).' °C</div>*HTML#'.$ver;
      
                                       }
    else {
        $echo=$ver."C##";
         }
    echo $echo;
    exit;
?>

sudo nicht vergessen, habe ich gerade nochmal korrigiert.

- - - Aktualisiert - - -

Das Script hat noch einen Schönheitsfehler:
wenn die Temperatur < 10 Grad ist oder die Feuchtigkeit unter 10 fällt, dann geht das nur mit dem cut nicht gut.
Besser so:
PHP:
<?php


    /*
        +---------------------------------------------------------------------+
        |                                                                     |
        |   SensorAndSwitch                                      PSG-Script   |
        |                                                                     |
        +---------------------------------------------------------------------+
    */


    include __DIR__."/../include/psg.php";
    $gerarray=getGerInfo(substr(basename(__FILE__,".php"),3));


    if ($gerarray["Counter"]>=4) {
        $ver="V#V 1.00#";
        
        $befehl='sudo /media/usbstick/dht11/getdht11.sh';
        $url=$helperurlpi."?befehl=".encodiere($befehl,33455);
        $Status=web($url,$post);
        
        $befehl="sudo tac /media/usbstick/dht11/dht11_1.txt | sudo awk -F'Temp=' '{print $2}' | sudo cut -d '*' -f1";
        $url=$helperurlpi."?befehl=".encodiere($befehl,33455);
        $temp1=web($url,$post);
                
        $befehl="sudo tac /media/usbstick/dht11/dht11_1.txt| sudo awk -F'Humidity=' '{print $2}' | sudo cut -d '%' -f1";
        $url=$helperurlpi."?befehl=".encodiere($befehl,33455);
        $feucht1=web($url,$post);
        
        $echo='P#<div style="font-size:16px;text-align:right;width:240px;position:absolute;top:-5px;">Luftfeuchtig. : '.sprintf("%.1f",$feucht1).' °C<br />Temperatur  : '.sprintf("%.1f",$temp1).' °C</div>*HTML#'.$ver;
      
                                       }
    else {
        $echo=$ver."C##";
         }
    echo $echo;
    exit;
?>
 
Zuletzt bearbeitet:
Das hat bei mir wieder was mit den Rechten zu tun, das geht ums Verecken nicht, aber schick ist es jetzt schon... VIELEN DANK
mache ich es halt in crontab ..

so kann es dann mit 2 Sensoren aussehen ...

Unbenannt.JPG


edit: habe mir jetzt noch 2 DHT22 bestellt, ist ja genug am pi frei ...
 
Zuletzt bearbeitet:
Prima :)

Nur Temperatur messen geht recht einfach am USB-Port angeschlossen mit einem Temperatursensor DS18B20 an einem USB-Interface AT90USB162. An dieses kann man auch mehrere Sensoren hängen und man braucht keine zusätzliche Software, da sas ein Programm mitliefert: tempusb

https://www.amazon.de/gp/product/B00GLURDTE/ref=oh_aui_search_detailpage?ie=UTF8&psc=1

Ich suche noch einen Helligkeitssensor, der vernünftig am Pi arbeitet.
 
Nach einem Tag Betrieb kann ich nur sagen, cooler Bastelspaß am Sonntag, funktioniert hervorragend am GPIO, habe einen mit 4 Meter Kabel (draußen) und einen mit 2 Meter in anderem Raum verbaut, einfach preiswert gut. Jetzt bekommt jeder meiner 3 Raspi einen verpasst. script drauf und schon liefert jeder Raspi egal wo er steht die Messwerte.

---
Licht: ist da nichts dabei? click

Der BH1750 findet man auch in google mit raspberry
 
Hab den BH1750 jetzt endlich bereits mit verlötetem Stecker gefunden. :)

Mal sehen, ob das funktioniert. I2C ist ja recht einfach zu handhaben.

- - - Aktualisiert - - -

Wenn ich etwas Zeit habe, werde ich für den DHT11 bzw. DHT22 und den BH1750 kleine C++-Programme schreiben, die die Werte SAS-kompatibel ausgeben. Irgendwo habe ich eine C-Bibliothek gefunden, denn so ein Python-Fan bin ich nicht gerade, da sie nicht so wirklich 24/7-tauglich sind. Mir sind da schon einige Pis hängengeblieben... ;)

- - - Aktualisiert - - -

@HarryHase: Könntest du evtl. mal das Python-Script hier posten?
/root/Adafruit_Python_DHT/examples/AdafruitDHT.py
 
Das wäre natürlich Spitze, performanter und stabiler;
Bei mir läuft es mit 2 Sensoren durch (ich lasse alle 9 Minuten einen Wert holen, das reicht ja). Bin echt begeistert vom DHTxx
 
Sobald ich den BH1750 habe, werde ich es in Angriff nehmen. Wäre nur interessant, wie das Pythonscript aufgebaut ist, da in ihm wohl alle Varianten des DHTxx abgedeckt werden.
 
aber gerne doch

xyz@s4:~ cat /root/Adafruit_Python_DHT/examples/AdafruitDHT.py


Code:
#!/usr/bin/python
# Copyright (c) 2014 Adafruit Industries
# Author: Tony DiCola


# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:


# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.


# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import sys


import Adafruit_DHT




# Parse command line parameters.
sensor_args = { '11': Adafruit_DHT.DHT11,
                '22': Adafruit_DHT.DHT22,
                '2302': Adafruit_DHT.AM2302 }
if len(sys.argv) == 3 and sys.argv[1] in sensor_args:
    sensor = sensor_args[sys.argv[1]]
    pin = sys.argv[2]
else:
    print('usage: sudo ./Adafruit_DHT.py [11|22|2302] GPIOpin#')
    print('example: sudo ./Adafruit_DHT.py 2302 4 - Read from an AM2302 connected to GPIO #4')
    sys.exit(1)


# Try to grab a sensor reading.  Use the read_retry method which will retry up
# to 15 times to get a sensor reading (waiting 2 seconds between each retry).
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)


# Un-comment the line below to convert the temperature to Fahrenheit.
# temperature = temperature * 9/5.0 + 32


# Note that sometimes you won't get a reading and
# the results will be null (because Linux can't
# guarantee the timing of calls to read the sensor).
# If this happens try again!
if humidity is not None and temperature is not None:
    print('Temp={0:0.1f}*  Humidity={1:0.1f}%'.format(temperature, humidity))
else:
    print('Failed to get reading. Try again!')
    sys.exit(1)
xyz@s4:~
 
Vielen Dank, hab es mir gerade angesehen.

Interessant wäre, was im import Adafruit_DHT steht, aber I2C ist auch mit C++ nicht so kompliziert, ich habe nur irgendwo überflogen, dass die eingelesenen Werte als Word ankommen und Hi und Low gedreht werden müssen (kann jetzt auch beim BH1750 gewesen sein), muss ich aber dann mal sehen. ;)
 
Ich habe mal alles zusammengepackt, da der upload hier gerade nicht funktioniert, auf mega: click
 
Prima, danke, schau ich mir an. :)

- - - Aktualisiert - - -

Das sieht gut aus, da sind sogar die C-Bibliotheken drin. Es gibt Unterschede in der Wertzuweisung zwischen DHT11 und DHT22, da der DTH22 genauer ist und einen größeren Messbereich hat. ;)
 
darum habe ich ja auch noch zwei DHT22 geordert ... Bin mal gespannt wie die sich in der Realität verhalten, also wie groß die Differenz ist.
 
Ich schreibe gerade das C++-Programm. Ist nicht so kompliziert wie gedacht. Sobald ich es fertig habe, stelle ich es hier rein zum Testen. Die Syntax wird sein:

tempfeuchti2c Gerätetyp Modus Pinnummer

Beispiel: sudo tempfeuchti2c dth11 t 4
Hier wird für das DHT11 am Pin 4 die Temperatur als reine Zahl ausgegeben.

Beispiel: sudo tempfeuchti2c dht22 f 4
Hier wird für das DHT22 am Pin 4 die Luftfeuchtigkeit als reine Zahl ausgegeben.

Beispiel: sudo tempfeuchti2c dht22 info 4
Gibt alle Werte und Zusatzinfos optisch aufbereitet aus.

Dadurch kann man es leicht in ein PsG einbinden. ;)

- - - Aktualisiert - - -

Bitte testen: tempfeuchti2c.zip

Aufruf zum Testen: sudo tempfeuchti2c dht11 i 4

- - - Aktualisiert - - -

Nachtrag: tempfeuchti2c muss unter root-Rechten aufgerufen werden. Ggf. muss zuerst in den Pfad, wo es abgelegt worden ist, gewechselt werden und dann mit
sudo ./tempfeuchti2c dht11 i 4
aufgerufen werden. Später in SAS V6 wird es unter /usr/local/bin/sas/ zu finden sein. ;)
 
geht noch nicht .. Wenn ich die Pins abfrage die belegt sind (3 und 4 bei mir) kommt

Fehler: Daten Lesefehler!

Wenn ich einen Abfrage der nicht belegt ist kommt nichts zurück und das Programm hängt.
 
meine Sensoren hängen an Pin 07 und 05 , nach meinem Verständnis GPIO 04 und 03

edit: Sind auch die einzig beiden bei dem die Fehlermeldung kommt, bei allen anderen GPIO hängt das Programm und muss mit crtl-c abgebrochen werden.
 
Was passiert, wenn du 7 angibst?
 
nischt .... hängt wie bei allen anderen nicht belegten GPIO
 
Zuletzt bearbeitet:
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.