Hallo liebe Leserinnen und Leser,
wie im vorangegangenen Tutorial erwähnt, möchte ich euch noch zeigen, wie ihr die Temperatur- und Luftfeuchtigskeitswerte vom DHT11 auf eurem Banana Pi speichern und über ein Webinterface darstellen könnt. Für die Darstellung verwende ich das bereits für die Funkthermometer am Raspberry Pi von mir erstellte Webinterface.
1. Erweiterung des Codes zum Auslesen des DHT11 um eine Speicherfunktion
Zuerst müssen wir den im vorangegangenen Beitrag enthaltenen Code um eine Speicherfunktion für die Temperatur- und Luftfeuchtigkeitswerte erweitern. Konkret werden 3 .csv-Dateien erzeugt und die Werte darin gespeichert. Der aktuelle Temperatur- und Luftfeuchtigkeitswert wird in einer jeweils eigenen Datei gespeichert. Diese beiden Dateien werden bei jedem neuen Auslesen des Sensors überschrieben. Zusätzlich wird noch eine weitere Datei angelegt, in der alle Werte des Tages gespeichert werden mit dem Datum des Tages im Dateinamen. In der Datei gibt es 3 Spalten, wobei die erste einen Zeitstempel darstellt, die zweite den Temperaturwert in °C *10 und die letzte den Luftfeuchtigkeitswert in %.
Der erweiterte Code sieht so aus:
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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | #include <wiringPi.h> #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <time.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]); char text[100]; time_t now = time(NULL); struct tm *t = localtime(&now); strftime(text, sizeof(text)-1, "%d-%m-%Y", t); char prefix[50] = "/var/www/log-"; strcat(prefix,text); char suffix[50] = ".csv"; strcat(prefix,suffix); FILE *fp; fp=fopen(prefix,"a"); fprintf(fp,"%u000,%d%d,%d\n",(unsigned)time(NULL),dht11_val[2],dht11_val[3],dht11_val[0]); fclose(fp); FILE *fh; fh=fopen("/var/www/current_hyg.csv", "w"); fprintf(fh,"%d\n",dht11_val[0]); fclose(fh); FILE *ft; ft=fopen("/var/www/current_temp.csv", "w"); fprintf(ft,"%d.%d\n",dht11_val[2],dht11_val[3]); fclose(ft); exit(1); } 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; } |
Im Unterschied zum Code aus dem letzten Tutorial wird hier das Programm nach einem erfolgreichen Abruf der Daten vom Sensor beendet. Dadurch lässt es sich optimal in cronjobs einbinden, um die Werte automatisiert regelmäßig abzufragen.
Um das Programm zu kompilieren, speichert ihr es z.B. unter dem Namen „sensor.c“ auf eurem Banana Pi und kompiliert es via gcc -o sensor sensor.c -L/usr/local/lib –lwiringPi . Anschließend könnt ihr es mit „sudo ./sensor.c“ aufrufen.
2 Anmerkungen noch dazu: Da ich C-Anfänger bin, schmeißt der Compiler mir hier noch eine Warnung. Trotzdem funktioniert das Programm in der gewünschten Weise. Zudem werden die Log-Dateien im Standard-Apache-Verzeichnis für Webseiten abgelegt. Habt ihr noch keinen Webserver eingerichtet (kommt im nächsten Schritt), kann es hier Probleme bei der Speicherung geben.
2. Darstellung der Werte über ein Webinterface
Wie bereits erwähnt, nutze ich als Webinterface das bereits von mir für die Funkthermometer am Raspberry Pi geschriebene Interface. Dieses sieht so aus:Um es zu installieren, müsst ihr erst einen Webserver aufsetzen. Ich nutze dazu Apache. Dieser wird wie folgt installiert:
1 | sudo apt-get install apache2 |
Anschließend müsst ihr euch noch mein Webinterface herunterladen, das ich euch hier gepackt habe.
Dieses müsst ihr nur noch auf eurem BPi entpacken und in das Verzeichnis „/var/www/“ schieben. Wenn ihr jetzt dht11 aufruft, sollten die aktuellen Werte im Browser unter der IP-Adresse des Banana Pi dargestellt werden wie im obigen Screenshot.
Solltet ihr einen anderen Ordner für das Webinterface auswählen, müsst ihr diesen auch in dem Programm „dht11.c“ anpassen und das Programm neu kompilieren.
Und nun: Viel Erfolg und Spaß bei der Umsetzung!
Bei Fragen, Problemen, Anregungen etc. könnt ihr wie immer das Kommentarfeld unten benutzen.
Hallo Alex, ich bin sehr begeistert von deinem Tutorial zur Anwendung und Visualisierung des Sensors DHT 11.
Zur Zeit arbeite ich an der Anpassung deines erweiterten Quellcodes, zur Speicherung der Daten, allerdings für den Nachfolger „DHT 22“.
Da ich allerdings recht ungeübt in der C Programmierung bin, würde ich gerne wissen welcher Teil des QC tatsächlich für die Erstellung der .CSV Dateien verantwortlich ist.
Über eine Antwort würde ich mich sehr freuen.
MfG David
Hey David,
ich muss leider sagen, dass ich selbst ein blutiger Anfänger in C bin und die Erstellung der .csv-Dateien sicher auch eleganter gelöst werden könnte.
Zu deiner Frage: Das reine Öffnen (bzw. erstellen) der entsprechenden Dateien ist in Zeile 58-69 enthalten. Davor bastel ich mir in der if-Schleife aber noch die Timestamps und den Namen der kompletten Log-Datei für jeden Tag.
Hoffe, meine Angaben helfen dir etwas weiter.
Schöne Grüße
Vielen Dank Alex für deinen Kommentar, ich konnte den Code nun entsprechend anpassen. Gerade der Teil in dem du das Datum in den Namen der Log-Dateien schreibst, ist mir ein wenig schleierhaft gewesen. ;)
Nun ich bin mir sicher, dass der C-Code nun lauffähig ist, allerdings bekomme ich beim Kompilieren die folgende Fehlermeldung:
„$ sudo gcc -o Adafruit_DHT Adafruit_DHT.c -L/usr/local/lib -lwiringPi
Adafruit_DHT.c:25:21: fatal error: bcm2835.h: No such file or directory
compilation terminated.“
Für Anregungen wäre ich sehr dankbar.
MfG David
Ich habe das Problem soweit nun selbst lösen können. Es handelte sich dabei um die Initialisierung der for-schleifen-header (z.B. for int i=0). In C-Compilerversionen bis 1999 war diese Schreibweise nicht unterstützt und muss entsprechend getrennt werden, (int i; for i=0;). Warum gerade das mein Verhängnis war kann ich aber leider auch nicht beantworten.
Das nur als kurze Anmerkung, sollte jemand auf ähnliche Probleme stoßen.
Mfg David
Hallo David,
danke für dein Feedback!
Hallo Alex , kann ich theoretisch den dht22 dafür nehmen ?
Hallo Sven,
klar kann auch ein DHT22 verwendet werden, die Auslesefunktion des Programmes muss dann natürlich entsprechend angepasst werden.
ich habe so komische werte , könntes du da bitte einmal unterstützen ?
http://bpi-forum.de/temp/
Hi Sven,
werden die Werte aus den csv-Dateien dargestellt? Oder stehen dort andere Werte drin?
In der current_temp.csv sehe ich nämlich gerade einen anderen Wert, als angezeigt wird.
Also ,ich habe es nun so gemacht ,das ich die Werte extrahiere . das problem ist das der sensor nur 1% luftfeuchtigkeit anzeigt…. ich weiss nciht warum :-(
das 2 te ist ,das ich gerne unten 2 stellig angezegt haben würde , also nicht 8 C ,sondern 7.4 grad ,geht das ? gruss
Hi Alex,
hallo allerseits,
habt ihr schon mal seltsame Werte erhalten? Nach dem ich den BananaPi mit Linux BPI 3.4.111 mit dem DHT22 angebunden habe, Deinen (Alex) dht11.c und sensor.c erstellt, kompiliert und gestartet habe, funktionierte zunächst alles gut bis auf die Ergebnisse von Temp und Humidity. Temperatur wird im Bereich 0.25xx bis 1.9 °C angezeigt (je nach dem ob an einer warmen Stelle oder nicht) und Luftfeuchtigkeit so um die 0.221. Warum stimmen bei mir die werte nicht? den dht11.c Script habe ich auch als dht22.c abgespeichert und alle dht11 Werte als dht22 umbenannt und kompiliert, so kann ich ./dht11 und ./dht22 ausführen – beide Ergebnisse sind „falsch“ – also Hum.- 0.221 und Temp- jetzt 0.250 °C. Im Script kann ich nicht erkennen, wie die Werte zustande kommen. Wer hatte ähnliche Erfahrungen und hat das Problem behoben? Bei Gelegenheit – ich bin völliger Pi und Python Anfänger…. Danke Im Voraus! Marius.
PS: Apache2 und Deine Wohnung Seite funktioniert bei mir… alles gut soweit! Nur die Werte stimmen einfach nicht. Auch wusste ich nicht, dass der Bananian kein sudo und make „vom Werk“ mit am Board hat, so musste ich lediglich apt-get install -y sudo make ausführen, dann klappte es mit WiringBP Installation ;D
cheers!