le DHT11 est un capteur température -humidité idéal pour réaliser une petite station météo en complément d’autres capteurs . il n’a que 3 broches pour ses fonctions de type analogiques et en fait quand on regarde la datasheet , on découvre qu’il utilise un simili protocole série sur sa patte de données. protocole qui necessite une bibliotheque spécipique pour pouvoir exploiter les données qui arrivent . il existe plusieurs bibliotheque pour ce capteur, dans les exemples plus bas nous en utiliserons 2 differentes.
protocole de données
L’état par défaut de la broche DATA est Haut. Lorsque la communication entre MCU et DHT11 commence, MCU abaisse la broche DATA pendant au moins 18 ms. Ensuite, le MCU remonte la broche DATA a l’etat haut pendant 20 à 40us pour attendre la réponse de DHT11.
Une fois que le DHT11 détecte le signal de démarrage, il abaissera la broche DATA en tant que «Signal de réponse», qui durera 80us. Ensuite, DHT11 remonte la broche DATA pour 80us et se préparera à l’envoi de données. Pendant la transition de données, chaque bit de données commence par le niveau de basse tension 50us et se termine par un signal de niveau de tension élevé. La longueur du signal de niveau de tension élevée détermine si le bit est «0» ou «1». Le bit de données «0» a une longueur haute de 26-28us, Alors que le bit de données «1» a une longueur haute de 70 us
Programme avec bibliotheque et moniteur serie ( kit ELEGOO)
librairie DHT11 ELOGOO:
programme ARDUINO
#include <dht_nonblocking.h>
#define DHT_SENSOR_TYPE DHT_TYPE_11
//#define DHT_SENSOR_TYPE DHT_TYPE_21
//#define DHT_SENSOR_TYPE DHT_TYPE_22
static const int DHT_SENSOR_PIN = 2;
DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE );
void setup( ) {
Serial.begin( 9600);
}
static bool measure_environment( float *temperature, float *humidity ) {
static unsigned long measurement_timestamp = millis( );
if( millis( ) - measurement_timestamp > 3000ul ) {
if( dht_sensor.measure( temperature, humidity ) == true ) {
measurement_timestamp = millis( );
return( true );
}
}
return( false );
}
void loop( ) {
float temperature;
float humidity;
if( measure_environment( &temperature, &humidity ) == true ) {
Serial.print( "T = " );
Serial.print( temperature, 1 );
Serial.print( " deg. C, H = " );
Serial.print( humidity, 1 );
Serial.println( "%" );
}
}
Programme avec bibliotheque et ecran LCD (bibliotheque du KIT ELEGOO)
#include <dht_nonblocking.h>
#include <LiquidCrystal.h>
#define DHT_SENSOR_TYPE DHT_TYPE_11
static const int DHT_SENSOR_PIN = 2;
DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE );
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
void setup( ) {
Serial.begin( 9600);
lcd.begin(16, 2);
}
static bool measure_environment( float *temperature, float *humidity ) {
static unsigned long measurement_timestamp = millis( );
if( millis( ) - measurement_timestamp > 3000ul ) {
if( dht_sensor.measure( temperature, humidity ) == true ) {
measurement_timestamp = millis( );
return( true );
}
}
return( false );
}
void loop( ) {
float temperature;
float humidity;
if( measure_environment( &temperature, &humidity ) == true ) {
lcd.setCursor(0,0);
lcd.print( "Temp: " );
lcd.print( temperature,1);
lcd.setCursor(0,1);
lcd.print("Humidity: ");
lcd.print( humidity, 1 );
lcd.print( "%" );
delay(500);
}
}