Hacklab ASU logo Hacklab ASUHacer, reparar, aprender juntos
Proyectos

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.

Arduino Uno on a workbench wired to a white dome motion sensor module and a red LED on a breadboard

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.

  1. VCC al pin 5V del Arduino. El módulo acepta de 4,5 a 20 voltios.
  2. GND a cualquier GND del Arduino.
  3. OUT al pin digital 2.
  4. 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í:

  1. Al inicio defines dos constantes: el pin del sensor, 2, y el pin del LED, 13.
  2. En setup() configuras el pin 2 como INPUT con pinMode, el pin 13 como OUTPUT, y abres el monitor serie con Serial.begin(9600).
  3. 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.
  4. En loop() lees el sensor con digitalRead(2) y guardas el valor en una variable.
  5. 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.
  6. 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.

LB
Lucía Benítez

Lucía empezó reparando radios viejas en la mesa de la cocina y hoy escribe sobre circuitos, Arduino y radiofrecuencia sin dar nada por sabido.

More posts by Lucía

More in Proyectos

01doorganico 084goad 3hot8 4465456 after5internprogram ahandfulofblessings ahmadpc ahomcybersecurity allodialresources annodex antiquesandperiodcollectibles aotc asianworldkashmir beedlectrics bloggertemplatefree bluefeatheragency bodyweightsolution campaign08blog carfixadvisor catstreetcollective cbstvsports cnfanspurchasing committeeof500yearsofdignityandresistance covertopsdjs cs-kaiyuangame cuestacomunicaciontotal cxoutlet dancebetgame deskgearhub destinyvillastay detectmagazine di33 diamondsteelbuildings donmo dyanadropship emarsysfinance emimattl escapechan eskitarih evautoplay everythingweddings-orlando farmzone feedviewerapp foxstudiosscratch gamevui123 gleasongrade greetingsday haskell iw-kaiyun jagoanproperti jilidskripsi joltbusinessfinance juegodepokergratis juegospucca kaeru-festival latestmehndidesigns lestanzediottaviano litemagazines localcommunityhero lustrsazan mariashebets menswheels newwebstechs1 nikkit ootheday oxigenvpn plurfitness prefetial probudgetcarpetcleaning psychicmrsmartin pyaten qvantor rejoignezlogis rexzbot riselayouts ruchin rwxqsgd5 sakaltime shibiaowang shop-bot skrtips strcoding tetapatrium topselller uneplanteartificielle vipertechcr webtech1223411 wo-kygaming yamaha-mekar yeknava yoybuysheets zenunwa yamaha-mekar jilidskripsi ankertoto ankertoto ankertoto ankertoto