Reaprovechando tiras de led WS2812b con sensor PIR para encendido automático tras detección movimiento

En este proyecto, reaprovechamos unas tiras de led WS2812B para montar una tira de led que se encienda cuando detecta movimiento gracias al sensor PIR que la acompaña junto con nuestro controlador arduino, útil para iluminar zonas oscuras en nuestra casa por ejemplo.

 

Sensor PIR

 Este sensor mide la radiación infrarroja que emiten todos los objetos. El sensor Passive InfrarRed o Pasivo Infrarrojo  recibe la variación de las radiaciones infrarrojas del medio ambiente que cubre. Es llamado pasivo debido a que no emite radiaciones al entorno, solo las recibe. Permiten captar movimiento en su entorno detectando la diferencia entre el calor emitido por un cuerpo y el espacio de alrededor.


Detalle del sensor PIR


Diagrama de Conexión

 El diagrama de conexión es el que se muestra a continuación. Si ubicamos las patillas del sensor en la posición del diagrama podemos observar que la patilla central será la que mandará la señal a nuestro controlador para su procesamiento, la patilla izquierda va a masa (GND) y la derecha a VCC.

Diagrama de conexión en protoboard
La tira de led WS2812b precisa de una señal de control que va al pin de arduino con una resistencia de 420 Ohms para proteger al pin, y de igual manera se alimenta con los 5 V y GND de Arduino. Podemos alimentar de manera "segura" hasta al menos 6 leds, más que suficiente para iluminar un espacio oscuro cercano al sensor PIR. Como tarea adicional quedaría alimentar a todo el proyecto con unas baterías o pilas alcalinas de 1,5 V, de tal manera que pudiéramos ubicarlo en cualquier sitio sin necesidad de alimentación AC.

Código

A continuación mostramos el código para nuestro diagrama de conexión, el led se encenderá cuando PIR le mande la señal de detección de movimiento y permanecerá 10 segundos encendido hasta que se apague de nuevo. Es preciso iniciar el sensor con un tiempo de espera de unos 30 segundos (en el setup) para su correcto calibrado.

#include <Adafruit_NeoPixel.h>
#include <avr/power.h>
#define PIR  7
#define PIXEL_PIN 8
#define NUMPIXELS 3
#define INTENSIDAD 200
#define delayval 100 // Pausa de cincuenta milisegundos
#define tiempoEncLed 10000 //ms permanece encendido
int ESTADO = 0;
    
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
//Definimos nuestras variables de tipo uint32 para cada color que utilizaremos
  // pixels.Color toma valores en RGB, desde 0,0,0 hasta 255,255,255
  uint32_t negro = pixels.Color(0,0,0);
   uint32_t rojo = pixels.Color(INTENSIDAD,0,0);
   uint32_t verde = pixels.Color(0,INTENSIDAD,0);
   uint32_t azul = pixels.Color(0,0,INTENSIDAD);
     uint32_t amarillo = pixels.Color(INTENSIDAD,INTENSIDAD,0);
   uint32_t morado = pixels.Color(INTENSIDAD,0,INTENSIDAD);
   uint32_t celeste = pixels.Color(0,INTENSIDAD,INTENSIDAD);
   uint32_t blanco = pixels.Color(INTENSIDAD,INTENSIDAD,INTENSIDAD);
   uint32_t rosa= pixels.Color(22,2,2);
     uint32_t marron= pixels.Color(128,0,0);  

void setup() {
  // put your setup code here, to run once:
   Serial.begin(9600);
 
    pixels.begin();
    //pixels.setBrightness(49);
    pixels.show(); // Initialize all pixels to 'off'
    Serial.println(F("Se inicia la tira de led"));
    pinMode(PIR,INPUT);
        Serial.println(F("Se inicia PIR, 20 seg"));
    delay(20000); //valor de inicio necesario para lecturas correctas PIR
    Serial.println(F("PIR iniciado"));
}

void loop() {

 
  if(detectaMovimiento()){
    enciendeLeds();
  }
 
}  

byte detectaMovimiento(){
   ESTADO = digitalRead(PIR);
  if(ESTADO == HIGH){
     Serial.println(F("Detectado movimiento"));
    return 1;
  }
  else{
    return 0;
  }
}

void enciendeLeds(){
color_pixel(rojo);
color_pixel(amarillo);
color_pixel(blanco);
delay(tiempoEncLed);
color_pixel(negro);
 
  delay(1000);  // Pausa de un segundo
 
 
}

void color_pixel(uint32_t color)
{
 
 for(int i=0;i<NUMPIXELS;i++){

    pixels.setPixelColor(i, color); // Brillo moderado en azul

    pixels.show();   // Mostramos y actualizamos el color del pixel de nuestra cinta led RGB

    delay(delayval); // Pausa por un periodo de tiempo (en milisegundos).

  }

delay(150);
 
}

Y eso es todo. Gracias por tu tiempo y atención.

 Referencias

  • https://www.youtube.com/watch?v=eFoa88s6yZY