Skip to Content

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

Cómo usar 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 usarlo con Arduino. Puedes encontrar sensores de infrarrojos pasivos (PIR) por todas partes; no solo se usan para seguridad, sino también en la mayoría de los sistemas de iluminación que se activan automáticamente.

En este artículo, he incluido un diagrama de conexiones 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, para que no tengas problemas en modificarlo según tus necesidades.

Primero te mostraré cómo usar el HC-SR501 como una unidad independiente. Luego, lo conectaremos a un Arduino UNO y te enseñaré cómo usarlo como un sistema de alarma simple.

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

Materiales

Componentes de hardware

HC-SR501HC-SR501 PIR motion sensor × 1 Amazon
Arduino Uno Rev 3Arduino Uno Rev3 × 1 Amazon
Breadboard × 1 Amazon
Jumper wires × 10 Amazon
resistorResistor assortment × 1 Amazon
red-ledLEDs × 1 Amazon
buzzerPassive buzzer × 1 Amazon
USB cable type A/B × 1 Amazon

Software

Arduino IDEArduino IDE

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may 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 radiación infrarroja. Todos los objetos con una temperatura por encima del cero absoluto (0 Kelvin / -273,15 °C) emiten energía térmica en forma de radiación infrarroja, incluyendo los cuerpos humanos.

HC-SR501-PIR-Motion-Sensor-working-principle
Función del sensor de movimiento PIR

Un sensor piroeléctrico tiene dos ranuras rectangulares hechas de un material que permite pasar la radiación infrarroja. Detrás de estas, hay dos electrodos sensores infrarrojos separados, uno responsable de producir una salida positiva y el otro una salida negativa. Esto es porque buscamos un cambio en los niveles de IR y no los niveles ambientales. Los dos electrodos están conectados para que se cancelen mutuamente. Si una mitad detecta más o menos radiación IR que la otra, la salida oscilará hacia alto o bajo.

El circuito integrado de procesamiento de señal a bordo procesa esta señal y pone el pin de salida del sensor en ALTO o BAJO según corresponda.

HC-SR501-PIR-Motion-Sensor-pyroelectric-element
Carcasa del sensor de movimiento PIR

La cúpula blanca frente al elemento sensor es una lente fresnel. Esta lente enfoca la radiación infrarroja sobre el sensor.

HC-SR501-PIR-Motion-Sensor-fresnel-lens-working-principle
Lente fresnel del sensor de movimiento PIR

Sensor de movimiento PIR HC-SR501

El sensor de movimiento PIR HC-SR501 está construido alrededor del circuito integrado BISS0001 Micro Power PIR Motion Detector. Este CI está desarrollado específicamente para procesar la señal de sensores PIR.

Si quitas la lente fresnel, verás el elemento sensor piroeléctrico RE200B. En la PCB también encontrarás un regulador de voltaje incorporado. Esto significa que puedes alimentar la placa con un amplio rango de voltaje DC, típicamente se usa 5 V.

Las especificaciones del HC-SR501 se muestran en la tabla a continuación; ten en cuenta que puede haber pequeñas diferencias entre fabricantes.

Especificaciones del HC-SR501

Voltaje de operación 4.5 – 20 V
Corriente en reposo 50 μA
Nivel de salida ALTO 3.3 V / BAJO 0 V
Disparo L disparo único / H disparo repetido
Tiempo de retardo 3 – 300 s
Tiempo de bloqueo 2.5 s (por defecto)
Disparo L disparo único / H disparo repetido
Rango de medición 3 – 7 m máximo
2 mm
Ángulo de medición < 110° ángulo cónico
Dimensiones de la PCB 32.5 x 24 mm
Orificios de montaje 2 mm, separación 28.5 mm
Dimensiones de la lente fresnel 15 mm x 23 mm de diámetro
Temperatura de operación -15 – 70 °C
Costo Check price

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

Ajustando el HC-SR501

En la parte trasera de la placa encontrarás dos potenciómetros y un jumper, que puedes usar para ajustar varios parámetros:

HC-SR501-Pinout-Annotation
Asignación de pines de la placa HC-SR501

Ajuste de sensibilidad (rango)

El HC-SR501 tiene una distancia máxima de detección de 7 metros. Puedes ajustar la distancia de detección girando el potenciómetro de sensibilidad en sentido horario o antihorario (ver imagen arriba). Girar el potenciómetro en sentido horario aumenta la distancia hasta un máximo de 7 metros. Girarlo en sentido antihorario la reduce hasta un mínimo de 3 metros.

Ajuste del retardo de tiempo (Tx)

Este potenciómetro se usa para ajustar el tiempo que la salida permanece en ALTO después de detectar movimiento. El retardo mínimo es de 3 segundos y el máximo de 300 segundos o 5 minutos. Gira el potenciómetro en sentido horario para aumentar el retardo y en sentido antihorario para disminuirlo.

Jumper de selección de disparo

El jumper (amarillo) se usa para seleccionar uno de los dos modos de disparo. Puede configurarse en  L  (disparo único) o  H  (disparo repetido):

  • Disparo único  – La salida se pondrá en ALTO tan pronto se detecte movimiento. Permanecerá en ALTO durante el tiempo configurado por el potenciómetro. Cualquier movimiento durante este periodo no se procesa ni reinicia el temporizador.
  • Disparo repetido  – Cada vez que se detecta movimiento, el temporizador de retardo se reinicia.

La diferencia entre el modo de disparo único y repetido se muestra en la figura a continuación.

Difference-between-single-and-repeating-trigger-HC-SR501
Diferencia entre modo de disparo único y repetido. Las flechas indican el tiempo de retardo configurado.

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

Como se ve en la imagen abajo, el HC-SR501 tiene pads de soldadura para dos componentes adicionales. Estos pads suelen estar etiquetados como ‘RL’ y ‘RT’.

HC-SR501-RL-and-RT-solder-pads
Pads de soldadura del HC-SR501
  • RL  – Aquí puedes añadir un  light dependent resistor  (LDR) o fotorresistor que tiene baja resistencia bajo luz ambiental fuerte. Esto hace que el detector funcione solo cuando el área de detección está suficientemente oscura.
  • RT  – Este pad es para un  thermistor. Añadir esto hace que la sensibilidad del sensor dependa menos de la temperatura ambiental.

Desafortunadamente, las hojas de datos no proporcionan información adicional, así que no estoy completamente seguro de qué valores de componentes deberías usar.

Usando el sensor de movimiento PIR HC-SR501 como unidad independiente

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

El cableado es muy simple como se ve en la imagen abajo. Simplemente conecta 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, así que añadí una resistencia limitadora de corriente de 68 Ω en serie con el LED.

HC-SR501-PIR-motion-sensor-with-LED-wiring-diagram-schematic
Diagrama de cableado del sensor de movimiento PIR HC-SR501 con LED

Ten en cuenta que después de alimentar el sensor, debes esperar entre 30 y 60 segundos para que se inicialice. Durante este periodo, el LED puede parpadear un par de veces. Tras esperar un minuto, puedes mover la mano frente al sensor y deberías ver que el LED se enciende.

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 – Conectando el sensor de movimiento PIR HC-SR501 al Arduino UNO

Al conectar el sensor de movimiento a un microcontrolador como el Arduino UNO, puedes usarlo para controlar todo tipo de cosas: LEDs, relés, motores, zumbadores, etc.

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

HC-SR501-PIR-motion-sensor-with-Arduino-UNO-wiring-diagram-schematic
Diagrama de cableado del sensor de movimiento PIR HC-SR501 con Arduino

Las conexiones también se muestran en la tabla a continuación:

Conexiones del sensor de movimiento PIR HC-SR501

Sensor de movimiento PIR HC-SR501 Arduino
VCC 5 V
OUT Pin 2
GND GND

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

Código de ejemplo del sensor de movimiento PIR HC-SR501 con Arduino UNO

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

Para que este código funcione correctamente, es mejor configurar el jumper de modo de disparo en ‘H’ (modo de disparo repetido). También ajusta el potenciómetro de retardo al valor más bajo. Gíralo en sentido antihorario hasta el límite.

El código leerá el estado del sensor (ALTO o BAJO) y encenderá o apagará el LED integrado en consecuencia. También imprimirá un mensaje en el Monitor Serial, al que puedes acceder desde Tools o con (Ctrl+Shift+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ías ver la siguiente salida en el monitor serial:

HC-SR501 PIR motion sensor Serial Monitor output
Salida del sensor PIR en el monitor serial

Explicación del código:

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

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

La instrucción  #define  se usa para dar un nombre a un valor constante. El compilador reemplazará cualquier referencia a esta constante con el valor definido cuando se compile el programa. Así que donde menciones  pirPin, el compilador lo reemplazará con el valor 2 al compilar el programa.

También creé dos variables,  val  y  motionState, que son un  integer  y un  boolean  (verdadero/falso) respectivamente. La variable  val  se usa para almacenar la salida del sensor PIR (ALTO o BAJO) y  motionState  se pondrá en true mientras se detecte movimiento y en false 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(), configuramos los pines como entrada o salida con la función  pinMode(pin,mode). El pirPin es una entrada y el ledPin es una salida. También iniciamos la comunicación serial a 9600 baudios. 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 ALTO o BAJO.

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

Cuando la salida del sensor/val es ALTO, 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;
    }
  }

Luego, el motionState cambia a true y se imprime el mensaje ‘¡Movimiento detectado!’ en el Monitor Serial. Nota que primero verifico el estado actual de motionState, esto asegura que el mensaje se imprima solo una vez por evento de movimiento.

Si ya no hay movimiento frente al sensor,  val  cambiará a BAJO, el LED se apagará y se imprimirá el mensaje ‘¡Movimiento terminado!’ en el monitor serial.

Crea un sistema de alarma con sensor PIR y zumbador

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

HC-SR501-PIR-motion-sensor-with-buzzer-and-Arduino-UNO-wiring-diagram-schematic
Diagrama de cableado del sensor PIR HC-SR501 con Arduino UNO y zumbador.

El código a continuación es casi igual al ejemplo anterior. Solo añadí una función para crear el sonido de alarma intermitente. Puedes cambiar el tono del zumbador modificando el parámetro de entrada de la función  alarm(duration,frequency)  .

/* 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);
}

Consideraciones al diseñar un sistema con sensor PIR

Al igual que otros sensores PIR, el HC-SR501 necesita un tiempo para inicializarse y ajustarse a los niveles de infrarrojos en la habitación. Esto toma aproximadamente 1 minuto al encenderlo por primera vez. Trata de eliminar cualquier movimiento frente al sensor durante este periodo.

El viento y una fuente de luz cercana al sensor pueden causar interferencias, así que ajusta tu montaje para evitar esto. Además, ten en cuenta que debes montar el sensor horizontalmente, ya que la mayoría del movimiento ocurre en el plano horizontal (por ejemplo, caminando).

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 fácil de cambiar (ver hoja de datos del BISS0001). Cada vez que la salida pasa de ALTO a BAJO, comienza el periodo de bloqueo. Durante este tiempo, el sensor no detectará movimiento.

Al diseñar un sistema basado en el HC-SR501, deberás 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 usarlo con Arduino. Espero que te haya resultado útil e informativo. Si tienes preguntas, sugerencias o crees que falta algo en este tutorial, por favor deja un comentario abajo.