Skip to Content

Cómo utilizar el sensor de movimiento PIR HC-SR501 con Arduino

Cómo utilizar el sensor de movimiento PIR HC-SR501 con Arduino

En este tutorial, aprenderás cómo funciona el sensor de movimiento PIR HC-SR501 y cómo puedes utilizarlo con Arduino. Puedes encontrar sensores infrarrojos pasivos (PIR) a tu alrededor, no sólo se utilizan para fines de seguridad, sino también en la mayoría de los sistemas de iluminación de activación automática.

En este artículo, he incluido un diagrama de cableado y códigos de ejemplo para que puedas empezar a experimentar con tu sensor. Después de cada ejemplo, desgloso y explico cómo funciona el código, por lo que no deberías tener problemas para modificarlo y adaptarlo a tus necesidades.

Primero te mostraré cómo puedes utilizar el HC-SR501 como unidad independiente. A continuación, lo conectaremos a un Arduino UNO y te mostraré cómo utilizarlo como un sencillo sistema de alarma.

Este tutorial se centra en el sensor HC-SR501, pero también puede utilizar el código proporcionado para sensores similares como el HC-SR505 o el AM312. La principal diferencia es que estos sensores más baratos tienen un rango de detección más pequeño y no tienen un potenciómetro para ajustar la sensibilidad y el tiempo de retardo.

Suministros

Componentes de hardware

HC-SR501Sensor de movimiento PIR HC-SR501× 1Amazon
Arduino Uno Rev 3Arduino Uno Rev3× 1Amazon
Tablero de pruebas× 1Amazon
Cables de puente× 10Amazon
resistenciaSurtido de resistencias× 1Amazon
rojo-ledLEDs× 1Amazon
zumbadorZumbador pasivo× 1Amazon
Cable USB tipo A/B× 1Amazon

Software

Arduino IDEArduino IDE

Makerguides.com is a participant in the Amazon Services LLC Associates Program, an affiliate advertising program designed to provide a means for sites to earn advertising fees by advertising and linking to products on Amazon.com. As an Amazon Associate we earn from qualifying purchases.

¿Cómo funciona un sensor de movimiento PIR?

Los sensores de movimiento PIR constan de dos partes principales: un elemento sensor piroeléctrico y una lente fresnel. El elemento sensor piroeléctrico puede detectar la radiación infrarroja. Todos los objetos con una temperatura superior al cero absoluto (0 Kelvin / -273,15 °C) emiten energía térmica en forma de radiación infrarroja, incluidos los cuerpos humanos.

Principio de funcionamiento del sensor de movimiento HC-SR501-PIR
PIR Motion Sensor Function

Un sensor piroeléctrico tiene dos ranuras rectangulares de un material que permite el paso de la radiación infrarroja. Detrás de ellas, hay dos electrodos de sensor de infrarrojos separados, uno responsable de producir una salida positiva y el otro una salida negativa. La razón es que estamos buscando un cambio en los niveles de IR y no en los niveles de IR del ambiente. Los dos electrodos están conectados para que se anulen mutuamente. Si una mitad ve más o menos radiación IR que la otra, la salida oscilará alta o baja.

El circuito integrado de procesamiento de señales procesa esta señal y convierte el pin de salida del sensor en ALTO o BAJO en consecuencia.

HC-SR501-PIR-Sensor de movimiento-elemento piroeléctrico
PIR Motion Sensor Housing

La cúpula blanca situada delante del elemento sensor es una lente fresnel. Esta lente enfoca la radiación infrarroja hacia el sensor.

HC-SR501-PIR-Sensor de movimiento-principio de funcionamiento de la lente de Fresnel
PIR Motion Sensor Fresnel Lens

Sensor de movimiento PIR HC-SR501

El sensor de movimiento PIR HC-SR501 está construido en torno al CI de detección de movimiento PIR BISS0001 Micro Power. Este IC está específicamente desarrollado para procesar la señal de los sensores de movimiento PIR.

Si retira la lente de fresnel, verá el elemento sensor piroeléctrico RE200B. En la placa de circuito impreso también se encuentra un regulador de voltaje incorporado. Esto significa que puedes alimentar la placa con un amplio rango de tensión continua, normalmente se utilizan 5 V.

Las especificaciones del HC-SR501 se indican en la siguiente tabla, tenga en cuenta que puede haber pequeñas diferencias entre los fabricantes.

Especificaciones del HC-SR501

Tensión de funcionamiento4.5 - 20 V
Corriente de reposo50 μA
Nivel de salidaALTO 3,3 V / BAJO 0 V
DisparadorDisparo simple L / Disparo repetido H
Tiempo de retraso3 - 300 s
Tiempo de bloqueo2,5 s (por defecto)
DisparadorDisparo simple L / Disparo repetido H
Rango de medición3 - 7 m máximo
2 mm
Ángulo de medición< 110° cone angle
Dimensiones de la placa de circuito impreso32,5 x 24 mm
Agujeros de montaje2 mm, separación de 28,5 mm
Dimensiones de la lente de Fresnel15 mm x 23 mm de diámetro
Temperatura de funcionamiento-15 - 70 °C
CosteComprobar el precio

Para más información, puede consultar las hojas de datos que aparecen a continuación:

Ajuste del HC-SR501

En la parte trasera de la placa encontrarás dos potenciómetros y un jumper, con los que podrás ajustar varios parámetros:

HC-SR501-Pinout-Anotación
HC-SR501 Board Pinout

Ajuste de la sensibilidad (rango)

El HC-SR501 tiene una distancia máxima de detección de 7 metros. Puede ajustar la distancia de detección girando el potenciómetro de sensibilidad en el sentido de las agujas del reloj o en el sentido contrario (véase la imagen anterior). Al girar el potenciómetro en el sentido de las agujas del reloj, la distancia de detección aumenta hasta un máximo de 7 metros. Si se gira en sentido contrario a las agujas del reloj, la distancia de detección disminuye hasta un mínimo de 3 metros.

Ajuste del tiempo de retardo (Tx)

Con este potenciómetro se puede ajustar el tiempo que la salida permanece en ALTO tras la detección de movimiento. Como mínimo, el retardo es de 3 segundos y como máximo, de 300 segundos o 5 minutos. Gire el potenciómetro en el sentido de las agujas del reloj para aumentar el retardo y en el sentido contrario para disminuirlo.

Puente de selección de disparo

El puente (amarillo) permite seleccionar uno de los dos modos de disparo. Puede ajustarse a L (disparo simple) o H (disparo repetido):

  • Disparo simple - La salida se pondrá en ALTO en cuanto se detecte movimiento. Permanecerá en ALTO durante el tiempo establecido por el potenciómetro. Cualquier movimiento durante este periodo no se procesa y no reinicia el temporizador.
  • Disparo repetido - Cada vez que se detecta movimiento, el temporizador de retardo se reinicia.

La diferencia entre el modo de disparo simple y el repetitivo se muestra en la siguiente figura.

Diferencia-entre-disparo-simple-y-disparo-repetitivo-HC-SR501
Diferencia entre el modo de disparo simple y repetitivo. Las flechas indican el tiempo de retardo establecido.

Añadir un termistor y/o una LDR al HC-SR501

Como puede verse en la imagen siguiente, el HC-SR501 tiene almohadillas de soldadura para dos componentes adicionales. Estas almohadillas suelen estar etiquetadas como 'RL' y 'RT'.

HC-SR501-RL-and-RT-solder-pads
HC-SR501 Soldering Pads
  • RL - Aquí se puede añadir una resistencia dependiente de la luz (LDR) o una fotorresistencia que tenga una baja resistencia bajo una fuerte luz ambiental. Esto hace que el detector sea operativo sólo cuando el área de detección es suficientemente oscura.
  • RT - Esta almohadilla está pensada para un termistor. Al añadirlo, la sensibilidad del sensor depende menos de la temperatura ambiente.

Lamentablemente, no se proporciona información adicional en las hojas de datos, por lo que no estoy del todo seguro de los valores de los componentes que debería utilizar.

Uso del sensor de movimiento PIR HC-SR501 como unidad independiente

Para la mayoría de las aplicaciones, puede utilizar el HC-SR501 como una unidad independiente. Puede utilizar la señal de salida para activar cosas como relés y LEDs.

El cableado es muy sencillo como se puede ver en la imagen de abajo. Simplemente hay que conectar VCC y GND a una batería y un LED rojo entre el pin de salida y tierra. La tensión de salida es de 3,3 V, por lo que añadí una resistencia limitadora de corriente de 68 Ω en serie con el LED.

HC-SR501-PIR-sensor de movimiento-con-LED-diagrama-cableado-esquema
Diagrama de cableado del sensor de movimiento PIR HC-SR501 con LED

Tenga en cuenta que después de encender el sensor, debe esperar entre 30 y 60 segundos para que se inicialice. Durante este periodo, el LED puede parpadear un par de veces. Después de esperar un minuto, puede agitar la mano delante del sensor y debería ver cómo se ilumina el LED.

Con esta configuración, es fácil probar la funcionalidad del sensor. También es un buen momento para jugar con los ajustes de sensibilidad y retardo, así como con los dos modos de disparo diferentes.

Cableado - Conexión del sensor de movimiento HC-SR501 PIR a Arduino UNO

Si conectas el sensor de movimiento a un microcontrolador como el Arduino UNO, podrás utilizarlo para controlar todo tipo de cosas: LEDs, relés, motores, zumbadores, etc.

En el diagrama de cableado de abajo, puedes ver cómo conectarlo al Arduino. Puedes leer el sensor con uno de los pines de entrada/salida de propósito general (GPIO) del Arduino. En este ejemplo, lo he conectado al pin digital 2. Los pines VCC y GND están conectados a 5 V y GND respectivamente.

HC-SR501-PIR-sensor de movimiento-con-Arduino-UNO-diagrama-cableado-esquema
Sensor de movimiento PIR HC-SR501 con diagrama de cableado Arduino

Las conexiones también se indican en la tabla siguiente:

Conexiones del sensor de movimiento PIR HC-SR501

Sensor de movimiento PIR HC-SR501Arduino
VCC5 V
OUTClavija 2
GNDGND

Una vez que hayas cableado el sensor, el siguiente paso es cargar un código de ejemplo.

Sensor de movimiento PIR HC-SR501 con código de ejemplo de Arduino UNO

Con el siguiente código de ejemplo, puedes leer el sensor y controlar el LED de la placa del Arduino (conectado al pin 13). Este código también se puede utilizar para controlar relés simples para encender o apagar una luz más grande.

Puedes cargar el código de ejemplo con el IDE de Arduino.

Para que este código funcione correctamente, es mejor poner el puente de modo de disparo en 'H' (modo de disparo repetido). Ajuste también el potenciómetro de retardo al valor más bajo. Gíralo en sentido contrario a las agujas del reloj hasta el tope.

El código leerá el estado del sensor (HIGH o LOW) y encenderá o apagará el LED de la placa en consecuencia. También imprimirá un mensaje en el Monitor Serial, al que puedes acceder en Herramientas o escribir (Ctrl+Mayús+M).

/* Example code for HC-SR501 PIR motion sensor with Arduino. More info: www.www.makerguides.com */

// Define connection pins:
#define pirPin 2
#define ledPin 13

// Create variables:
int val = 0;
bool motionState = false; // We start with no motion detected.

void setup() {
  // Configure the pins as input or output:
  pinMode(ledPin, OUTPUT);
  pinMode(pirPin, INPUT);

  // Begin serial communication at a baud rate of 9600:
  Serial.begin(9600);
}

void loop() {
  // Read out the pirPin and store as val:
  val = digitalRead(pirPin);

  // If motion is detected (pirPin = HIGH), do the following:
  if (val == HIGH) {
    digitalWrite(ledPin, HIGH); // Turn on the on-board LED.

    // Change the motion state to true (motion detected):
    if (motionState == false) {
      Serial.println("Motion detected!");
      motionState = true;
    }
  }

  // If no motion is detected (pirPin = LOW), do the following:
  else {
    digitalWrite(ledPin, LOW); // Turn off the on-board LED.

    // Change the motion state to false (no motion):
    if (motionState == true) {
      Serial.println("Motion ended!");
      motionState = false;
    }
  }
}

Debería ver la siguiente salida en el monitor de serie:

HC-SR501 Sensor de movimiento PIR Salida de monitor en serie
Salida del sensor PIR en el monitor de serie

Explicación del código:

El código es bastante sencillo y no necesitas ninguna librería de Arduino para utilizar este sensor.

El sketch comienza definiendo el pin del sensor PIR y el pin del LED. Los conecté a los pines 2 y 13 de Arduino (LED de la placa).

La declaración #define se utiliza para dar un nombre a un valor constante. El compilador sustituirá cualquier referencia a esta constante por el valor definido cuando se compile el programa. Por lo tanto, en todos los casos en los que se menciona pirPinel compilador lo sustituirá por el valor 2 al compilar el programa.

También he creado dos variables, val y motionStateque son un entero y booleano (verdadero/falso) respectivamente. La variable val se utiliza para almacenar la salida del sensor PIR (HIGH o LOW) y motionState se convertirá en verdadero mientras se detecte movimiento y en falso cuando no haya movimiento.

// Define connection pins:
#define pirPin 2
#define ledPin 13

// Create variables:
int val = 0;
bool motionState = false; // We start with no motion detected.

En el setup(), establecemos los pines como de entrada o de salida con la función pinMode(pin,mode). El pirPin es una entrada y el ledPin es una salida. También comenzamos la comunicación en serie con una tasa de baudios de 9600. Asegúrate de que el Monitor Serial también está configurado a 9600.

void setup() {
  // Configure the pins as input or output:
  pinMode(ledPin, OUTPUT);
  pinMode(pirPin, INPUT);

  // Begin serial communication at a baud rate of 9600:
  Serial.begin(9600);
}

En el loop()Primero leo el sensor con la función digitalRead(pin). Esta función devuelve HIGH o LOW.

  // Read out the pirPin and store as val:
  val = digitalRead(pirPin);

Cuando la salida/valor del sensor es HIGH, enciendo el LED con la función digitalWrite(pin,value).

  // If motion is detected (pirPin = HIGH), do the following:
  if (val == HIGH) {
    digitalWrite(ledPin, HIGH); // Turn on the on-board LED.

    // Change the motion state to true (motion detected):
    if (motionState == false) {
      Serial.println("Motion detected!");
      motionState = true;
    }
  }

A continuación, el motionState se cambia a true y el mensaje 'Motion detected!' se imprime en el Serial Monitor. Observe que primero compruebo el motionState actual, esto asegura que el mensaje sólo se imprime una vez por evento de movimiento.

Si ya no hay movimiento delante del sensor, val cambiará a LOW y el LED se apagará y se imprimirá en el monitor serie el mensaje "¡Movimiento terminado!".

Crear un sistema de alarma con sensor de movimiento PIR y zumbador

Con algunos cambios sencillos, puede crear un sistema de alarma con el HC-SR501 y un zumbador piezoeléctrico. He conectado el zumbador con una resistencia de 100 Ω entre el pin digital 5 y GND. Probablemente puedas usar el zumbador sin una resistencia (esto lo hace más fuerte), pero no sonará tan bien.

HC-SR501-PIR-sensor de movimiento-con-zumbador-y-Arduino-UNO-diagrama-cableado-esquema
Sensor de movimiento PIR HC-SR501 con Arduino UNO y diagrama de cableado del zumbador.

El código de abajo es mayormente el mismo que el del ejemplo anterior. Sólo he añadido una función para crear el sonido de la alarma. Usted puede cambiar el tono del timbre cambiando el parámetro de entrada de la función alarm(duration,frequency) función.

/* Example code to create an alarm system with HC-SR501 PIR motion sensor, buzzer and Arduino. More info: www.www.makerguides.com */

// Define connection pins:
#define buzzerPin 5
#define pirPin 2
#define ledPin 13

// Create variables:
int val = 0;
bool motionState = false; // We start with no motion detected.

void setup() {
  // Configure the pins as input or output:
  pinMode(buzzerPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(pirPin, INPUT);

  // Begin serial communication at a baud rate of 9600:
  Serial.begin(9600);
}

void loop() {
  // Read out the pirPin and store as val:
  val = digitalRead(pirPin);

  // If motion is detected (pirPin = HIGH), do the following:
  if (val == HIGH) {
    digitalWrite(ledPin, HIGH); // Turn on the on-board LED.
    alarm(500, 1000);  // Call the alarm(duration, frequency) function.
    delay(150);

    // Change the motion state to true (motion detected):
    if (motionState == false) {
      Serial.println("Motion detected!");
      motionState = true;
    }
  }

  // If no motion is detected (pirPin = LOW), do the following:
  else {
    digitalWrite(ledPin, LOW); // Turn off the on-board LED.
    noTone(buzzerPin); // Make sure no tone is played when no motion is detected.
    delay(150);

    // Change the motion state to false (no motion):
    if (motionState == true) {
      Serial.println("Motion ended!");
      motionState = false;
    }
  }
}

// Function to create a tone with parameters duration and frequency:
void alarm(long duration, int freq) {
  tone(buzzerPin, freq);
  delay(duration);
  noTone(buzzerPin);
}

Aspectos a tener en cuenta al diseñar un sistema de sensores PIR

Al igual que otros sensores PIR, el HC-SR501 necesita un tiempo para inicializarse y ajustarse a los niveles de infrarrojos de la habitación. Esto tarda aproximadamente 1 minuto cuando se enciende por primera vez. Intente eliminar cualquier movimiento delante del sensor durante este periodo.

El viento y una fuente de luz cercana al sensor pueden causar interferencias, así que intenta ajustar tu configuración para evitarlo. Además, ten en cuenta que debes montar el sensor en horizontal, ya que la mayor parte del movimiento se producirá en el plano horizontal (por ejemplo, al caminar).

Además del tiempo de retardo (Tx), el sensor también tiene un "tiempo de bloqueo" (Ti). Por defecto, el tiempo de bloqueo es de 2,5 segundos y no es muy fácil de cambiar (véase la hoja de datos del BISS0001). Cada vez que la salida pasa de HIGH a LOW, comienza el periodo de bloqueo. Durante este periodo de tiempo, el sensor no detectará ningún movimiento.

Al diseñar un sistema basado en el HC-SR501, deberá tener en cuenta estos periodos de retardo.

Conclusión

En este artículo, te he mostrado cómo funciona el sensor de movimiento PIR HC-SR501 y cómo puedes utilizarlo con Arduino. Espero que te haya resultado útil e informativo. Si lo has hecho, ¡compártelo con un amigo al que también le guste la electrónica y hacer cosas!

Me encantaría saber qué proyectos planeas construir (o ya has construido) con este sensor. Si tienes alguna pregunta, sugerencia, o si crees que faltan cosas en este tutorial, por favor deja un comentario abajo.

Tenga en cuenta que los comentarios son retenidos por la moderación para evitar el spam.

Roy

Sunday 2nd of June 2024

Great article, thanks. I am using the hc-sr501 in stand alone mode and I would like to utilise the RL feature with an LDR. I want to switch the circuit off during the day but I have no experience of LDR’s can someone suggest a specific device?

Stefan Maetschke

Sunday 2nd of June 2024

Hi, You will need one of these: https://amzn.to/3wQ0QsP Which one depends at what level of light the PIR sensor should switch off. The set has LDRs with different base resistances and you will have to try out which works best for your use case.

J van Wezel

Thursday 28th of March 2024

Hello Benne, I connected a HC501 sensor to a HW307 relay. Immediatly both te leds (red and green) go on and the relay doesn't react on the sensor (stays High). I try this connection without using arduino. Can you help me to solve this "mistery"?

Johan van Wezel

Monday 1st of April 2024

@Stefan Maetschke, Thx for your quick response. But I still have the same problem. I made some pictures that might help you. But I don’t know how to send them to you.

Stefan Maetschke

Thursday 28th of March 2024

Hi, the HC-SR501 sensor can take up to one minute to initialize and the output might be high during that time. Then there is an adjustable delay of up to 5mins (depending on the setting of that little poti on the sensor). (https://www.mpja.com/download/31227sc.pdf) So, worst case your relay may stay on for 6 minutes before the sensor/circuit starts to react to motion and if there is any motion detected during that time frame the sensor stays high as well.

Reduce the time delay as much as possible (turn poti left) and it should react nicely. I recreated the circuit and with a short time delay it reacts within less on 1 sec.

Hope this helps ; )

hogo

Miércoles 18 de mayo de 2022

hola a todos cuando uso el PIR SR501 con un zumbador peizo, cuando suena el zumbador, el sensor PIR se activa falsamente. Yo uso un zumbador como abajo. https://assoc-redirect.amazon.com/g/r/https://www.amazon.com/Xnrtop-Continuous-Decibel-Buzzer-Speaker/dp/B07VCK2FTK/ref=sr_1_11?keywords=piezoelectric+buzzer&linkCode=ll2&linkId=6096839e36d5708a1bd01b38ae7968eb&qid=1652877367&sr=8-11 ¿alguien ha recomendado?

NEIL IVES

Domingo 21 de marzo de 2021

Para evitar sorpresas de frío, estoy planeando un sistema para cerrar los grifos de agua caliente de la casa cuando alguien está en la ducha. Este detector de infrarrojos se montará de forma que detecte a una persona que se encuentre bajo la alcachofa de la ducha al final del baño. La salida activará los interruptores CMOS para cerrar las válvulas de agua de la casa. Necesito que la sensibilidad sea ajustable para que una persona que se bañe no active el circuito. También quiero que las válvulas permanezcan cerradas durante un tiempo en el caso de que la persona que se bañe se quede quieta el tiempo suficiente para que se libere el circuito; el ajustador de retardo será importante.

Ron K

Sábado 23 de enero de 2021

Para mí, la hoja de datos no proporciona información crítica. ¿Cambia el alcance mínimo con el alcance máximo? Lo encontré en otro sitio. No. El mínimo sigue siendo un cero constante. A pleno rendimiento, el rango de distancia de detección aumenta, y el rango de distancia de detección máxima es de unos 0-7 metros.

A toda velocidad, el rango de distancia de detección se reduce, y el rango mínimo de distancia de detección es de unos 0-3 metros.