Hallo liebe Leserinnen und Leser!
Heute möchte ich euch zeigen, wie ihr den Temperatur- und Luftfeuchtigkeitssensor DHT11 am Banana Pi anschließen und auslesen könnt.
Ich verwende hier wieder das schlanke OS Bananian für den Banana Pi, das Tutorial sollte aber auch auf Raspbian umzusetzen sein. Hier muss der erste Schritt (Installation von WiringBPi) allerdings nicht durchgeführt werden, da dieses Bereits vorinstalliert ist.
1. Installation von WiringBPi
WiringBPi ist das Pendant zu WiringPi für den Raspberry Pi und wird von LeMaker über GitHub zur Verfügung gestellt. Um WiringBPi auf eurem Banana Pi mit Bananian zu installieren, müsst ihr folgende Schritte ausführen (falls ihr den Standard-Nutzer root benutzt, müsst ihr das „sudo“ am Anfang jeweils weglassen!):
1 2 3 | sudo apt-get update sudo apt-get upgrade sudo apt-get install gcc g++ make git-core vim |
Update [21.02.2015]: LeMaker hat das GitHub-Repository mittlerweile in WiringBP umbenannt und die Bibliothek um den Banana Pro ergänzt. Ich habe den Artikel hier gerade dahingehend überarbeitet.
Für den normalen Banana Pi führt ihr nun folgendes aus:
1 | git clone https://github.com/LeMaker/WiringBP.git -b bananapi |
bzw. für den Banana Pro das hier:
1 | git clone https://github.com/LeMaker/WiringBP.git -b bananapro |
Anschließend wechselt ihr in das heruntergeladene Verzeichnis über cd WiringBP . Um die build-Datei ausführbar zu machen, nutzt ihr diesen Befehl:
1 | sudo chmod +x ./build |
Dann startet ihr das Script mit sudo ./build und installiert WiringBPi mit sudo ./build install .
2. Anschluss des DHT11 an den Banana Pi
Der Anschluss des DHT11 an den Banana Pi ist relativ simpel. Ihr braucht nur 3 Kabel, um den Sensor mit den GPIOs eures BPi zu verbinden. Allerdings ist es empfehlenswert, zusätzlich einen Pull-Up-Widerstand anzubringen, um Übertragungsfehler zu vermeiden. Ich habe ich die beiden Anschlussvarianten mal bildlich dargestellt.
Zuerst ohne Pull-Up-Widerstand:
Und nun mit Pull-Up-Widerstand (hier: 4.7kΩ):
Für den Widerstandswert schaut ihr am Besten in das Datenblatt eures DHT11, bei meinem war ein Widerstand von 5,1kΩ angegeben.
Hier noch die Pinbelegung des DHT11 im Detail:
Und so müsst ihr ihn mit dem Banana Pi verbinden (tabellarische Form):
DHT11 Banana Pi
VCC 5V bzw. 3.3V
GND GND
DATA GPIO 7
3. Programm zum Auslesen des DHT11
Es war etwas schwierig ein fertiges Programm zu finden, um den DHT11 am Banana Pi auslesen zu können mit WiringBPi. Das liegt wohl an kleineren Problemen mit der aktuellen Version von WiringBPi im Zusammenspiel mit einigen OS-Varianten. Ich habe allerdings eine Lösung gefunden, die zumindest bei mir funktioniert.
Hier ist der entsprechende Quellcode (Quelle):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include <wiringPi.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #define MAX_TIME 85 #define DHT11PIN 7 int dht11_val[5]={0,0,0,0,0}; void dht11_read_val() { uint8_t lststate=HIGH; uint8_t counter=0; uint8_t j=0,i; for(i=0;i<5;i++) dht11_val[i]=0; pinMode(DHT11PIN,OUTPUT); digitalWrite(DHT11PIN,LOW); delay(18); digitalWrite(DHT11PIN,HIGH); delayMicroseconds(40); pinMode(DHT11PIN,INPUT); for(i=0;i<MAX_TIME;i++) { counter=0; while(digitalRead(DHT11PIN)==lststate){ counter++; delayMicroseconds(1); if(counter==255) break; } lststate=digitalRead(DHT11PIN); if(counter==255) break; // top 3 transistions are ignored if((i>=4)&&(i%2==0)){ dht11_val[j/8]<<=1; if(counter>16) dht11_val[j/8]|=1; j++; } } // verify cheksum and print the verified data if((j>=40)&&(dht11_val[4]==((dht11_val[0]+dht11_val[1]+dht11_val[2]+dht11_val[3])& 0xFF))) { printf("Humidity = %d.%d %% Temperature = %d.%d °C\n",dht11_val[0],dht11_val[1],dht11_val[2],dht11_val[3]); } else printf("Invalid Data!!\n"); } int main(void) { printf("Interfacing Temperature and Humidity Sensor (DHT11) With Banana Pi\n"); if(wiringPiSetup()==-1) exit(1); while(1) { dht11_read_val(); delay(3000); } return 0; } |
Diesen Code speichert ihr unter dem Namen „dht11.c“ auf dem Banana Pi. Jetzt müssen wir den Code nur noch kompilieren. Dazu geben wir folgenden Befehl ein (zuvor natürlich in das Verzeichnis mit der gerade angelegten Datei „dht11.c“ wechseln):
1 | gcc -o dht11 dht11.c -L/usr/local/lib –lwiringPi |
Nun sollte das Programm einsatzbereit sein. Ihr könnt es über sudo ./dht11 aufrufen. Jetzt werden euch alle 3 Sekunden die vom Sensor gemessenen Werte für die Luftfeuchtigkeit und die Temperatur auf das Terminal ausgegeben.
Für die Speicherung der Werte in einer .csv-Datei und die Visualisierung der aktuellen und historischen Werte über ein Webinterface folgt noch ein weiteres Tutorial, das auf diesem aufbauen wird.
Bei Fragen, Anregungen oder Problemen könnt ihr wie immer das Kommentarfeld unten benutzen.
Und nun: Gutes Gelingen bei der Umetzung!
Hi!
Bin gerade zufällig auf deinen Blog hier gestoßen. Finde die Anleitungen super! Wie machst du denn diese coolen Schaltpläne hier?
Grüße
Hallo Christian,
das Programm nennt sich Fritzing. Den Banana Pi gibt es allerdings noch nicht als Bauteil, daher habe ich mir die entsprechende Vektorgrafik selbst gebastelt.
Danke! Gibts die Grafik für den Banana irgendwo zum Download, also ohne das „Zeug“ rundum?
Hi Christian,
ich kann die Vektorgrafik gerne zur Verfügung stellen, wenn das gewünscht ist. Ich exportier nachher die .svg nochmal sauber und stell sie im Blog hoch.
Update: Ich habe hier einen entsprechenden Beitrag erstellt.
Vielen Dank! :)
Hallo! Danke für die Anleitung. Misst der Sensor bei dir auch so ungenau? Hab gerade bei der Temperatur ziemliche Abweichungen zu meinem analogen Thermometer festgestellt. Grüße
Hi Sören,
der Sensor hat bei der Temperatur lt. Datenblatt eine Genauigkeit von ±2°C, ist also wirklich etwas ungenau für eine genaue Messung. Für genauere Daten wäre z.B. der DHT22 geeignet, der eine Toleranz von ±0,2°C hat und somit um einiges genauer sein sollte. Natürlich ist dieser auch etwas teurer.
Hat prima geklappt. Vielen Dank!
Könntest du bitte auch ein Tutorial mit Bewegungssensoren für den Banana Pi machen ?
Hallo Philipp,
einen solchen Sensor besitze ich nicht und habe dafür auch keine Verwendung ;)
Nur eine kleine Anmerkung, da es mich 10min googeln gekostet hat: Ich konnte die „dht11.c“ mit dem aktuellen wiringPi/BP aud git nur mit folgender Kommandozeile kompilieren:
gcc -o dht11 dht11.c -I/usr/local/include -L/usr/local/lib -lwiringPi
Hallo Alex,
(ich benutze ubuntu mate auf dem pi)
Ich habe den Quellconde heruntergeladen und und unter dht11.c in dem Angegebenen Ordner gespeichert.
Das problem ist, dass wenn ich den code kompilieren will, eine Meldung kommt:
/usr/local/lib//libwiringPi.so: undefined reference to
pthread_join'
pthread_create‘/usr/local/lib//libwiringPi.so: undefined reference to
/usr/local/lib//libwiringPi.so: undefined reference to `pthread_cancel‘
KA, was ich falsch gemacht habe
Hallo sprengerle,
ich habe bisher noch kein Ubuntu auf meinem Banana Pi installiert, aber vermutlich löst ein „-lpthread“ an den gcc-Befehl angehängt dein Problem.
Hallo, habe das Ganze mit:
gcc dht11.c -I/usr/local/include -L/usr/local/lib -lwiringPi -lwiringPiDev -lpthread -o dht11
gelöst.
Compiliert. Leider erhalte ich immer die Meldung „invalid data“…
Hallo ek,
habe mich vor kurzem auch auf anderen Plattformen mit dem Sensor rumgeschlagen und kann sagen, dass er sehr sensibel ist für Störungen aller Art. Reicht ein Pull-Up-Widerstand alleine nicht für eine zuverlässige Messung, könntest du noch versuchen, einen kleinen Kondensator zw. VCC+GND zu setzen, um kleinere Spannungsschwankungen zu glätten. Ansonsten hilft es oft, die Leitungen möglichst kurz zu halten.
An meinem Banana Pi habe ich auch teilweise Probleme, den Sensor auszulesen, wenn dieser ausgelastet ist oder die Festplatte läuft. Dann braucht es einige Anläufe.