Saltar al contenido
Nivel inicial

Avisar cuándo ventilar por temperatura

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 LED verde montado en la protoboard. 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 resistencia 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.

Esquema de conexión: placa Arduino UNO con el pin 13 conectado por un cable rojo a la pata larga de un LED verde en una protoboard; la pata corta pasa por una resistencia de 220 ohm hasta la línea negativa, que vuelve al pin GND de la placa por un cable negro.
Montaje del LED en la protoboard (figura original del proyecto): la pata larga del LED al pin 13 del Arduino UNO, la pata corta a GND a través de una resistencia de 220 Ω.

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 DHT11, 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).

Esquema de conexión: placa Arduino UNO con el LED verde y su resistencia en la protoboard, y un módulo DHT11 azul; un cable amarillo lleva el pin de datos del DHT11 al pin 2 de la placa, y la alimentación va a 5V y GND.
Conexión del sensor DHT11 junto al LED (figura original del proyecto): el pin de datos del sensor va al pin digital 2 del Arduino UNO, y su alimentación a 5V y GND.

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
ventilacion-por-temperatura.ino Arduino UNO
// 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);
}
ventilacion-por-temperatura.ino ESP32
// 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);
}
Aviso por temperatura: el DHT11 mide el aire y, si la temperatura supera UMBRAL_TEMP_C (25 °C), el LED parpadea para avisar que hay que ventilar; por debajo del umbral, queda apagado.

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 puerto (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.

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.