Introducción
Este proyecto te permite construir un sistema de iluminación inteligente que se activa automáticamente. Utilizaremos un sensor de movimiento (PIR) conectado a una placa Arduino para traducir la presencia humana en acciones de control (encender o apagar una tira LED RGB). Es una forma innovadora de automatizar tu habitación y aprender sobre sensores de presencia y el control de actuadores de potencia (como tiras LED de 12V usando transistores MOSFET).
Materiales Necesarios
Placa Arduino (como Arduino Uno, Nano, o similar)
Sensor de Movimiento (PIR HC-SR501)
Tira LED RGB (de 4 pines, 12V)
3x Transistores MOSFET (Canal N, como el IRLZ44N o IRF540)
3x Resistencias (de 10kΩ)
Fuente de Alimentación Externa (de 12V, para la tira LED)
Protoboard
Cables Jumper (macho-macho y macho-hembra)
Cable USB (adecuado para tu placa Arduino)
Esquema de Montaje
El Sensor (Entrada): Conectar el sensor de movimiento (PIR) al Arduino. Este sensor envía una señal digital (ALTO o BAJO) dependiendo de si detecta movimiento.
El Actuador (Salida): Conectar la tira LED RGB. Dado que la tira consume demasiada corriente (y es de 12V), no se conecta directo al Arduino. Se usan tres transistores MOSFET como interruptores electrónicos, uno para cada color (Rojo, Verde, Azul), controlados por pines PWM del Arduino (9, 10 y 11).
El Secreto (Tierra Común): Es vital conectar el pin GND del Arduino con el polo Negativo (-) de la fuente de 12V. Ambas «tierras» deben estar unidas en la protoboard.
Conexiones:
Sensor de Movimiento (PIR):
VCC ➡️ Pin 5V del Arduino.
GND ➡️ Pin GND del Arduino.
OUT (Señal) ➡️ Pin digital 2 del Arduino.
Circuito de la Tira LED (3x MOSFETs):
Fuente 12V:
Polo Positivo (+) ➡️ Pin
V+(o12V) de la tira LED.Polo Negativo (-) ➡️ Pin GND del Arduino (Esta es la Tierra Común).
Canal Rojo (MOSFET 1):
Pin 9 del Arduino (PWM) ➡️ Pata 1 (Gate) del MOSFET.
Resistencia de 10kΩ ➡️ conectada entre la Pata 1 (Gate) y la Tierra Común.
Pin
Rde la tira LED ➡️ Pata 2 (Drain) del MOSFET.Pata 3 (Source) del MOSFET ➡️ Tierra Común.
Canal Verde (MOSFET 2):
Pin 10 del Arduino (PWM) ➡️ Pata 1 (Gate) del MOSFET.
Resistencia de 10kΩ ➡️ conectada entre la Pata 1 (Gate) y la Tierra Común.
Pin
Gde la tira LED ➡️ Pata 2 (Drain) del MOSFET.Pata 3 (Source) del MOSFET ➡️ Tierra Común.
Canal Azul (MOSFET 3):
Pin 11 del Arduino (PWM) ➡️ Pata 1 (Gate) del MOSFET.
Resistencia de 10kΩ ➡️ conectada entre la Pata 1 (Gate) y la Tierra Común.
Pin
Bde la tira LED ➡️ Pata 2 (Drain) del MOSFET.Pata 3 (Source) del MOSFET ➡️ Tierra Común.
Código de arduino
/* * PROYECTO: Habitación Inteligente Autónoma * CONTROL: Un sensor PIR enciende una tira LED RGB (12V) * usando 3 MOSFETs, con un efecto de "fade-in". */ // --- 1. Definición de Pines --- // Pines de control para los MOSFETs (deben ser PWM ~) const int pinRojo = 9; const int pinVerde = 10; const int pinAzul = 11; // Pin de entrada del sensor de movimiento const int pinPIR = 2; // --- 2. Variables Globales --- // Define el color que queremos (0-255). // Ejemplo: Azul claro (Casi blanco) int R = 230; int G = 230; int B = 255; // Variable para saber si las luces están encendidas o apagadas bool lucesEncendidas = false; void setup() { // Configura los pines de los MOSFETs como SALIDA pinMode(pinRojo, OUTPUT); pinMode(pinVerde, OUTPUT); pinMode(pinAzul, OUTPUT); // Configura el pin del sensor PIR como ENTRADA pinMode(pinPIR, INPUT); } void loop() { // Lee el estado del sensor PIR (HIGH si hay movimiento, LOW si no) int estadoPIR = digitalRead(pinPIR); // --- Lógica Principal --- // CASO 1: El sensor detecta movimiento (HIGH) // Y... las luces están actualmente apagadas if (estadoPIR == HIGH && !lucesEncendidas) { encenderFadeIn(); // Llama a la función de encendido suave lucesEncendidas = true; // Recuerda que las luces están encendidas } // CASO 2: El sensor NO detecta movimiento (LOW) // Y... las luces están actualmente encendidas if (estadoPIR == LOW && lucesEncendidas) { apagarFadeOut(); // Llama a la función de apagado suave lucesEncendidas = false; // Recuerda que las luces están apagadas } } // --- 4. Funciones de Efectos --- void encenderFadeIn() { // Bucle 'for' que va de 0 a 255 (apagado a máximo) for (int i = 0; i <= 255; i++) { // 'map' recalcula el brillo para cada color basado en el máximo analogWrite(pinRojo, map(i, 0, 255, 0, R)); analogWrite(pinVerde, map(i, 0, 255, 0, G)); analogWrite(pinAzul, map(i, 0, 255, 0, B)); // Pequeña pausa para que el 'fade' sea visible delay(10); } } void apagarFadeOut() { // Bucle 'for' que va de 255 a 0 (máximo a apagado) for (int i = 255; i >= 0; i--) { analogWrite(pinRojo, map(i, 0, 255, 0, R)); analogWrite(pinVerde, map(i, 0, 255, 0, G)); analogWrite(pinAzul, map(i, 0, 255, 0, B)); delay(10); } // Aseguramos que todo quede apagado analogWrite(pinRojo, 0); analogWrite(pinVerde, 0); analogWrite(pinAzul, 0); }
Explicación del Código
Variables y Pines:
No se necesita ninguna biblioteca especial, ya que el sensor PIR es una simple entrada digital.
pinRojo,pinVerde,pinAzul: Definen qué pines PWM (~) controlarán cada transistor MOSFET.pinPIR: Define el pin que leerá el sensor de movimiento.R,G,B: Estas variables globales te permiten configurar el color deseado (valores 0-255).lucesEncendidas: Esta variablebool(verdadero/falso) es crucial. Actúa como una memoria para saber si las luces ya están encendidas o apagadas.
Control de Salida PWM (analogWrite):
A diferencia de un control simple (encender/apagar) que usa
digitalWrite, este proyecto usaanalogWrite(pin, valor).Esta función permite enviar un «nivel de potencia» entre 0 (0% de brillo) y 255 (100% de brillo) a los pines PWM.
Al controlar el brillo de cada canal (R, G, B) por separado, podemos crear cualquier color y, lo más importante, los efectos de encendido y apagado suave.
Lógica del loop() (Máquina de Estados):
El
loop()lee constantemente elpinPIR.Decisión de Encendido: La primera condición
ifes la «inteligencia». Solo se cumple siestadoPIR == HIGH(detecta movimiento) Y!lucesEncendidas(las luces están apagadas). Esto evita que la función de encendido se ejecute una y otra vez si sigues moviéndote.Decisión de Apagado: La segunda condición
ifse cumple siestadoPIR == LOW(no hay movimiento) YlucesEncendidas(las luces siguen encendidas).Este método, que usa una variable de estado (
lucesEncendidas), es mucho más eficiente que simplemente encender y apagar en cada ciclo.
Funciones de Efectos (Fade-in / Fade-out):
Aquí ocurre la «magia» visual.
encenderFadeIn(): Usa un bucleforque cuenta dei = 0hasta255. En cada paso, usa la funciónmap()para calcular el brillo correcto para cada color (R, G, B) proporcional al contadori. Eldelay(10)ralentiza el bucle para que el efecto sea visible.apagarFadeOut(): Hace exactamente lo mismo, pero con un bucleforque cuenta hacia atrás, de255a0, atenuando las luces suavemente hasta apagarlas.
Material
Aquí os dejamos los materiales que nosotros compramos cuando empezamos. Si quieres darnos una pequeña ayuda puedes comprar desde este link. Gracias por leernos!
- Placa arduino: https://amzn.to/43LM4k4
- Protoboard: https://amzn.to/3LZaZdM
- Cables: https://amzn.to/3K5N3ox
- Básicos: https://amzn.to/3Kkl1FT
- Pack de lo necesario para empezar: https://amzn.to/3MmuDAs
