Capacitación Arduino · Temperatura y humedad

DHT11
¿Hace calor
en la sala?

El DHT11 mide temperatura y humedad del aire: el Monitor serie muestra los dos valores y el LED rojo avisa sobre 30 °C. Simulado en Tinkercad y en OpenCircuits.

Monitor serie Umbral Bloques + C++

El componente

Módulo sensor DHT11

S+−DHT11 Cápsula azul LED de encendido Pines S, + y − adentro: un sensor de humedad y un termistor 0 a 50 °C (± 2 °C) · 20 a 90 % (± 5 %) el módulo tiene corriente una sola línea de datos S → D7 + → 5V − → GND
El DHT11 es digital: no se lee con analogRead. Envía 40 bits (humedad y temperatura) por el pin S y se lee con la biblioteca DHT.
Es lento: entrega una lectura nueva cada 2 segundos. Si se le pregunta más seguido, repite la anterior o da error.

Cómo funciona

Una pregunta y 40 bits de respuesta

Arduino DHT11 un solo cable de datos (S → D7) 1 · Arduino pregunta 2 · El DHT11 responde con 40 bits humedad · temperatura · controlpulso corto = 0, pulso largo = 1
  1. El Arduino baja la línea S un momento: es la pregunta.
  2. El DHT11 contesta con 40 bits: humedad, temperatura y una suma para revisar errores.
  3. La biblioteca DHT traduce eso a readTemperature() y readHumidity().
  4. El programa lo muestra en el Monitor serie y enciende el LED rojo sobre 30 °C.

Truco de simulación

Tinkercad no tiene el DHT11

En el kit real

S+−DHT11 Arduino S → D7+ → 5V− → GND

Un solo módulo entrega temperatura y humedad por el pin S, con la biblioteca DHT.

En Tinkercad: lo armamos por partes

Parte del kitLa reemplazamos conArduino
TemperaturaSensor de temperatura TMP36 (sí existe en Tinkercad)A0
HumedadPotenciómetro
0 a 100 % con «asignar al rango»
A1
Biblioteca DHTBloques «leer el sensor de temperatura» y «leer pin analógico»—
LEDs de avisoLED verde (bien) y LED rojo (calor), con 220 ΩD4 · D6
El TMP36 es analógico (un voltaje) y el DHT11 es digital (40 bits), pero el programa hace lo mismo: leer, mostrar y comparar con 30 °C.

Paso 1 · Componentes

Búscalos en el panel de componentes de Tinkercad

Arduino Uno R3 ×1

Buscar: Arduino

Placa de pruebas pequeña ×1

Buscar: Placa de pruebas

Sensor de temperatura [TMP36] ×1

Buscar: temperatura. Hace de temperatura.

Potenciómetro ×1

Hace de humedad (0 a 100 %).

Resistencias 220 Ω ×2

Una para cada LED.

LED verde ×1

Temperatura bien.

LED rojo ×1

¡Calor! Sobre 30 °C.

El TMP36 va con la cara plana hacia ti: pata izquierda a +, centro a A0, derecha a −. Al revés se calienta y mide mal.

Paso 2 · Circuito

Así se ve en Tinkercad

🔥 Calor 24 °C
💧 Humedad (potenciómetro) 55 %

      

Paso 2 · Conexiones

Conexión por conexión

Alimentación
Arduino 5VRiel + inferior
Arduino GNDRiel − inferior
Temperatura (TMP36, fila e, cara plana al frente)
—TMP36 + / señal / −Columnas 24, 25, 26
Columna 24Riel +
Columna 26Riel −
Columna 25Arduino A0
Humedad (potenciómetro)
—Potenciómetro (fila e)Columnas 18, 19, 20
Columna 18 / 20Riel − / +
Columna 19 (cursor)Arduino A1
LED verde · temperatura bien
—LED cátodo / ánodo (fila e)Columna 3 / 4
—220 ΩColumna 4 → 8 (fila c)
Arduino D4Columna 8
Columna 3Riel −
LED rojo · calor
—LED cátodo / ánodo (fila e)Columna 10 / 11
—220 ΩColumna 11 → 15 (fila c)
Arduino D6Columna 15
Columna 10Riel −
Todo va en los rieles de abajo (+ y −). La pata doblada del LED es el ánodo (+).

Paso 3 · Código en bloques

Arrastra estos bloques · todo dentro de «siempre»

Antes de empezar

Variables → Crear variable: temperatura y humedad.

Para ver los valores: Código → Monitor en serie (abajo, en el panel de código).
Entradaleer el sensor de temperatura, leer pin analógico
Matemáticasasignar al rango, comparar ( > )
Salidaimprimir en monitor serie, definir pin
Controlsiempre, si / si no, esperar

Paso 3 · Código C++

El mismo programa en texto

// C++ code
//
int temperatura = 0;

int humedad = 0;

void setup()
{
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  Serial.begin(9600);
  pinMode(6, OUTPUT);
  pinMode(4, OUTPUT);
}
En Tinkercad: Código → Bloques → Texto. Acepta el aviso, borra lo que haya y pega.
void loop()
{
  temperatura = (-40 + 0.488155 * (analogRead(A0) - 20));
  humedad = map(analogRead(A1), 0, 1023, 0, 100);
  Serial.print("Temperatura: ");
  Serial.print(temperatura);
  Serial.print(" C  Humedad: ");
  Serial.print(humedad);
  Serial.println(" %");
  if (temperatura > 30) {
    digitalWrite(6, HIGH);
    digitalWrite(4, LOW);
  } else {
    digitalWrite(6, LOW);
    digitalWrite(4, HIGH);
  }
  delay(1000); // Wait for 1000 millisecond(s)
}

Paso 4 · Simular

¡A probar!

  1. Pulsa Iniciar simulación y abre el Monitor en serie: aparece la temperatura y la humedad cada segundo.
  2. Haz clic en el TMP36: aparece su barra de temperatura. Súbela sobre 30 °C: se enciende el LED rojo.
  3. Bájala: vuelve el verde.
  4. Gira el potenciómetro: cambia la humedad del monitor.

Si algo no funciona

Temperatura rara (−40 o 125)El TMP36 está al revés o la señal no va a A0.
Monitor vacíoFalta abrir el Monitor en serie o el programa no se está simulando.
Humedad no cambiaRevisa el cable de la columna 19 a A1.
Ningún LED enciendeRevisa la orientación (pata doblada = ánodo, hacia la resistencia).

Paso 5 · Kit real

Del simulador al DHT11 real

Cambia el TMP36 y el potenciómetro por el DHT11

DHT11Arduino
S (datos)D7
+5V
−GND

En el Arduino IDE instala la biblioteca DHT sensor library (de Adafruit; acepta instalar también Adafruit Unified Sensor): Programa → Incluir biblioteca → Administrar bibliotecas.

El cambio en el código

Arriba de todo agrega la biblioteca y el sensor; en setup(), dht.begin();. Las dos lecturas quedan así:

#include <DHT.h>
DHT dht(7, DHT11);
...
temperatura = dht.readTemperature();
humedad = dht.readHumidity();
delay(2000);   // el DHT11 mide cada 2 s

El código completo, ya listo, es el de OpenCircuits (diapositiva 12 → Código).

Alternativa · OpenCircuits

En OpenCircuits está el DHT11 del kit

S+−DHT11
🔥 Calor 24 °C
💧 Humedad 55 %

          Iniciar.bat → SensoresSensor DHT11 · Termómetro
        

Los bloques nuevos

La categoría DHT11 usa la biblioteca DHT: un bloque muestra temperatura y humedad en el Monitor serie y otro compara la temperatura. No hacen falta variables.

DHT11DHT11 pin 7: mostrar temperatura y humedad · ¿temperatura mayor que 30 °C?
Controlsiempre, esperar 2 s, si / si no
Salidadefinir pin 4 / 6 en ALTA o BAJA

La espera de 2 s va primero: el DHT11 no da lecturas más seguido.

// C++ code
//
#include <DHT.h>

DHT dht_7(7, DHT11);

void setup()
{
  dht_7.begin();
  Serial.begin(9600);
  pinMode(6, OUTPUT);
  pinMode(4, OUTPUT);
}
void loop()
{
  delay(2000); // Wait for 2000 millisecond(s)
  Serial.print("Temperatura: ");
  Serial.print(dht_7.readTemperature(), 1);
  Serial.print(" C  Humedad: ");
  Serial.print(dht_7.readHumidity(), 0);
  Serial.println(" %");
  if (dht_7.readTemperature() > 30) {
    digitalWrite(6, HIGH);
    digitalWrite(4, LOW);
  } else {
    digitalWrite(6, LOW);
    digitalWrite(4, HIGH);
  }
}
Este texto lo escribe OpenCircuits a partir de los bloques. Es el programa del kit real: necesita la biblioteca DHT sensor library.

Para seguir

Retos

1 · Aire seco

Agrega un LED azul que se encienda si la humedad baja de 40 %.

2 · En pantalla

Muestra temperatura y humedad en la LCD I2C en vez del Monitor serie.

3 · Ventilador

Sobre 30 °C, enciende un motor (ventilador) en vez del LED rojo.

4 · Máxima del día

Guarda la temperatura más alta medida y muéstrala junto a la actual.

← → para avanzar · + − acercar el circuito · F pantalla completa