Manual del proyecto · Proyecto 15
Sistema Lumínico
Diseño y construcción de una maqueta/prototipo de un sistema de iluminación domiciliario con encendido automático por sensor de movimiento y por nivel de luz exterior.
- Dificultad:
- Nivel educativo:
- Secundario. Ciclo Básico.
Contenido del manual
- 01 Materiales y equipamiento
- 02 Luces automáticas con sensor de movimiento Nivel inicial
- 03 Luz según la luz: el sensor LDR Nivel avanzado
Materiales y equipamiento
Insumos
| Imagen | Insumo | Cantidad | Plataforma |
|---|---|---|---|
| | Módulo relé Con ESP32, verificá que el módulo se dispare con señal de 3,3 V (los módulos con optoacoplador suelen hacerlo) o alimentalo con 5 V desde el pin VIN. | 1 | Todas |
| | Sensor PIR | 1 | Todas |
| | Módulo sensor LDR (fotorresistencia) De tres pines (VCC, GND y salida analógica), con el divisor de tensión incorporado. Si usás un LDR suelto, sumá una resistencia de 10 kΩ para armar el divisor. | 1 | Todas |
| | Lámpara LED de baja tensión (12 V o menos) con su fuente, o un LED con resistencia Es la carga segura que conmuta el relé durante toda la práctica en el aula. | 1 | Todas |
| | Protoboard | 1 | Todas |
| | Cable dupont macho-hembra | 20 | Todas |
| | Cable dupont macho-macho | 20 | Todas |
| Filamento PLA para impresora 3D (opcional) Solo si se imprime la maqueta de la casa que aloja el sistema (el paquete de fabricación 3D de esta reedición está a diseñar). | según modelo | Todas | |
| | Arduino UNO R3 | 1 | Arduino UNO R3 |
| | Placa ESP32 DevKit v1 | 1 | ESP32 DevKit |
| | Cable USB tipo B | 1 | Arduino UNO R3 |
| | Cable micro USB (con línea de datos) | 1 | ESP32 DevKit |
| | Fuente de 9 V 1 A (plug centro positivo, 5,5 x 2,1 mm) (opcional) Para alimentar la maqueta sin la computadora. El ESP32 se alimenta directamente por USB con una fuente de 5 V. | 1 | Arduino UNO R3 |
| | Lámparas de 220 V con portalámparas, enchufe y cable (opcional) Extra del original. La conexión a 220 V es una extensión EXCLUSIVA del docente, con instalación supervisada: la práctica del aula se realiza con la lámpara de baja tensión. | hasta 4 | Todas |
Equipamiento del taller
- Computadora
- Impresora 3D
- Soldador
- Estaño
- Alicate
- Pinza de punta
- Pinza brusela
Plano de conexionado en protoboard
Deslizá horizontalmente para ver el plano completo
Deslizá horizontalmente para ver el plano completo
| Desde | Hacia | Color de cable |
|---|---|---|
| Arduino UNO · 5V | Bus + de la protoboard | rojo |
| Arduino UNO · GND | Bus − de la protoboard | negro |
| Módulo relé · VCC | Bus + de la protoboard | rojo |
| Módulo relé · GND | Bus − de la protoboard | negro |
| Módulo relé · IN | Arduino UNO · 7 | azul |
| Lámpara de baja tensión (+) | Relé · COM | naranja |
| Relé · NO | Lámpara de baja tensión (−) | naranja |
| Sensor PIR · VCC | Bus + de la protoboard | rojo |
| Sensor PIR · GND | Bus − de la protoboard | negro |
| Sensor PIR · OUT | Arduino UNO · 4 | amarillo |
| Módulo LDR · VCC | Bus + de la protoboard | rojo |
| Módulo LDR · GND | Bus − de la protoboard | negro |
| Módulo LDR · salida | Arduino UNO · A0 | violeta |
| Desde | Hacia | Color de cable |
|---|---|---|
| ESP32 DevKit v1 · 3V3 | Bus + de la protoboard | rojo |
| ESP32 DevKit v1 · GND | Bus − de la protoboard | negro |
| Módulo relé · VCC | Bus + de la protoboard | rojo |
| Módulo relé · GND | Bus − de la protoboard | negro |
| Módulo relé · IN | ESP32 DevKit v1 · GPIO16 | azul |
| Lámpara de baja tensión (+) | Relé · COM | naranja |
| Relé · NO | Lámpara de baja tensión (−) | naranja |
| Sensor PIR · VCC | Bus + de la protoboard | rojo |
| Sensor PIR · GND | Bus − de la protoboard | negro |
| Sensor PIR · OUT | ESP32 DevKit v1 · GPIO27 | amarillo |
| Módulo LDR · VCC | Bus + de la protoboard | rojo |
| Módulo LDR · GND | Bus − de la protoboard | negro |
| Módulo LDR · salida | ESP32 DevKit v1 · GPIO34 | violeta |
Luces automáticas con sensor de movimiento
Conectar el relé
Para armar el sistema de luz automatizado y poder optimizar el consumo energético de un hogar, controlaremos el encendido y apagado de las luces a través de una placa ArduinoArduinoPlaca electrónica con un microcontrolador programable y comunicación USB/serial. Desde la computadora, un IDE permite escribir el código, compilarlo y cargarlo en la placa. Tiene entradas y salidas digitales (0 a 13) y entradas analógicas (A0 a A5). y un módulo reléReléDispositivo electromagnético que funciona como un interruptor controlado por un circuito eléctrico: un electroimán abre o cierra contactos de otros circuitos independientes. Permite controlar con bajo voltaje dispositivos que utilizan mayor voltaje..
El relé es la pieza clave de este proyecto: es un interruptor controlado eléctricamente. La placa lo maneja con su señal de bajo voltaje y él, a su vez, abre o cierra un circuito independiente donde está conectada la lámpara. El código que subamos a la placa controlará la apertura y el cierre del relé y, en consecuencia, el encendido y apagado de las luces.
¡Atención! El original de este proyecto conmutaba lámparas de 220 V, la tensión de la red eléctrica, que es peligrosa: un contacto accidental puede causar lesiones graves. En esta reedición, toda la práctica se realiza con una lámpara LED de baja tensión (12 V o menos, o directamente un LED con su resistencia en la protoboard) conectada a los bornes del relé. El aprendizaje es exactamente el mismo: el relé no distingue qué carga conmuta. Además, aun trabajando con baja tensión, las conexiones a los bornes del relé van con cables firmes y tornillos ajustados, nunca sueltas sobre la protoboard.
El módulo relé tiene tres pines del lado de control: alimentación (VCC), tierra (GND) y
señal. La señal se conecta al pin digital de la placa que indica la constante PIN_RELE
al comienzo del código del paso siguiente. Del lado de la carga, la lámpara se conecta a
los bornes de salida del módulo.
El módulo relé se alimenta desde el pin de 5 V del Arduino UNO, y su pin de señal va a
la salida digital indicada en PIN_RELE.
El ESP32ESP32Placa con un microcontrolador de Espressif que trae WiFi (y Bluetooth) integrados. Se programa desde el Arduino IDE igual que un Arduino, con pines llamados GPIO. En este proyecto reemplaza al conjunto Arduino UNO + módulo OBLOQ para el nivel IoT. trabaja con señales de 3,3 V. La mayoría de los
módulos relé con optoacoplador se disparan igual con ese nivel; si el tuyo no conmuta,
alimentá el módulo desde el pin VIN (5 V) manteniendo la señal en el GPIO que indica
PIN_RELE. Evitá los GPIO 0, 2, 12 y 15, que intervienen en el arranque de la placa.
Podés explorar el sistema completo de este nivel (sensor, relé y lámpara) en el simulador. Es el mismo circuito que vas a armar sobre la mesa, y responde al comportamiento real del código:
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.
Verificá
Todavía no cargamos ningún programa, así que el relé no va a conmutar. Antes de seguir,
revisá: VCC y GND del módulo van a la alimentación de la placa, la señal va al pin indicado
en PIN_RELE, y la lámpara de baja tensión queda conectada a los bornes de salida con sus
tornillos firmes.
Programar el encendido y apagado de las luces
Para poder encender las luces debemos accionar el módulo relé. Realizaremos una prueba de encendido y apagado intermitente para verificar que todo funcione de forma correcta.
La programación la realizaremos directamente en el lenguaje de Arduino (C++), usando 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: la función setup(), que se ejecuta una sola vez al
inicializarse el dispositivo, y la función loop(), que se ejecuta repetidamente después.
Después de // se escriben comentarios para el lector, que no tienen efecto en el
programa.
La idea del programa de prueba es simple. Al asignar el estado alto (HIGH) a la
salida del relé estamos indicando que se aplique tensión a su entrada de señal, de manera
que este permita el paso de corriente para que la lámpara se encienda. Al asignarle el
estado bajo (LOW), estamos indicando que no se aplica tensión al módulo relé, de modo
que no permita el paso de corriente y la lámpara se apague.
Ver el código completo · luces-temporizadas.ino
// Encendido y apagado temporizado de las luces a través de un módulo relé.
// Prueba intermitente (1 s encendido / 1 s apagado) para verificar que el
// relé y la lámpara responden antes de agregar sensores.
//
// SEGURIDAD: esta práctica se realiza con una lámpara LED de baja tensión.
// La conexión a 220 V queda reservada al docente o a una instalación
// supervisada, y NUNCA sobre la protoboard (desvío pedagógico acordado
// sobre la advertencia de 220 V de la guía original).
//
// Plataforma: Arduino UNO.
// Conexión: entrada IN del módulo relé → pin 7 (VCC a 5 V, GND a GND).
//
// Basado en: código del Paso 2, Nivel Inicial — Automatización de Sistema
// Lumínico, Saberes Digitales (INET/EDUCAR 2019)
// Modernización: se reemplazó el código generado por mBlock3 (_delay, _loop)
// por C++ idiomático de Arduino con constantes nombradas, y el relé se mueve
// del pin 2 (original) al pin 7 (contrato de pines de la reedición).
const int PIN_RELE = 7;
// El original explica: estado ALTO = pasa corriente = lámpara encendida.
// Ese es un módulo relé "activo-alto". Muchos módulos escolares baratos
// son "activo-bajo" (se activan con LOW): si el tuyo enciende al revés,
// invertí SOLO estas dos constantes y el resto del programa queda igual.
// Esa es la gracia de las constantes con nombre.
const int RELE_ENCENDIDO = HIGH;
const int RELE_APAGADO = LOW;
const unsigned long DURACION_ENCENDIDO_MS = 1000;
const unsigned long DURACION_APAGADO_MS = 1000;
void setup() {
pinMode(PIN_RELE, OUTPUT);
}
void loop() {
// delay() detiene todo el programa: para esta prueba de encendido es
// perfecto, porque el código se lee igual que la secuencia real.
digitalWrite(PIN_RELE, RELE_ENCENDIDO); // la lámpara enciende
delay(DURACION_ENCENDIDO_MS);
digitalWrite(PIN_RELE, RELE_APAGADO); // la lámpara se apaga
delay(DURACION_APAGADO_MS);
} // Encendido y apagado temporizado de las luces a través de un módulo relé.
// Prueba intermitente (1 s encendido / 1 s apagado) para verificar que el
// relé y la lámpara responden antes de agregar sensores.
//
// SEGURIDAD: esta práctica se realiza con una lámpara LED de baja tensión.
// La conexión a 220 V queda reservada al docente o a una instalación
// supervisada, y NUNCA sobre la protoboard (desvío pedagógico acordado
// sobre la advertencia de 220 V de la guía original).
//
// Plataforma: ESP32 (DevKit v1).
// Conexión: entrada IN del módulo relé → GPIO 16.
// Nota eléctrica: el ESP32 trabaja a 3,3 V (no 5 V como el UNO). Elegí un
// módulo relé cuya entrada acepte señal de 3,3 V (la mayoría de los módulos
// escolares la aceptan aunque se alimenten con 5 V) y nunca inyectes 5 V
// en un GPIO del ESP32.
//
// Basado en: código del Paso 2, Nivel Inicial — Automatización de Sistema
// Lumínico, Saberes Digitales (INET/EDUCAR 2019)
// Modernización: se reemplazó el código generado por mBlock3 (_delay, _loop)
// por C++ idiomático de Arduino con constantes nombradas, y se portó la guía
// (pensada para Arduino UNO, relé en pin 2) a ESP32 con GPIO seguros.
const int PIN_RELE = 16;
// El original explica: estado ALTO = pasa corriente = lámpara encendida.
// Ese es un módulo relé "activo-alto". Muchos módulos escolares baratos
// son "activo-bajo" (se activan con LOW): si el tuyo enciende al revés,
// invertí SOLO estas dos constantes y el resto del programa queda igual.
// Esa es la gracia de las constantes con nombre.
const int RELE_ENCENDIDO = HIGH;
const int RELE_APAGADO = LOW;
const unsigned long DURACION_ENCENDIDO_MS = 1000;
const unsigned long DURACION_APAGADO_MS = 1000;
void setup() {
pinMode(PIN_RELE, OUTPUT);
}
void loop() {
// delay() detiene todo el programa: para esta prueba de encendido es
// perfecto, porque el código se lee igual que la secuencia real.
digitalWrite(PIN_RELE, RELE_ENCENDIDO); // la lámpara enciende
delay(DURACION_ENCENDIDO_MS);
digitalWrite(PIN_RELE, RELE_APAGADO); // la lámpara se apaga
delay(DURACION_APAGADO_MS);
} Leelo como una receta: “activá el relé, esperá un segundo, desactivalo, esperá un
segundo… y volvé a empezar”. Eso es lo que loop() repite sin descanso.
Verificá
En el Arduino IDE, apretá el botón de verificar (el tilde ✓). Si abajo aparece “Compilación completada” sin mensajes en rojo, tu programa está bien escrito. Si aparece un error, revisá los punto y coma al final de cada línea y que las llaves abran y cierren.
Subir el código a la placa
Para subir el código de nuestro programa a la placa, necesitamos:
- Conectar la placa a la computadora con el cable USB.
- Chequear que en el selector de placa del Arduino IDE esté seleccionada la placa correcta.
- Seleccionar 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. al que está conectada la placa.
- Cliquear el botón Subir (la flecha →) en la parte superior de la interfaz.
En el Arduino IDE 2.x, la placa y el puerto se eligen juntos en el menú desplegable de la barra superior: al conectar la placa suele aparecer directamente como opción. Si no aparece, entrá a “Select other board and port” y buscala por nombre.
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.
Al terminar de subir nuestro código, veremos el mensaje de carga completada en la barra inferior del IDE.
Verificá
El relé debería conmutar en intervalos de un segundo: se escucha un clic en cada cambio, el LED indicador del módulo acompaña, y la lámpara se enciende y se apaga. Si el clic suena pero la lámpara no responde, revisá los bornes de salida; si no hay clic, revisá el pin de señal.
Conectar el sensor piroeléctrico
Si el sistema de encendido y apagado que probamos en los pasos anteriores funciona correctamente, podemos pasar a la instalación del sensor de movimiento. Para poder controlar que las luces de los ambientes de la casa se enciendan solo cuando haya alguien adentro, utilizaremos un sensor piroeléctricoSensor PIRSensor de movimiento infrarrojo que reacciona ante fuentes de calor como el cuerpo humano o el de los animales. Solo detecta presencia o ausencia de movimiento (1 o 0), en un rango de un par de metros, y trae trimmers para regular sensibilidad y tiempo de disparo..
Los detectores piroeléctricos (habitualmente llamados PIR) son sensores de movimiento que reaccionan solo ante determinadas fuentes de energía, tales como el calor que emite el cuerpo humano o el de los animales. Así, pueden reconocer el movimiento de un cuerpo en un ambiente, dado que sienten la diferencia de calor entre el cuerpo y el resto del espacio.
El sensor tiene tres pines: dos para la alimentación (VCC y GND) y un tercero de salida de
información, que se conecta a la entrada digital de la placa indicada por la constante
PIN_PIR al comienzo del código de los pasos siguientes.
Verificá
Revisá la orientación de los tres pines contra el rotulado de tu módulo (no todos los
fabricantes usan el mismo orden) antes de alimentar la placa: VCC a la alimentación, GND a
tierra y la salida al pin indicado en PIN_PIR.
Calibración del sensor piroeléctrico
En primer lugar, debemos familiarizarnos con la forma de medición del sensor PIR: indicará el valor 1 cuando detecte movimiento y 0 cuando no lo haga.
Para poder ver esos valores necesitamos que la placa se los envíe a la computadora.
Preparamos un programa que lee el pin del sensor y escribe el resultado por la conexión
serie, una y otra vez: necesitamos que el sistema actualice constantemente el valor de
lectura del sensor, por eso tanto la lectura como el envío viven dentro de loop().
Ver el código completo · lectura-pir.ino
// Lectura y calibración del sensor de movimiento (PIR) por consola serial.
// El PIR devuelve 1 cuando detecta movimiento y 0 cuando no. Ver esos
// valores en la consola permite calibrar los dos trimmers del módulo
// (sensibilidad y tiempo de retención) ANTES de conectar el relé:
// primero entendemos al sensor, después automatizamos con él.
//
// Plataforma: Arduino UNO.
// Conexión: salida de datos del PIR → pin 4 (VCC a 5 V, GND a GND).
// Consola: Monitor Serie del IDE de Arduino a 9600 baudios.
//
// Basado en: código de los Pasos 5 y 6, Nivel Inicial — Automatización de
// Sistema Lumínico, Saberes Digitales (INET/EDUCAR 2019)
// Modernización: el original enviaba a la consola con bloques de mBlock3
// ("Escribir en el serial" dentro de "Por siempre", sin pausa); acá se usa
// Serial.println() con una pequeña pausa entre lecturas para que la
// consola sea legible y no se inunde de números.
const int PIN_PIR = 4;
const long VELOCIDAD_SERIAL = 9600;
// Sin esta pausa el UNO imprimiría miles de lecturas por segundo y la
// consola sería ilegible. Cinco lecturas por segundo alcanzan de sobra
// para ver cuándo el PIR pasa de 0 a 1.
const unsigned long INTERVALO_LECTURA_MS = 200;
void setup() {
pinMode(PIN_PIR, INPUT);
// Abre la comunicación con la computadora. El número debe coincidir
// con el que se elige en el Monitor Serie: es la "velocidad" a la que
// ambos acuerdan hablar.
Serial.begin(VELOCIDAD_SERIAL);
}
void loop() {
// digitalRead devuelve 1 (movimiento) o 0 (sin movimiento): con eso
// a la vista, ajustá los trimmers del PIR hasta que las detecciones
// se correspondan con lo que pasa en el ambiente.
Serial.println(digitalRead(PIN_PIR));
delay(INTERVALO_LECTURA_MS);
} // Lectura y calibración del sensor de movimiento (PIR) por consola serial.
// El PIR devuelve 1 cuando detecta movimiento y 0 cuando no. Ver esos
// valores en la consola permite calibrar los dos trimmers del módulo
// (sensibilidad y tiempo de retención) ANTES de conectar el relé:
// primero entendemos al sensor, después automatizamos con él.
//
// Plataforma: ESP32 (DevKit v1).
// Conexión: salida de datos del PIR → GPIO 27.
// Nota eléctrica: el ESP32 trabaja a 3,3 V. Los PIR tipo HC-SR501 suelen
// alimentarse con 5 V pero su salida de datos es de 3,3 V, así que puede
// ir directo al GPIO; verificá la hoja de datos de tu módulo.
// Consola: Monitor Serie del IDE de Arduino a 9600 baudios.
//
// Basado en: código de los Pasos 5 y 6, Nivel Inicial — Automatización de
// Sistema Lumínico, Saberes Digitales (INET/EDUCAR 2019)
// Modernización: el original enviaba a la consola con bloques de mBlock3
// (PIR en pin 4 del UNO, sin pausa); acá se porta a ESP32 (GPIO 27) y se
// usa Serial.println() con una pequeña pausa entre lecturas para que la
// consola sea legible y no se inunde de números.
const int PIN_PIR = 27;
const long VELOCIDAD_SERIAL = 9600;
// Sin esta pausa el ESP32 imprimiría miles de lecturas por segundo y la
// consola sería ilegible. Cinco lecturas por segundo alcanzan de sobra
// para ver cuándo el PIR pasa de 0 a 1.
const unsigned long INTERVALO_LECTURA_MS = 200;
void setup() {
pinMode(PIN_PIR, INPUT);
// Abre la comunicación con la computadora. El número debe coincidir
// con el que se elige en el Monitor Serie: es la "velocidad" a la que
// ambos acuerdan hablar.
Serial.begin(VELOCIDAD_SERIAL);
}
void loop() {
// digitalRead devuelve 1 (movimiento) o 0 (sin movimiento): con eso
// a la vista, ajustá los trimmers del PIR hasta que las detecciones
// se correspondan con lo que pasa en el ambiente.
Serial.println(digitalRead(PIN_PIR));
delay(INTERVALO_LECTURA_MS);
} Verificá
Compilá el programa con el botón de verificar (✓) y subilo a la placa como en el paso 3. Todavía no vas a ver nada: los valores aparecen recién cuando abramos la consola en el paso siguiente.
Activar el envío de datos a la consola
Una vez que nuestro programa esté cargado, con la placa conectada podemos visualizar los
valores del sensor en la computadora. En el Arduino IDE 2.x, la consola se llama monitor
serie: se abre con el ícono de la lupa en el extremo superior derecho (o desde
Herramientas → Monitor Serie). Asegurate de que la velocidad seleccionada abajo a la
derecha del monitor coincida con la del código (el valor que aparece en Serial.begin,
típicamente 9600 baudios).
Vas a ver una columna de valores que se actualiza sola: 1 cuando el sensor detecta movimiento, 0 cuando no. Movete frente al sensor, quedate quieto, alejate: la columna cuenta la historia.
Con los trimmers de ajuste del módulo (los dos tornillos naranjas del dorso, que viste en la figura del paso 4) podemos calibrar la sensibilidad de la medición y el tiempo que habrá entre cada lectura, hasta que los parámetros se ajusten a nuestras necesidades.
Para el aula
La calibración es el momento más experimental del nivel y conviene darle tiempo de juego: que cada grupo gire un trimmer por vez, anote qué cambió y lo cuente. Dos fenómenos que suelen desconcertar: el PIR necesita unos 30-60 segundos de “acomodamiento” al energizarse (lecturas erráticas al principio son normales), y el tiempo de disparo del propio módulo hace que el 1 se sostenga un rato aunque la persona ya se haya quedado quieta. Detectar esas dos conductas observando la columna del monitor serie es, en sí mismo, un ejercicio de lectura de datos.
Verificá
Con el monitor serie abierto: al moverte frente al sensor aparece el valor 1, y al quedarte quieto (pasado el tiempo del trimmer) vuelve el 0. Si la columna no cambia nunca, revisá el pin de señal y la velocidad del monitor.
Agregar el módulo relé
Con el sensor calibrado de forma correcta, es tiempo de agregar a nuestro sistema la conexión del módulo relé que hicimos previamente. Ahora la placa tiene las dos cosas conectadas a la vez: el sensor PIR en su entrada y el relé (con la lámpara de baja tensión) en su salida.
Verificá
Repasá contra el esquema: el PIR conserva su pin de entrada (PIN_PIR), el relé su pin de
salida (PIN_RELE), y ambos comparten la alimentación y el GND de la placa. Nada más
cambió respecto de los pasos anteriores.
Encender las luces en función del movimiento
Llegó el momento de unir las dos mitades con la pieza de programación nueva de este
proyecto: la condición. Con la estructura if... else (si… entonces / si no…)
accionamos el relé cuando el sensor detecte movimiento (es decir, cuando la lectura sea
igual a 1) y lo desactivamos en caso contrario (cuando la lectura sea igual a 0).
Para evitar que el sistema esté continuamente revisando si hay movimiento, establecemos un intervalo de tiempo de espera de, por ejemplo, 10 minutos (600 segundos) entre cada medición: cuando alguien entra al ambiente, la luz queda encendida ese intervalo antes de volver a consultar al sensor.
Ver el código completo · luz-automatica-pir.ino
// Luz automática por movimiento: el relé enciende la lámpara cuando el
// sensor PIR detecta a alguien, y la mantiene encendida un "tiempo de
// cortesía" antes de volver a evaluar. Si no hay movimiento, la apaga.
//
// El tiempo de cortesía cumple dos funciones (así lo plantea el original):
// evita que el sistema esté revisando el sensor sin parar, y garantiza que
// la luz no se apague apenas la persona se queda quieta.
//
// SEGURIDAD: esta práctica se realiza con una lámpara LED de baja tensión.
// La conexión a 220 V queda reservada al docente o a una instalación
// supervisada, y NUNCA sobre la protoboard (desvío pedagógico acordado
// sobre la advertencia de 220 V de la guía original).
//
// Plataforma: Arduino UNO.
// Conexión: PIR → pin 4; entrada IN del módulo relé → pin 7.
//
// Basado en: código del Paso 8, Nivel Inicial — Automatización de Sistema
// Lumínico, Saberes Digitales (INET/EDUCAR 2019)
// Modernización: constantes nombradas en lugar del C generado por mBlock3
// (_delay, _loop); el relé se mueve del pin 2 (original) al pin 7
// (contrato de pines de la reedición). Se mantiene el delay() bloqueante
// del original: en este nivel es la herramienta que ya conocemos.
const int PIN_PIR = 4;
const int PIN_RELE = 7;
// Módulo relé activo-alto, como lo explica el original (HIGH = enciende).
// Si tu módulo es activo-bajo, invertí solo estas dos constantes.
const int RELE_ENCENDIDO = HIGH;
const int RELE_APAGADO = LOW;
// 10 minutos, como propone la guía original (600 segundos).
// Para probar en el aula conviene bajarlo temporalmente (por ejemplo a
// 10000, es decir 10 segundos): nadie quiere esperar 10 minutos para
// ver si el programa funciona.
const unsigned long TIEMPO_CORTESIA_MS = 600000;
void setup() {
pinMode(PIN_PIR, INPUT);
pinMode(PIN_RELE, OUTPUT);
}
void loop() {
// El PIR devuelve HIGH (1) cuando detecta movimiento.
if (digitalRead(PIN_PIR) == HIGH) {
digitalWrite(PIN_RELE, RELE_ENCENDIDO);
// Durante este delay() el programa queda detenido con la luz
// encendida: ese es exactamente el tiempo de cortesía. Recién al
// terminar vuelve a preguntar si hay movimiento.
delay(TIEMPO_CORTESIA_MS);
} else {
// Sin movimiento: la lámpara se apaga y loop() vuelve a empezar,
// consultando el sensor de forma continua.
digitalWrite(PIN_RELE, RELE_APAGADO);
}
} // Luz automática por movimiento: el relé enciende la lámpara cuando el
// sensor PIR detecta a alguien, y la mantiene encendida un "tiempo de
// cortesía" antes de volver a evaluar. Si no hay movimiento, la apaga.
//
// El tiempo de cortesía cumple dos funciones (así lo plantea el original):
// evita que el sistema esté revisando el sensor sin parar, y garantiza que
// la luz no se apague apenas la persona se queda quieta.
//
// SEGURIDAD: esta práctica se realiza con una lámpara LED de baja tensión.
// La conexión a 220 V queda reservada al docente o a una instalación
// supervisada, y NUNCA sobre la protoboard (desvío pedagógico acordado
// sobre la advertencia de 220 V de la guía original).
//
// Plataforma: ESP32 (DevKit v1).
// Conexión: PIR → GPIO 27; entrada IN del módulo relé → GPIO 16.
// Nota eléctrica: el ESP32 trabaja a 3,3 V (no 5 V como el UNO); nunca
// inyectar 5 V en un GPIO.
//
// Basado en: código del Paso 8, Nivel Inicial — Automatización de Sistema
// Lumínico, Saberes Digitales (INET/EDUCAR 2019)
// Modernización: constantes nombradas en lugar del C generado por mBlock3
// (_delay, _loop); portado a ESP32 con GPIO seguros (el original usaba
// PIR en pin 4 y relé en pin 2 del UNO). Se mantiene el delay() bloqueante
// del original: en este nivel es la herramienta que ya conocemos.
const int PIN_PIR = 27;
const int PIN_RELE = 16;
// Módulo relé activo-alto, como lo explica el original (HIGH = enciende).
// Si tu módulo es activo-bajo, invertí solo estas dos constantes.
const int RELE_ENCENDIDO = HIGH;
const int RELE_APAGADO = LOW;
// 10 minutos, como propone la guía original (600 segundos).
// Para probar en el aula conviene bajarlo temporalmente (por ejemplo a
// 10000, es decir 10 segundos): nadie quiere esperar 10 minutos para
// ver si el programa funciona.
const unsigned long TIEMPO_CORTESIA_MS = 600000;
void setup() {
pinMode(PIN_PIR, INPUT);
pinMode(PIN_RELE, OUTPUT);
}
void loop() {
// El PIR devuelve HIGH (1) cuando detecta movimiento.
if (digitalRead(PIN_PIR) == HIGH) {
digitalWrite(PIN_RELE, RELE_ENCENDIDO);
// Durante este delay() el programa queda detenido con la luz
// encendida: ese es exactamente el tiempo de cortesía. Recién al
// terminar vuelve a preguntar si hay movimiento.
delay(TIEMPO_CORTESIA_MS);
} else {
// Sin movimiento: la lámpara se apaga y loop() vuelve a empezar,
// consultando el sensor de forma continua.
digitalWrite(PIN_RELE, RELE_APAGADO);
}
} Compará el comportamiento de tu circuito con el del simulador:
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.
¿Cuánto tiene que esperar la luz?
Diez minutos es un valor razonable para una casa, pero imposible para probar en clase. Bajen el intervalo a 10 segundos, prueben el sistema, y después debatan en grupo: ¿qué pasa si el intervalo es muy corto y alguien está leyendo quieto en la habitación? ¿Y si es muy largo en un pasillo? Elijan un valor para cada ambiente de una casa (baño, pasillo, dormitorio, cocina) y justifiquen la elección. Ahí van a descubrir que no hay un único número correcto: hay decisiones de diseño.
Verificá
Al entrar una persona al alcance del sensor, el relé hace clic y la lámpara se enciende; pasado el intervalo de espera sin movimiento, la lámpara se apaga sola. Si la luz queda “pegada” encendida, recordá el tiempo del trimmer del PIR: puede estar sosteniendo el 1 más de lo que creés.
Cierre del nivel
Al terminar este nivel, el sistema de Agustín funciona sobre tu mesa: el relé conmuta la
lámpara de baja tensión obedeciendo al programa, el sensor PIR —ya calibrado— reporta 1 o 0
en el monitor serie, y la condición if... else une las dos cosas para que la luz se
encienda sola cuando alguien entra al ambiente y se apague cuando pasa el intervalo de
espera sin movimiento. En el nivel avanzado, el sistema va a mirar también por la
ventana: un sensor de luz decidirá si hace falta encender la lámpara según cuánta luz
natural haya afuera.
Evidencia de cierre
Al terminar este nivel, esto tiene que estar funcionando:
- El módulo relé conmuta la lámpara LED de baja tensión (o el LED en protoboard) siguiendo las órdenes del programa: se escucha el clic y la luz responde.
- El sensor PIR está conectado y calibrado: sus lecturas (1 con movimiento, 0 sin movimiento) se ven en el monitor serie del Arduino IDE.
- El sistema completo enciende la luz cuando el sensor detecta movimiento y la apaga cuando pasa el intervalo de espera sin detectar a nadie.
Luz según la luz: el sensor LDR
Situación problema
Observando atentamente, Agustín pudo apreciar que el nivel de luz natural presente en el exterior era un factor importante para establecer en qué momentos se necesitaba encender o apagar las luces de su casa. Entonces, se propuso complementar su sistema automático de control de luces agregando sensores ubicados afuera de la casa que midieran la intensidad de la luz solar.
Ahora, además de tener en cuenta la presencia de personas en los ambientes, el sistema encenderá las luces cuando el nivel de luz exterior sea bajo, y las apagará cuando este sea alto. De esta manera, se incrementará la optimización del uso de energía en su hogar.
En esta actividad se propone utilizar un sensor LDR (fotorresistencia) para medir la intensidad de luz exterior, y encender o apagar las luces del hogar a través de un módulo relé.
Conectar la fotorresistencia (sensor LDR)
Para poder medir la luz del exterior es necesario conectar una fotorresistencia (sensor LDRLDR (fotorresistencia)Componente cuya resistencia varía con la intensidad de la luz que recibe: baja (hasta 50 ohm) con luz incidiendo y muy alta (1 megaohm o más) a oscuras. Se usa en control automático de iluminación, robots seguidores de luz o barreras láser.).
Un sensor LDR o fotorresistencia es un componente electrónico cuya 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. varía de acuerdo al cambio que perciba en la intensidad de la luz a la que está expuesto. El valor de resistencia de un LDR es bajo cuando hay luz incidiendo en él (puede descender hasta 50 ohm) y muy alto cuando está a oscuras (1 megaohm o más).
Usamos un módulo LDR de tres pines: alimentación (VCC), tierra (GND) y salida de señal. A
diferencia del PIR, que entrega 1 o 0, esta salida es analógica: entrega un voltaje que
varía con la luz, así que va conectada a la entrada analógica de la placa indicada por la
constante PIN_LDR al comienzo del código de los pasos siguientes.
Verificá
Revisá contra el rotulado de tu módulo: VCC a la alimentación, GND a tierra y la salida de
señal a la entrada analógica indicada en PIN_LDR. El resto del circuito (relé y lámpara
de baja tensión) queda igual que al final del nivel inicial.
Obtener la lectura del sensor LDR
Al igual que hicimos con el sensor PIR, primero prepararemos nuestro programa para leer el pin y visualizar sus mediciones en el monitor serie.
Como el LDR es un sensor analógico, su lectura nos brindará valores entre 0 (cuando no haya luz) y 1023 (cuando haya mucha luz). Las entradas analógicas del ArduinoArduinoPlaca electrónica con un microcontrolador programable y comunicación USB/serial. Desde la computadora, un IDE permite escribir el código, compilarlo y cargarlo en la placa. Tiene entradas y salidas digitales (0 a 13) y entradas analógicas (A0 a A5). UNO, que van desde el pin A0 al A5, nos permiten saber el voltaje de la entrada con una resolución que va de 0 cuando hay 0 V a 1023 cuando hay 5 V. Si, por ejemplo, el voltaje en la entrada es de 1,25 V, estos pines leen un valor intermedio de 255.
Como el LDR es un sensor analógico, su lectura nos brindará un número que crece con la luz. En el ESP32ESP32Placa con un microcontrolador de Espressif que trae WiFi (y Bluetooth) integrados. Se programa desde el Arduino IDE igual que un Arduino, con pines llamados GPIO. En este proyecto reemplaza al conjunto Arduino UNO + módulo OBLOQ para el nivel IoT. el conversor analógico trabaja con más resolución que en el UNO: entrega valores entre 0 (0 V) y 4095 (3,3 V). La idea es la misma, solo cambia la escala: tenelo en cuenta cuando compares tus mediciones con las del resto del grupo o elijas el umbral del paso siguiente.
Ver el código completo · lectura-ldr.ino
// Lectura de la fotorresistencia (LDR) por consola serial.
// A diferencia del PIR (que solo dice 1 o 0), el LDR es un sensor
// ANALÓGICO: en el UNO, analogRead() devuelve un valor entre 0 (0 V,
// oscuridad total en nuestro divisor) y 1023 (5 V, mucha luz).
// Medir en distintos momentos del día y anotar los valores es lo que
// después permite elegir un umbral con fundamento, no a ojo.
//
// Plataforma: Arduino UNO.
// Conexión: divisor resistivo LDR + resistencia de 10 kohm; el punto
// medio del divisor → pin A0. Con este cableado, más luz = valor más alto.
// Consola: Monitor Serie del IDE de Arduino a 9600 baudios.
//
// Basado en: código del Paso 2, Nivel Avanzado — Automatización de Sistema
// Lumínico, Saberes Digitales (INET/EDUCAR 2019)
// Modernización: se reemplazaron los bloques de mBlock3 por Serial.println()
// con una pausa entre lecturas para que la consola sea legible.
const int PIN_LDR = A0;
const long VELOCIDAD_SERIAL = 9600;
// Dos lecturas por segundo: suficiente para ver cómo cambia la luz
// ambiente sin inundar la consola.
const unsigned long INTERVALO_LECTURA_MS = 500;
void setup() {
pinMode(PIN_LDR, INPUT);
Serial.begin(VELOCIDAD_SERIAL);
}
void loop() {
// Tapá el sensor con la mano, iluminalo con una linterna, y observá
// el rango real de valores de TU aula: ese experimento es el que
// define el umbral del paso siguiente (luz-nocturna.ino).
Serial.println(analogRead(PIN_LDR));
delay(INTERVALO_LECTURA_MS);
} // Lectura de la fotorresistencia (LDR) por consola serial.
// A diferencia del PIR (que solo dice 1 o 0), el LDR es un sensor
// ANALÓGICO. OJO con esta diferencia didáctica: el conversor del ESP32
// es de 12 bits, así que analogRead() devuelve valores entre 0 (0 V) y
// 4095 (3,3 V), NO el 0-1023 (10 bits) del Arduino UNO. Mismo fenómeno
// físico, distinta "regla de medir": por eso los umbrales de un programa
// no se copian entre placas sin pensar.
//
// Plataforma: ESP32 (DevKit v1).
// Conexión: divisor resistivo LDR + resistencia de 10 kohm alimentado con
// 3,3 V; el punto medio del divisor → GPIO 34. Con este cableado, más luz
// = valor más alto.
// IMPORTANTE: el GPIO 34 es de SOLO ENTRADA y no tiene resistencias
// internas de pull-up/pull-down, por lo que el divisor resistivo externo
// es OBLIGATORIO: sin él, el pin queda "flotando" y lee cualquier cosa.
// (Es un GPIO del ADC1, que sigue funcionando aunque se use WiFi; los
// pines del ADC2 dejan de medir con WiFi activo.)
// Consola: Monitor Serie del IDE de Arduino a 9600 baudios.
//
// Basado en: código del Paso 2, Nivel Avanzado — Automatización de Sistema
// Lumínico, Saberes Digitales (INET/EDUCAR 2019)
// Modernización: portado a ESP32 (LDR en GPIO 34; el original usaba A0 del
// UNO) y Serial.println() con pausa entre lecturas en lugar de los bloques
// de mBlock3.
const int PIN_LDR = 34;
const long VELOCIDAD_SERIAL = 9600;
// Dos lecturas por segundo: suficiente para ver cómo cambia la luz
// ambiente sin inundar la consola.
const unsigned long INTERVALO_LECTURA_MS = 500;
void setup() {
pinMode(PIN_LDR, INPUT);
Serial.begin(VELOCIDAD_SERIAL);
}
void loop() {
// Tapá el sensor con la mano, iluminalo con una linterna, y observá
// el rango real de valores de TU aula (acá entre 0 y 4095): ese
// experimento es el que define el umbral del paso siguiente
// (luz-nocturna.ino).
Serial.println(analogRead(PIN_LDR));
delay(INTERVALO_LECTURA_MS);
} Como nuestro objetivo es detectar el nivel de luz natural presente en el exterior, sería recomendable poder realizar mediciones en distintos momentos del día e ir observando qué valores obtenemos en cada uno de ellos. De todas formas, para probar el funcionamiento del sensor LDR, se puede utilizar una luz artificial variando su intensidad.
Verificá
Con el programa cargado y el monitor serie abierto (misma velocidad que en Serial.begin):
tapá el sensor con la mano y el valor baja; iluminalo con la linterna del celular y el
valor sube. Anotá los valores típicos de “oscuro”, “luz ambiente” y “luz directa”: los vas
a necesitar en el paso siguiente.
Encender y apagar las luces en función del sensor LDR
Tomando los valores que obtuvimos al medir los niveles de la luz del exterior, podemos
establecer ante qué valor queremos que se enciendan y se apaguen las luces: ese valor es
nuestro umbral. Para poder programarlo, debemos utilizar la siguiente condición: si el
valor de la lectura del sensor es menor al valor que determinamos, la luz se encenderá;
si no, se apagará. Es la misma estructura if... else del nivel inicial, ahora comparando
un número contra el umbral en lugar de preguntar por un 1 o un 0.
El original propone como punto de partida un umbral de 600 (sobre la escala de 0 a 1023 del UNO). Ajustalo con los valores que anotaste en el paso 2.
Sobre la escala del ESP32 (0 a 4095), el punto de partida equivalente al 600 del original ronda el valor que indica la constante del umbral en el código. Ajustalo con los valores que anotaste en el paso 2.
Ver el código completo · luz-nocturna.ino
// Luz nocturna: el relé enciende la lámpara cuando el nivel de luz
// exterior es bajo, y la apaga cuando es alto.
// Lógica exacta del original: si la lectura del LDR es MENOR que el
// umbral, enciende; si no, apaga. El código de este paso usa SOLO el
// LDR (la combinación con el PIR queda como extensión propuesta por
// la prosa de la guía, no como código del original).
//
// SEGURIDAD: esta práctica se realiza con una lámpara LED de baja tensión.
// La conexión a 220 V queda reservada al docente o a una instalación
// supervisada, y NUNCA sobre la protoboard (desvío pedagógico acordado
// sobre la advertencia de 220 V de la guía original).
//
// Plataforma: Arduino UNO.
// Conexión: divisor resistivo del LDR → pin A0 (más luz = valor más alto);
// entrada IN del módulo relé → pin 7.
//
// Basado en: código del Paso 3, Nivel Avanzado — Automatización de Sistema
// Lumínico, Saberes Digitales (INET/EDUCAR 2019)
// Modernización: constantes nombradas en lugar del C generado por mBlock3;
// el relé se mueve del pin 2 (original) al pin 7 (contrato de pines de la
// reedición).
const int PIN_LDR = A0;
const int PIN_RELE = 7;
// Módulo relé activo-alto, como lo explica el original (HIGH = enciende).
// Si tu módulo es activo-bajo, invertí solo estas dos constantes.
const int RELE_ENCENDIDO = HIGH;
const int RELE_APAGADO = LOW;
// Umbral del original: 600 sobre un rango de 0 a 1023 (10 bits del UNO).
// No es un número mágico: sale de haber MEDIDO la luz del lugar con
// lectura-ldr.ino. Si tus mediciones dieron otro rango, ajustalo acá.
const int UMBRAL_LUZ = 600;
void setup() {
pinMode(PIN_LDR, INPUT);
pinMode(PIN_RELE, OUTPUT);
}
void loop() {
// Menos luz que el umbral → está oscureciendo → encender la lámpara.
if (analogRead(PIN_LDR) < UMBRAL_LUZ) {
digitalWrite(PIN_RELE, RELE_ENCENDIDO);
} else {
digitalWrite(PIN_RELE, RELE_APAGADO);
}
// Sin delay(): este programa ya es naturalmente no bloqueante, igual
// que el original. El relé solo conmuta cuando la condición cambia.
} // Luz nocturna: el relé enciende la lámpara cuando el nivel de luz
// exterior es bajo, y la apaga cuando es alto.
// Lógica exacta del original: si la lectura del LDR es MENOR que el
// umbral, enciende; si no, apaga. El código de este paso usa SOLO el
// LDR (la combinación con el PIR queda como extensión propuesta por
// la prosa de la guía, no como código del original).
//
// SEGURIDAD: esta práctica se realiza con una lámpara LED de baja tensión.
// La conexión a 220 V queda reservada al docente o a una instalación
// supervisada, y NUNCA sobre la protoboard (desvío pedagógico acordado
// sobre la advertencia de 220 V de la guía original).
//
// Plataforma: ESP32 (DevKit v1).
// Conexión: divisor resistivo del LDR (obligatorio: el GPIO 34 es de solo
// entrada y no tiene pull-up interno) → GPIO 34, con más luz = valor más
// alto; entrada IN del módulo relé → GPIO 16.
// Nota eléctrica: el ESP32 trabaja a 3,3 V (no 5 V como el UNO); nunca
// inyectar 5 V en un GPIO.
//
// Basado en: código del Paso 3, Nivel Avanzado — Automatización de Sistema
// Lumínico, Saberes Digitales (INET/EDUCAR 2019)
// Modernización: constantes nombradas en lugar del C generado por mBlock3;
// portado a ESP32 (el original usaba A0 y relé en pin 2 del UNO) y umbral
// reescalado al ADC de 12 bits del ESP32.
const int PIN_LDR = 34;
const int PIN_RELE = 16;
// Módulo relé activo-alto, como lo explica el original (HIGH = enciende).
// Si tu módulo es activo-bajo, invertí solo estas dos constantes.
const int RELE_ENCENDIDO = HIGH;
const int RELE_APAGADO = LOW;
// El original usa 600 sobre el rango 0-1023 del UNO (ADC de 10 bits).
// El ADC del ESP32 es de 12 bits (0-4095): para que el umbral represente
// el MISMO nivel de luz hay que reescalarlo en la misma proporción:
// 600/1023 ≈ 2400/4095. Mismo fenómeno, distinta resolución: por eso los
// umbrales nunca se copian entre placas sin ajustar. Y como siempre,
// el valor definitivo sale de medir con lectura-ldr.ino en tu lugar.
const int UMBRAL_LUZ = 2400;
void setup() {
pinMode(PIN_LDR, INPUT);
pinMode(PIN_RELE, OUTPUT);
}
void loop() {
// Menos luz que el umbral → está oscureciendo → encender la lámpara.
if (analogRead(PIN_LDR) < UMBRAL_LUZ) {
digitalWrite(PIN_RELE, RELE_ENCENDIDO);
} else {
digitalWrite(PIN_RELE, RELE_APAGADO);
}
// Sin delay(): este programa ya es naturalmente no bloqueante, igual
// que el original. El relé solo conmuta cuando la condición cambia.
} Compará el comportamiento de tu circuito con el del simulador, variando el nivel de luz:
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 el aula
Un fenómeno que aparece casi siempre y es oro didáctico: si la propia lámpara ilumina al LDR, el sistema oscila (enciende → el sensor “ve” luz → apaga → vuelve a estar oscuro → enciende…). Es la razón por la que Agustín ubica el sensor afuera de la casa, lejos de las luces que controla. Dejar que los grupos se topen con la oscilación y la diagnostiquen solos —¿qué está midiendo el sensor? ¿quién genera esa luz?— vale más que anticipársela; después se resuelve reubicando el sensor o tapándolo de la lámpara.
El sistema completo de Agustín
La historia dice que el sistema tiene en cuenta las dos cosas: la presencia de personas
y el nivel de luz exterior. Combiná lo que construiste en los dos niveles: la lámpara debe
encenderse solamente si el PIR detecta movimiento y además está oscuro según el LDR.
Pista: las condiciones se pueden combinar dentro de un mismo if. ¿En qué ambiente de la
casa este comportamiento es el correcto, y en cuál convendría que la luz encienda con
movimiento aunque sea de día?
Verificá
Con el umbral ya ajustado: al tapar el sensor (simulando la noche) el relé hace clic y la lámpara se enciende; al iluminarlo (simulando el día), se apaga. Si la lámpara parpadea sin que cambie la luz ambiente, estás viendo la oscilación: alejá el sensor de la propia lámpara y volvé a probar.
Cierre del nivel
Al terminar este nivel, el sistema decide solo cuándo vale la pena gastar energía: el LDR mide el nivel de luz en una entrada analógica, vos elegiste el umbral con mediciones reales —no con un número mágico— y la condición del programa enciende la lámpara únicamente cuando está oscuro. Si además resolviste el desafío, tu sistema es el de Agustín completo: movimiento y oscuridad, las dos condiciones del ahorro. Con esto queda cerrado el recorrido del proyecto. Si el grupo quiere seguir, en la ficha están las extensiones sugeridas: display LCD con el estado de los ambientes, “modo de vacaciones” con módulo reloj, y control de las luces a través de IoT (para eso, el proyecto Sistema de Semaforización te espera con su nivel avanzado).
Evidencia de cierre
Al terminar este nivel, esto tiene que estar funcionando:
- El sensor LDR está conectado a una entrada analógica y sus lecturas se ven en el monitor serie, variando al tapar e iluminar el sensor.
- Registraste mediciones en distintas condiciones de luz y elegiste un umbral de encendido con criterio, basándote en esos valores.
- El sistema enciende la lámpara cuando el nivel de luz es menor al umbral y la apaga cuando es mayor.