Luces de tu cuarto inteligentes

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:

  1. Sensor de Movimiento (PIR):

    • VCC ➡️ Pin 5V del Arduino.

    • GND ➡️ Pin GND del Arduino.

    • OUT (Señal) ➡️ Pin digital 2 del Arduino.

  2. Circuito de la Tira LED (3x MOSFETs):

    • Fuente 12V:

      • Polo Positivo (+) ➡️ Pin V+ (o 12V) 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 R de 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 G de 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 B de 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

  1. 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 variable bool (verdadero/falso) es crucial. Actúa como una memoria para saber si las luces ya están encendidas o apagadas.

  2. Control de Salida PWM (analogWrite):

    • A diferencia de un control simple (encender/apagar) que usa digitalWrite, este proyecto usa analogWrite(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.

  3. Lógica del loop() (Máquina de Estados):

    • El loop() lee constantemente el pinPIR.

    • Decisión de Encendido: La primera condición if es la «inteligencia». Solo se cumple si estadoPIR == 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 if se cumple si estadoPIR == LOW (no hay movimiento) Y lucesEncendidas (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.

  4. Funciones de Efectos (Fade-in / Fade-out):

    • Aquí ocurre la «magia» visual.

    • encenderFadeIn(): Usa un bucle for que cuenta de i = 0 hasta 255. En cada paso, usa la función map() para calcular el brillo correcto para cada color (R, G, B) proporcional al contador i. El delay(10) ralentiza el bucle para que el efecto sea visible.

    • apagarFadeOut(): Hace exactamente lo mismo, pero con un bucle for que cuenta hacia atrás, de 255 a 0, 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!