DHT11-Sensor:
Der DHT11-Feuchtigkeitssensor misst Feuchtigkeit und Temperatur und ist das Hauptbauteil der Wetterstation. Über einen kapazitiven Feuchtigkeitssensor und widerstandsbasierten Temperatursensor werden die Messwerte aus der Umgebung erfasst. Über den DATA-Pin am DHT11 können die Messwerte ausgelesen und verarbeitet werden.
Je nach Bauart muss noch ein 10kOhm Pullup-Widerstand verwendet werden.
Anschliessend hat es zwei Programme. Ein Programm verarbeitet die Messwerte des DHT11 mit Hilfe einer Library, das andere Programm nicht.
///////////////////////////////////*DEFINITIONEN*/////////////////////////////////// /*DHT 11*/ #define DHT11_OUT 13 //Der DHT11 wird am Pin13 angeschlossen #define YES 1 #define NO 0 int ErrorReceived = NO; byte DatenDHT11[5]; ///////////////////////////////////*SETUP*/////////////////////////////////// void setup(){ Serial.begin(9600); //Startet die serielle Kommunikation } ///////////////////////////////////*LOOP*/////////////////////////////////// void loop(){ /*DHT 11*/ ReadDHT11(); //Startet eine Funktion, in der der DHT11 ausgelesen wird seriellerMonitor(); //Startet eine Funktion, in der die Daten des DHT11 im seriellen Monitor angezeigt werden } ///////////////////////////////////*WEITERE FUNKTIONEN*/////////////////////////////////// /*PEGELWECHSELKONTROLLE*/ //In dieser Funktion wird geprüft, ob ein Pegelwechsel am DHT11 stattgefunden hat int Levelchange(int pin, int level){ int cnt = 1000; int LevelSwitched = YES; while (digitalRead(pin) == level){ cnt--; if (cnt == 0){ LevelSwitched = NO; break; } } return LevelSwitched; } /*SENSOR AUSLESEN*/ //In dieser Funktion wird der DHT11 Schritt für Schritt ausgelesen. Die Pegelwechsel werden zeitlich registriert und in einer Matrix abgespeichert. Am Ende wird noch geprüft, ob die gespeicherten Daten Sinn machen. void ReadDHT11(){ ErrorReceived = NO; for (int i = 0; i < 5; i++){ DatenDHT11[i] = 0;} pinMode(DHT11_OUT, OUTPUT); digitalWrite(DHT11_OUT, LOW); delay(20); digitalWrite(DHT11_OUT, HIGH); delayMicroseconds(40); pinMode(DHT11_OUT, INPUT); if (Levelchange(DHT11_OUT, LOW) == NO){ ErrorReceived = YES; return; } if (Levelchange(DHT11_OUT, HIGH) == NO){ ErrorReceived = YES; return; } int indexImByte = 7; int byteIndex = 0; for (int i = 0; i < 40; i++){ if (Levelchange(DHT11_OUT, LOW) == NO){ ErrorReceived = YES; return; } unsigned long startDatenBit = micros(); if (Levelchange(DHT11_OUT, HIGH) == NO){ ErrorReceived = YES; return; } unsigned long endDatenBit = micros(); if (endDatenBit - startDatenBit > 30){ byte number = 1; byte ByteNumber = number << indexImByte; byte currentByteNumber = DatenDHT11[byteIndex]; byte newNumber = ByteNumber | currentByteNumber; DatenDHT11[byteIndex] = newNumber; } if (indexImByte > 0){ indexImByte--; } else{ byteIndex++; indexImByte = 7; } } int pruefSumme = DatenDHT11[0] + DatenDHT11[1] + DatenDHT11[2] + DatenDHT11[3]; byte hintere8BitsDerPruefsumme = (byte)pruefSumme; if (hintere8BitsDerPruefsumme != DatenDHT11[4]){ ErrorReceived = YES; return; } } void seriellerMonitor(){ //In dieser Funktion wird die Luftfeuchtigkeit und die Temperatur des DHT11 im seriellen Monitor angezeigt. Zudem werden Lesefehler gemeldet if (ErrorReceived == YES){ Serial.println("Lesefehler"); } else{ int hum = DatenDHT11[0]; //Hier wird die Luftfeuchtigkeit aus der Datenmatrix in die Variable hum abgespeichert int temp = DatenDHT11[2]; //Hier wird die Temperatur aus der Datenmatrix in die Variable temp abgespeichert Serial.print("Die Temperatur beträgt "); Serial.print(temp); Serial.println(" Grad Celsius"); Serial.print("Die relative Luftfeuchte beträgt "); Serial.print(hum); Serial.println(" %"); } delay(1000); }
///////////////////////////////////*DEFINITIONEN*/////////////////////////////////// /*DHT 11*/ #include <DHT.h> //DHT11-Bibliothek wird eingebunden #define DHTPIN 13 //Der DHT11 wird am Pin13 angeschlossen #define DHTTYPE DHT11 //Hier wird angegeben, dass der verwendete DHT ein DHT11 ist DHT dht(DHTPIN, DHTTYPE); //Der DHT wird initialisiert int hum = 0; //Zu Beginn wird die Variable hum auf 0 gesetzt int temp = 0; //Zu Beginn wird die Variable temp auf 0 gesetzt ///////////////////////////////////*SETUP*/////////////////////////////////// void setup() { Serial.begin(9600); //Startet die serielle Kommunikation /*DHT 11*/ dht.begin(); //Startet den DHT } ///////////////////////////////////*LOOP*/////////////////////////////////// void loop() { /*DHT 11*/ hum = dht.readHumidity(); //Hier wird die Luftfeuchtigkeit aus der Datenmatrix in die Variable hum abgespeichert temp = dht.readTemperature(); //Hier wird die Temperatur aus der Datenmatrix in die Variable temp abgespeichert seriellerMonitor(); //Startet eine Funktion, in der die Daten des DHT11 im seriellen Monitor angezeigt werden } ///////////////////////////////////*WEITERE FUNKTIONEN*/////////////////////////////////// /*DHT 11*/ void seriellerMonitor(){ //In dieser Funktion wird die Luftfeuchtigkeit und die Temperatur des DHT11 im seriellen Monitor angezeigt. Serial.print("Die Temperatur beträgt "); Serial.print(temp); Serial.println(" Grad Celsius"); Serial.print("Die relative Luftfeuchte beträgt "); Serial.print(hum); Serial.println(" %"); delay(1000); }