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;
}