DHT11 Temperature and Humidity Sensor KY-015
The DHT11 sensor combines temperature and humidity in a compact design. It measures temperatures from 0°C to 50°C with an accuracy of ±2°C and relative humidities from 20% to 90% with an accuracy of ±5%. Thanks to its low sampling rate, the sensor only provides new readings every two seconds, making it ideal for long-term measurements. The DHT11 is easy to integrate into microcontroller platforms such as Arduino and Raspberry Pi and requires no additional calibration thanks to its factory calibration. Its robust design and reliability make it the ideal choice for continuous monitoring projects such as greenhouses, HVAC systems, and warehouse monitoring.
This is the code I used:
const int DHpin = 2; // Usa GPIO2 (ajústalo según tu conexión)
byte dat[5]; // Almacena datos [hum_ent, hum_dec, temp_ent, temp_dec, checksum]
void setup() {
Serial.begin(115200);
pinMode(DHpin, OUTPUT);
digitalWrite(DHpin, HIGH); // Inicia el bus en alto
}
byte read_data() {
byte result = 0;
for (int i = 0; i < 8; i++) {
while (digitalRead(DHpin) == LOW); // Espera hasta que el pin esté alto
delayMicroseconds(30); // Duración crítica para distinguir 0/1
if (digitalRead(DHpin) == HIGH) // Si sigue alto después de 30us, es un 1
result |= (1 << (7 - i)); // Almacena el bit (MSB first)
while (digitalRead(DHpin) == HIGH); // Espera a que termine el bit
}
return result;
}
void start_test() {
// 1. Envía señal de inicio
digitalWrite(DHpin, LOW);
delay(20); // >18ms para DHT11 (no 30ms para evitar timeouts)
digitalWrite(DHpin, HIGH);
delayMicroseconds(40); // Espera respuesta
// 2. Configura el pin como entrada y espera respuesta
pinMode(DHpin, INPUT);
while (digitalRead(DHpin) == HIGH); // Espera a que DHT11 ponga LOW
delayMicroseconds(80); // LOW durante 80us (respuesta)
// 3. Lee los 40 bits de datos (5 bytes)
for (int i = 0; i < 5; i++)
dat[i] = read_data();
// 4. Finaliza la comunicación
pinMode(DHpin, OUTPUT);
digitalWrite(DHpin, HIGH);
}
void loop() {
start_test();
// Verifica checksum
byte checksum = dat[0] + dat[1] + dat[2] + dat[3];
if (dat[4] != checksum) {
Serial.println("Error de checksum!");
return;
}
// Imprime datos
Serial.print("Humedad: ");
Serial.print(dat[0]); // Parte entera humedad
Serial.print(".");
Serial.print(dat[1]); // Parte decimal humedad
Serial.println("%");
Serial.print("Temperatura: ");
Serial.print(dat[2]); // Parte entera temperatura
Serial.print(".");
Serial.print(dat[3]); // Parte decimal temperatura
Serial.println("°C");
delay(2000); // Espera 2 segundos entre lecturas
}