Avisar cuándo ventilar por temperatura
Recorrido del nivel
Esa barra de arriba te dice en qué paso estás. Tocala para ver el índice completo y saltar a cualquier paso.
Fabricar la estructura del invernadero
Para empezar, armamos la maqueta del invernadero. Consiste en una estructura base recubierta por un material translúcido que permita el paso de los rayos solares (por ejemplo, vidrio o polietileno), para que deje entrar la luz y retenga el calor. Además, el invernadero debe contar con alguna abertura que permita ventilarlo cuando la temperatura interna sea demasiado alta: es la que el aviso del LED nos va a decir cuándo abrir.
Esta parte es de fabricación. Los archivos de la maqueta (corte láser en MDF y piezas impresas en 3D para sostener el sensor y el LED) forman parte de los paquetes de fabricación del proyecto, que se descargan desde su ficha. Mientras tanto, la estructura puede construirse con materiales simples: una caja o marco cubierto con film o acetato transparente, con una tapa o ventana que se pueda abrir.
Montar el circuito del LED en la protoboard
Vamos a construir el sistema que avisa cuándo ventilar. Empezamos por el indicador: un LEDLEDComponente electrónico tipo diodo que emite luz. Tiene polaridad: la pata larga es la positiva y la corta (o el lado plano del encapsulado) la negativa. Conectado al revés no se daña, pero no enciende. verde montado en la protoboardProtoboardPlaca experimental para el prototipado rápido de circuitos: sus orificios permiten insertar y conectar componentes sin soldadura. Las líneas superior e inferior recorren la placa de punta a punta y suelen usarse para la alimentación.. Más adelante, ese mismo LED va a parpadear cuando el sensor detecte demasiado calor.
El LED tiene polaridad: la pata larga es la positiva y va, por un cable, al pin de la placa; la pata corta (negativa) va a masa a través de una resistenciaResistenciaComponente que se opone al paso de la corriente eléctrica. Su valor se mide en ohm (Ω). Se usa para determinar la cantidad de corriente de una rama del circuito, por ejemplo para evitar que un LED se queme por exceso de corriente. de 220 Ω, que limita la corriente para que el LED no se dañe. El otro extremo de esa resistencia se conecta a la línea negativa de la protoboard, y esa línea al terminal GND de la placa.
En el Arduino UNO seguimos el esquema original: la pata larga del LED va al pin 13 (la
constante PIN_LED_VENTILACION del código del paso 4). El pin 13 tiene, además, un LED
integrado en la propia placa, útil para probar el aviso aunque todavía no hayas puesto el LED
externo.
En el ESP32 usamos un LED externo conectado al GPIO 16 (la constante
PIN_LED_VENTILACION del código del paso 4). No usamos el LED integrado del DevKit, que está en
el GPIO 2: ese es un strapping pin que interviene en el arranque de la placa y conviene dejarlo
libre. El ESP32 trabaja a 3,3 V, así que la resistencia de 220 Ω es más que suficiente.
La programación la haremos directamente en el lenguaje de Arduino (C++), con el Arduino IDE
en su versión 2.x, que se descarga gratis desde
arduino.cc/en/software. Un programa de Arduino se llama
sketch y tiene dos bloques: setup(), que se ejecuta una sola vez al encender, y loop(),
que se ejecuta repetidamente después. Todo lo que sigue a // es un comentario: no afecta al
programa, sirve para que el código sea más fácil de leer.
El aviso más simple posible es hacer parpadear el LED: en el código, poner su pin en estado
ALTO (HIGH) lo enciende y ponerlo en BAJO (LOW) lo apaga; intercalando esperas entre uno y
otro, el LED titila. Sobre esta idea básica vamos a construir el programa del paso 4, donde el
parpadeo dejará de ser constante y pasará a depender de la temperatura.
Conectar el sensor de temperatura y humedad (DHT11)
Ahora sumamos el sensor que mide el ambiente: el sensor DHT11Sensor DHT11Sensor digital que mide temperatura y humedad del aire en un mismo integrado. Digitaliza la lectura internamente y la entrega por un pin digital (no es analógico: no va a A0). Necesita una librería para leerlo y no admite más de una lectura por segundo., que registra la temperatura y la humedad del aire.
Un dato importante: el DHT11 es un sensor digital. A diferencia de un sensor analógico (como un higrómetro, que se conecta a una entrada A0–A5), el DHT11 tiene electrónica interna que digitaliza la medición y la transmite a la placa como un paquete de datos por un pin digital. Por eso no va a A0: va a un pin digital, y para leerlo hace falta una librería que gestione esa comunicación (la instalamos en un momento).
El DHT11 tiene tres conexiones útiles: alimentación (VCC y GND) y datos.
En el Arduino UNO seguimos el esquema original: el pin de datos del DHT11 va al pin digital 2
(la constante PIN_DHT del código), VCC al pin 5V y GND a GND.
En el ESP32 la conexión es equivalente, con un cuidado propio de la placa: el pin de datos del
DHT11 va al GPIO 4 (la constante PIN_DHT del código) y la alimentación se toma de 3,3 V
(no de 5 V) y GND. El DHT11 funciona sin problemas a 3,3 V.
Para poder leer el sensor necesitamos instalar su librería. En el Arduino IDE 2.x abrimos el
Gestor de bibliotecas (el ícono de los libritos en la barra lateral), buscamos “DHT sensor
library” de Adafruit y la instalamos; el IDE ofrecerá instalar también su dependencia
“Adafruit Unified Sensor”: aceptá, porque el sensor no funciona sin ella. Esta librería
reemplaza a la vieja DHT.h genérica del original, que ya no se consigue igual.
Programar el aviso de ventilación por temperatura
Con el circuito armado, editamos el programa para que el LED parpadee solo cuando la
temperatura supere un umbral. Ese umbral está en la constante UMBRAL_TEMP_C al comienzo del
código, cargada con el valor del original: 25 °C. En cada vuelta de loop(), el programa lee
la temperatura del DHT11 y, si supera UMBRAL_TEMP_C, hace titilar el LED (medio segundo
encendido, medio segundo apagado); si no la supera, deja el LED apagado.
Hay un detalle del sensor que marca el ritmo del programa: el DHT11 no admite más de una
lectura por segundo. Por eso, entre medición y medición el programa espera con delay() el
tiempo de la constante INTERVALO_MEDICION_MS, que está en 2 segundos (un margen seguro; la
librería de Adafruit, además, guarda la última lectura durante 2 segundos). En este primer nivel
usar delay() es lo más simple y hace que el código se lea igual que su comportamiento; en el
nivel avanzado lo cambiaremos.
Ver el código completo · ventilacion-por-temperatura.ino
// Aviso de ventilación por temperatura: un sensor DHT11 mide la temperatura
// del aire del invernadero y, cuando supera el umbral, un LED PARPADEA para
// avisar que hay que ventilar. Mientras la temperatura esté por debajo del
// umbral, el LED queda apagado.
//
// ¿Por qué parpadea y no queda fijo? Así lo plantea el original: un LED que
// titila llama más la atención que uno encendido de forma continua. En el
// nivel avanzado, ya con pantalla y monitoreo, el aviso evoluciona a
// encendido fijo (encendido = ventilar / apagado = todo en orden).
//
// Plataforma: Arduino UNO.
// Conexión (la del esquema original): dato del DHT11 → pin 2; pata larga
// (positiva) del LED → pin 13, con su resistencia a GND. El pin 13 tiene
// además el LED integrado de la placa, útil para probar sin LED externo.
//
// Basado en: Fragmento de código del Nivel Inicial (Paso 6) — Invernadero
// Inteligente, Saberes Digitales (INET/EDUCAR 2019)
// Modernización: (1) se reemplazó el C generado por mBlock3 (_delay, _loop)
// por C++ idiomático con constantes nombradas. (2) Se usa la librería "DHT
// sensor library" de Adafruit (instalar desde el Library Manager; arrastra
// como dependencia "Adafruit Unified Sensor"), que reemplaza a la vieja
// "DHT.h" genérica del original — ya no se consigue igual. Requiere
// dht.begin() en setup(), que el código viejo no llamaba.
#include "DHT.h"
// Pin de datos del sensor y tipo de sensor (DHT11).
const int PIN_DHT = 2;
#define DHTTYPE DHT11
// LED indicador de "hay que ventilar".
const int PIN_LED_VENTILACION = 13;
// Umbral del original: por encima de 25 °C hay que ventilar.
const float UMBRAL_TEMP_C = 25.0;
// Tiempos del parpadeo del aviso (medio segundo encendido, medio apagado),
// como en el original.
const unsigned long PARPADEO_ENCENDIDO_MS = 500;
const unsigned long PARPADEO_APAGADO_MS = 500;
// El DHT11 no admite más de una lectura por segundo (es su límite físico).
// Medimos cada 2 s: margen seguro, y la librería de Adafruit además cachea
// la lectura durante 2 s. El original pedía 1 s; 2 s es el valor honesto
// para este sensor.
const unsigned long INTERVALO_MEDICION_MS = 2000;
// Creamos el objeto del sensor: pin de datos + tipo.
DHT dht(PIN_DHT, DHTTYPE);
void setup() {
pinMode(PIN_LED_VENTILACION, OUTPUT);
// La librería de Adafruit necesita esta inicialización (la vieja no).
dht.begin();
}
void loop() {
// readTemperature() devuelve la temperatura en grados Celsius.
float temperatura = dht.readTemperature();
if (temperatura > UMBRAL_TEMP_C) {
// Demasiado calor: un parpadeo del LED para avisar que hay que ventilar.
digitalWrite(PIN_LED_VENTILACION, HIGH);
delay(PARPADEO_ENCENDIDO_MS);
digitalWrite(PIN_LED_VENTILACION, LOW);
delay(PARPADEO_APAGADO_MS);
}
// Si la temperatura no supera el umbral, el LED simplemente queda apagado
// (no se toca, y quedó en LOW del parpadeo anterior o del arranque).
// Espera entre mediciones (respeta el límite del DHT11). En este nivel
// usamos delay(): es la herramienta que ya conocemos y hace que el
// programa se lea de arriba hacia abajo igual que su comportamiento.
delay(INTERVALO_MEDICION_MS);
} // Aviso de ventilación por temperatura: un sensor DHT11 mide la temperatura
// del aire del invernadero y, cuando supera el umbral, un LED PARPADEA para
// avisar que hay que ventilar. Mientras la temperatura esté por debajo del
// umbral, el LED queda apagado.
//
// ¿Por qué parpadea y no queda fijo? Así lo plantea el original: un LED que
// titila llama más la atención. En el nivel avanzado el aviso evoluciona a
// encendido fijo.
//
// Plataforma: ESP32 (DevKit v1).
// Conexión: dato del DHT11 → GPIO 4; pata larga (positiva) del LED → GPIO 16,
// con su resistencia a GND.
// Decisión de plataforma: se usa un LED EXTERNO en GPIO 16, no el LED
// integrado del DevKit (GPIO 2). Motivo: el GPIO 2 es un "strapping pin"
// (interviene en el arranque de la placa) y conviene dejarlo libre; además,
// el indicador de "ventilar" se ve mejor como un LED discreto montado en el
// invernadero. Documentado también en el README.
// Nota eléctrica: el ESP32 trabaja a 3,3 V (no 5 V como el UNO); el DHT11
// funciona bien a 3,3 V.
//
// Basado en: Fragmento de código del Nivel Inicial (Paso 6) — Invernadero
// Inteligente, Saberes Digitales (INET/EDUCAR 2019)
// Modernización: (1) C++ idiomático con constantes nombradas en vez del C
// de mBlock3; portado a ESP32. (2) Librería "DHT sensor library" de Adafruit
// (instalar desde el Library Manager con su dependencia "Adafruit Unified
// Sensor"), que reemplaza la vieja "DHT.h" del original y requiere
// dht.begin() en setup().
#include "DHT.h"
// Pin de datos del sensor y tipo de sensor (DHT11).
const int PIN_DHT = 4;
#define DHTTYPE DHT11
// LED externo indicador de "hay que ventilar".
const int PIN_LED_VENTILACION = 16;
// Umbral del original: por encima de 25 °C hay que ventilar.
const float UMBRAL_TEMP_C = 25.0;
// Tiempos del parpadeo del aviso, como en el original.
const unsigned long PARPADEO_ENCENDIDO_MS = 500;
const unsigned long PARPADEO_APAGADO_MS = 500;
// El DHT11 no admite más de una lectura por segundo; medimos cada 2 s
// (margen seguro; la librería de Adafruit además cachea 2 s).
const unsigned long INTERVALO_MEDICION_MS = 2000;
// Objeto del sensor: pin de datos + tipo.
DHT dht(PIN_DHT, DHTTYPE);
void setup() {
pinMode(PIN_LED_VENTILACION, OUTPUT);
dht.begin();
}
void loop() {
// readTemperature() devuelve la temperatura en grados Celsius.
float temperatura = dht.readTemperature();
if (temperatura > UMBRAL_TEMP_C) {
// Demasiado calor: un parpadeo del LED para avisar que hay que ventilar.
digitalWrite(PIN_LED_VENTILACION, HIGH);
delay(PARPADEO_ENCENDIDO_MS);
digitalWrite(PIN_LED_VENTILACION, LOW);
delay(PARPADEO_APAGADO_MS);
}
// Si la temperatura no supera el umbral, el LED queda apagado.
// Espera entre mediciones (respeta el límite del DHT11).
delay(INTERVALO_MEDICION_MS);
} Podés ver el comportamiento —la temperatura subiendo y el LED que empieza a parpadear al pasar el umbral— en el simulador, antes de armar el circuito real:
Simulación del comportamiento
La misma máquina de estados del firmware, portada a TypeScript, maneja el
comportamiento del dispositivo. No se ejecuta el binario real: la ejecución
del .hex con avr8js está en el roadmap.
Simulación lista. Presioná «Iniciar» para arrancar la secuencia.
Para subir el código a la placa, conectala a la computadora con el cable USB, elegí en el Arduino IDE 2.x la placa y el puertoPuerto COMPuerto de comunicaciones por el cual el sistema operativo se comunica con un dispositivo externo, como la placa. Se asigna automáticamente al conectarla por USB y puede cambiar de número; en el IDE hay que indicar cuál usar. (en el IDE 2.x se eligen juntos en el menú desplegable de la barra superior) y apretá el botón Subir (la flecha →). Al terminar, aparece el mensaje de carga completada en la barra inferior.
Para el Arduino UNO: usá el cable USB tipo B, elegí la placa Arduino UNO y el puerto que se
agregó al conectarla (en Windows es un puerto COM numerado; en Linux suele llamarse
/dev/ttyACM0 o similar).
Para el ESP32 hay dos pasos previos que se hacen una sola vez: instalar el soporte de placas ESP32 desde el gestor de placas del IDE (buscá “esp32” e instalá el paquete de Espressif) y, si el puerto no aparece, instalar el driver del conversor USB-serie de tu placa (generalmente CP210x o CH340). Después, elegí la placa ESP32 Dev Module (o “DOIT ESP32 DEVKIT V1”) y el puerto correspondiente. Si al subir el IDE queda esperando en “Connecting…”, mantené apretado el botón BOOT de la placa hasta que empiece la carga.
Para el aula
El material original de 2019 enseñaba este paso con bloques en mBlock3, hoy discontinuado. La función didáctica de los bloques —bajar la barrera de entrada— la cumple acá la combinación de un código corto con constantes nombradas, comentado, y el simulador en el navegador. Buen disparador para el aula: el original hace parpadear el LED (no lo deja fijo) a propósito, porque un titileo llama más la atención que una luz encendida. Que los grupos predigan qué se vería si, en lugar de parpadear, el LED quedara encendido de forma continua… y guarden la hipótesis, porque en el nivel avanzado el aviso justamente evoluciona a encendido fijo.
Verificá
Con el programa cargado, acercá al sensor una fuente de calor suave (la mano ahuecada, el aliento) para que la temperatura supere los 25 °C: el LED tiene que empezar a parpadear. Al retirar el calor y dejar que la lectura baje, el LED tiene que apagarse. Si el LED no responde, revisá la polaridad (pata larga al pin) y que el pin de datos del DHT11 esté en el pin correcto. Como el sensor mide cada 2 segundos, puede haber una pequeña demora entre el cambio de temperatura y la reacción del LED: es lo esperado.
Cierre del nivel
Al terminar este nivel, tu invernadero ya avisa solo: el sensor DHT11 mide la temperatura del aire y el LED parpadea cuando hace demasiado calor, indicando que hay que ventilar. Además, ya sabés conectar un sensor digital, instalar su librería y subir programas desde el Arduino IDE 2.x. Pero el aviso solo dice “hace calor / no hace calor”: no cuánto. En el nivel intermedio vamos a agregar un display LCD para ver en pantalla los valores exactos de temperatura y de humedad que mide el sensor.
Evidencia de cierre
Al terminar este nivel, esto tiene que estar funcionando:
- La maqueta del invernadero está armada (estructura cubierta con material translúcido y con una abertura para ventilar) y el circuito montado en la protoboard: el LED verde con su resistencia y el sensor DHT11 conectado a su pin de datos.
- Sabés subir un programa desde el Arduino IDE 2.x: elegir la placa, elegir el puerto y verificar que el código quedó cargado.
- El sensor DHT11 mide la temperatura del aire y el LED parpadea cuando esa temperatura supera UMBRAL_TEMP_C (25 °C), avisando que hay que ventilar.
- Entendés que el DHT11 es un sensor digital (se conecta a un pin digital, no a A0) y que no admite más de una lectura por segundo.