Arduino > DHT11
Mesure de l'humidité relative et de la température en degrés celcius.
Fiche technique: dht11.pdf
/* Envoi par ASCII de la temperature et de l'humidité mesurée par un dth11. Réalisé par Thomas O Fredericks. Basé sur le code de: rob.tillaart@removethisgmail.com George Hadjikyriacou http://arduino.cc/playground/Main/DHT11Lib */ // Intervalle de temps entre deux envois de message. int interval = 20; // La broche du dht11. int dht11Pin = 14; int humidity; int temperature; void setup() { // Initialiser la communication série à 57600 baud. Serial.begin(57600); } void loop() { // Exécuter le code suivant seulement si l'intervalle de temps // s'est écoulé: delay(interval); int error = dht11Read(dht11Pin); if ( error == 0 ) { // Construction du message de l'humidité: Serial.print("h"); // Envoi de la chaîne de caractères "d2" pour identifier la valeur. Serial.print(' '); // Envoi du caractère «espace» pour séparer l'indentifiant de la valeur. Serial.print(humidity, DEC); // Envoi de la valeur. Serial.println(); // Envoi de l'indicateur de terminaison du message (retour à la ligne et retour de chariot) // Construction du message de la température: Serial.print("t"); // Envoi de la chaîne de caractères "d2" pour identifier la valeur. Serial.print(' '); // Envoi du caractère «espace» pour séparer l'indentifiant de la valeur. Serial.print(temperature, DEC); // Envoi de la valeur. Serial.println(); // Envoi de l'indicateur de terminaison du message (retour à la ligne et retour de chariot) } } int dht11Read(int pin) { // BUFFER TO RECEIVE uint8_t bits[5]; uint8_t cnt = 7; uint8_t idx = 0; // EMPTY BUFFER for (int i=0; i< 5; i++) bits[i] = 0; // REQUEST SAMPLE pinMode(pin, OUTPUT); digitalWrite(pin, LOW); delay(18); digitalWrite(pin, HIGH); delayMicroseconds(40); pinMode(pin, INPUT); // ACKNOWLEDGE or TIMEOUT unsigned int loopCnt = 10000; while(digitalRead(pin) == LOW) if (loopCnt-- == 0) return -2; loopCnt = 10000; while(digitalRead(pin) == HIGH) if (loopCnt-- == 0) return -2; // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT for (int i=0; i<40; i++) { loopCnt = 10000; while(digitalRead(pin) == LOW) if (loopCnt-- == 0) return -2; unsigned long t = micros(); loopCnt = 10000; while(digitalRead(pin) == HIGH) if (loopCnt-- == 0) return -2; if ((micros() - t) > 40) bits[idx] |= (1 << cnt); if (cnt == 0) // next byte? { cnt = 7; // restart at MSB idx++; // next byte! } else cnt--; } // WRITE TO RIGHT VARS // as bits[1] and bits[3] are allways zero they are omitted in formulas. humidity = bits[0]; temperature = bits[2]; uint8_t sum = bits[0] + bits[2]; if (bits[4] != sum) return -1; return 0; }