Cómo usar un sensor PIR con Arduino para detectar movimiento
Conectaste el módulo de movimiento, cargaste el código de ejemplo y el LED se queda encendido todo el tiempo, o se dispara solo cuando no hay nadie en la habitación.

Conectaste el módulo de movimiento, cargaste el código de ejemplo y el LED se queda encendido todo el tiempo, o se dispara solo cuando no hay nadie en la habitación. Es el problema más común con estos sensores y casi nunca es culpa del Arduino.
Un sensor PIR con Arduino es uno de los proyectos más útiles para empezar: sirve para encender una luz al pasar, avisar si alguien entra al taller o activar una cámara. En esta guía conectamos el módulo HC-SR501, que cuesta entre 1 y 3 euros, explicamos sus dos potenciómetros y el puente de modo, y escribimos un programa que no se confunde con disparos falsos. Todo lo hemos probado en el hacklab con un Arduino Uno y un Nano.
Qué detecta un sensor PIR y qué no
PIR significa sensor infrarrojo pasivo. No emite nada: mide la radiación de calor que llega a su superficie. Dentro hay dos elementos sensibles colocados uno al lado del otro. Cuando un cuerpo caliente cruza delante, primero lo ve un elemento y luego el otro, y esa diferencia es lo que el módulo interpreta como movimiento.
Esto tiene consecuencias prácticas:
- Detecta mejor el movimiento que cruza su campo de visión que el que se acerca de frente.
- No ve a través del cristal. Una ventana bloquea casi toda la radiación infrarroja que necesita.
- No detecta a una persona quieta. Si alguien se queda inmóvil, la salida acaba bajando.
- Reacciona a cambios de calor bruscos: un radiador que se enciende, el sol entrando por la ventana o el aire de un calefactor.
La lente blanca en forma de cúpula es una lente de Fresnel. Concentra el calor y amplía el ángulo de detección a unos 110 a 120 grados, con un alcance de entre 3 y 7 metros según el ajuste.
Materiales y conexiones del sensor PIR con Arduino
Necesitas muy poco:
- Un Arduino Uno, Nano o compatible.
- Un módulo HC-SR501.
- Un LED y una resistencia de 220 ohmios para la prueba.
- Tres cables dupont hembra a macho.
El módulo tiene tres pines. Quita la cúpula con cuidado, tira hacia arriba sin girar, y verás las marcas impresas junto a los pines: normalmente GND, OUT y VCC, pero el orden cambia entre fabricantes, así que compruébalo siempre antes de conectar.
- VCC al pin 5V del Arduino. El módulo acepta de 4,5 a 20 voltios.
- GND a cualquier GND del Arduino.
- OUT al pin digital 2.
- El LED con su resistencia en el pin 13, o usa el LED integrado de la placa.
La salida del módulo da unos 3,3 voltios en estado alto, suficiente para que el Arduino la lea como HIGH. No necesitas resistencia de pull-up en esa línea.
Los potenciómetros y el puente de modo
En la parte de abajo hay dos potenciómetros naranjas y un puente de tres pines. Aquí está el origen de casi todos los problemas.
Sensibilidad (Sx)
Ajusta el alcance. Girado a la izquierda, unos 3 metros. Girado a la derecha, hasta 7 metros. Más alcance significa también más disparos falsos.
Tiempo de retardo (Tx)
Define cuánto tiempo se queda la salida en alto después de detectar algo. Va desde unos 3 segundos con el potenciómetro a la izquierda hasta unos 5 minutos a la derecha. Muchos módulos vienen de fábrica con un valor alto, y por eso el LED parece "encendido siempre".
Puente H o L
En la posición H (redisparo), cada nuevo movimiento reinicia el temporizador mientras haya actividad. En la posición L (disparo único), la salida baja al acabar el tiempo aunque sigas moviéndote, y luego vuelve a subir. Para luces y alarmas, H es casi siempre lo que quieres.
Un detalle que pocos tutoriales mencionan: después de cada apagado de la salida hay un bloqueo de unos 2 a 3 segundos durante el cual el sensor no detecta nada. Si tu prueba parece fallar justo después de una detección, es eso.
El programa paso a paso
La lógica es sencilla. Lo escribimos en el IDE de Arduino así:
- Al inicio defines dos constantes: el pin del sensor, 2, y el pin del LED, 13.
- En setup() configuras el pin 2 como INPUT con pinMode, el pin 13 como OUTPUT, y abres el monitor serie con Serial.begin(9600).
- Añades una espera de calentamiento de 60 segundos con delay(60000). El módulo necesita entre 30 y 60 segundos al encenderse para estabilizarse, y durante ese tiempo da lecturas aleatorias.
- En loop() lees el sensor con digitalRead(2) y guardas el valor en una variable.
- Comparas ese valor con el estado anterior. Solo cuando pasa de LOW a HIGH imprimes "Movimiento detectado" y enciendes el LED. Cuando pasa de HIGH a LOW, imprimes "Fin del movimiento" y lo apagas.
- Guardas el valor actual como estado anterior para la siguiente vuelta.
Detectar el cambio de estado, en lugar de imprimir cada vez que la lectura es HIGH, evita llenar el monitor serie de mensajes y te permite contar eventos reales. Si luego quieres encender una lámpara de 230 voltios, sustituye el LED por un módulo relé siguiendo nuestra guía sobre cómo usar un módulo relé con Arduino sin riesgos.
Por qué no conviene subir la sensibilidad al máximo
En foros y vídeos se repite el consejo de girar la sensibilidad al máximo "para que no se te escape nada". En la práctica es la causa principal de disparos falsos. Con 7 metros de alcance, el sensor ve el radiador del pasillo, la ventana con sol de tarde y hasta el aire caliente que sale del portátil.
Nuestra recomendación es empezar con el potenciómetro de sensibilidad en la mitad y el de tiempo casi al mínimo, con el puente en H. Deja que el código controle cuánto tiempo se queda encendida la luz, por ejemplo 30 segundos medidos con millis(). Así cambias el comportamiento desde el programa sin tener que desmontar nada.
Otros dos trucos que nos funcionaron: apuntar el sensor hacia donde la gente cruza y no hacia la puerta de frente, y alimentar el Arduino con una fuente estable. Un cargador de móvil barato con mucho ruido eléctrico provoca falsos disparos. Si combinas el PIR con otro sensor, como el ultrasónico de nuestra guía para medir distancia con Arduino y el HC-SR04, puedes exigir que ambos coincidan antes de activar una alarma.
Si te interesan los proyectos de seguridad casera, el detector de gas con Arduino y sensor MQ-2 usa una estructura de programa muy parecida.
Preguntas frecuentes
¿Por qué mi sensor PIR siempre está en HIGH?
Lo más probable es que el potenciómetro de tiempo esté al máximo, unos 5 minutos, o que el sensor aún esté calentándose. Gira el potenciómetro de tiempo hacia la izquierda y espera 60 segundos tras encenderlo. Si sigue igual, revisa que no apunte a una fuente de calor.
¿Qué alcance tiene el sensor PIR HC-SR501?
Entre 3 y 7 metros, según cómo ajustes el potenciómetro de sensibilidad. El ángulo de detección ronda los 110 a 120 grados gracias a la lente de Fresnel. Detecta mejor el movimiento lateral que el que avanza de frente.
¿Se puede conectar un sensor PIR a 3,3 voltios?
El HC-SR501 está pensado para 4,5 a 20 voltios en el pin VCC, así que a 3,3 voltios no funciona de forma fiable. Para placas de 3,3 voltios, como el ESP32, aliméntalo con 5 voltios y conecta la salida directamente, porque ya da unos 3,3 voltios. Otra opción es usar un módulo más pequeño, como el AM312.
More in Proyectos
Proyectos
Detector de gas con Arduino y sensor MQ-2 paso a paso
Un olor raro en la cocina a las once de la noche y la duda de siempre: ¿es la bombona o son imaginaciones?
Proyectos
Cómo hacer un reloj con Arduino y el módulo DS3231
Montas un reloj con Arduino usando millis(), lo dejas encendido una semana y descubres que va dos minutos adelantado.
Proyectos
Cómo hacer una cerradura RFID con Arduino paso a paso
Pierdes las llaves del taller dos veces al mes, o quieres que tu hermano pequeño deje de abrir el cajón de las herramientas.