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 |
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