Skip to Content

Como usar o sensor de movimento PIR HC-SR501 com Arduino

Como usar o sensor de movimento PIR HC-SR501 com Arduino

Neste tutorial, vais aprender como funciona o sensor de movimento PIR HC-SR501 e como o podes usar com Arduino. Podes encontrar sensores de infravermelhos passivos (PIR) por todo o lado; eles não são usados apenas para segurança, mas também na maioria dos sistemas de iluminação ativados automaticamente.

Neste artigo, incluí um diagrama de ligação e códigos de exemplo para que possas começar a experimentar com o teu sensor. Após cada exemplo, explico detalhadamente como o código funciona, para que não tenhas problemas em modificá-lo conforme as tuas necessidades.

Primeiro, vou mostrar-te como usar o HC-SR501 como uma unidade autónoma. Depois, vamos ligá-lo a um Arduino UNO e vou mostrar-te como usá-lo como um sistema de alarme simples.

Este tutorial foca-se no sensor HC-SR501, mas também podes usar o código fornecido para sensores semelhantes como o  HC-SR505  ou  AM312. A principal diferença é que estes sensores mais baratos têm um alcance de deteção menor e não possuem um potenciômetro para ajustar a sensibilidade e o atraso de tempo.

Materiais necessários

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.

Como funciona um sensor de movimento PIR?

Os sensores de movimento PIR consistem em duas partes principais: um  elemento sensor piroelétrico  e uma  lente fresnel . O elemento sensor piroelétrico pode detetar radiação infravermelha. Todos os objetos com temperatura acima do zero absoluto (0 Kelvin / -273,15 °C) emitem energia térmica sob a forma de radiação infravermelha, incluindo os corpos humanos.

HC-SR501-PIR-Motion-Sensor-working-principle
Funcionamento do sensor de movimento PIR

Um sensor piroelétrico tem duas ranhuras retangulares feitas de um material que permite a passagem da radiação infravermelha. Atrás destas, existem dois eletrodos sensores infravermelhos separados, um responsável por produzir uma saída positiva e o outro uma saída negativa. Isto acontece porque procuramos uma mudança nos níveis de IR e não os níveis ambientais. Os dois eletrodos estão ligados de forma a anularem-se mutuamente. Se uma metade detetar mais ou menos radiação IR que a outra, a saída oscilará para alto ou baixo.

O circuito integrado de processamento de sinal a bordo processa este sinal e coloca o pino de saída do sensor em ALTO ou BAIXO conforme necessário.

HC-SR501-PIR-Motion-Sensor-pyroelectric-element
Caixa do sensor de movimento PIR

A cúpula branca à frente do elemento sensor é uma lente fresnel. Esta lente foca a radiação infravermelha no sensor.

HC-SR501-PIR-Motion-Sensor-fresnel-lens-working-principle
Lente fresnel do sensor de movimento PIR

Sensor de movimento PIR HC-SR501

O sensor de movimento PIR HC-SR501 é construído em torno do circuito integrado BISS0001 Micro Power PIR Motion Detector. Este CI foi desenvolvido especificamente para processar o sinal de sensores PIR.

Se removeres a lente fresnel, verás o elemento sensor piroelétrico RE200B. Na PCB também podes encontrar um regulador de tensão incorporado. Isto significa que podes alimentar a placa com uma ampla gama de tensões DC, normalmente usa-se 5 V.

As especificações do HC-SR501 estão na tabela abaixo, nota que podem existir pequenas diferenças entre fabricantes.

Especificações do HC-SR501

Tensão de funcionamento 4,5 – 20 V
Corrente em repouso 50 μA
Nível de saída ALTO 3,3 V / BAIXO 0 V
Gatilho L gatilho único / H gatilho repetido
Tempo de atraso 3 – 300 s
Tempo de bloqueio 2,5 s (padrão)
Gatilho L gatilho único / H gatilho repetido
Alcance de medição 3 – 7 m máximo
2 mm
Ângulo de medição < 110° de ângulo cónico
Dimensões da PCB 32,5 x 24 mm
Orifícios de montagem 2 mm, espaçamento de 28,5 mm
Dimensões da lente fresnel 15 mm x 23 mm de diâmetro
Temperatura de funcionamento -15 – 70 °C
Custo Check price

Para mais informações, podes consultar os datasheets abaixo:

Ajustar o HC-SR501

Na parte de trás da placa encontrarás dois potenciômetros e um jumper, que podes usar para ajustar vários parâmetros:

HC-SR501-Pinout-Annotation
Pinout da placa HC-SR501

Ajuste de sensibilidade (alcance)

O HC-SR501 tem uma distância máxima de deteção de 7 metros. Podes ajustar a distância de deteção rodando o potenciômetro de sensibilidade no sentido horário (CW) ou anti-horário (CCW) (ver imagem acima). Rodar o potenciômetro no sentido horário aumenta a distância até um máximo de 7 metros. Rodá-lo no sentido anti-horário diminui a distância até um mínimo de 3 metros.

Ajuste do atraso de tempo (Tx)

Este potenciômetro ajusta o tempo que a saída permanece em ALTO após detetar movimento. O atraso mínimo é de 3 segundos e o máximo de 300 segundos (5 minutos). Gira o potenciômetro no sentido horário para aumentar o atraso e no sentido anti-horário para diminuir.

Jumper de seleção de gatilho

O jumper (amarelo) pode ser usado para selecionar um dos dois modos de gatilho. Pode ser configurado para  L  (gatilho único) ou  H  (gatilho repetido):

  • Gatilho único  – A saída fica em ALTO assim que o movimento é detetado. Mantém-se em ALTO pelo tempo definido pelo potenciômetro. Qualquer movimento durante este período não é processado nem reinicia o temporizador.
  • Gatilho repetido  – Cada vez que o movimento é detetado, o temporizador de atraso é reiniciado.

A diferença entre o modo de gatilho único e repetido está ilustrada na figura abaixo.

Difference-between-single-and-repeating-trigger-HC-SR501
Diferença entre modo de gatilho único e repetido. As setas indicam o tempo de atraso definido.

Adicionar um termistor e/ou LDR ao HC-SR501

Como se vê na imagem abaixo, o HC-SR501 tem pads de solda para dois componentes adicionais. Estes pads são normalmente rotulados como ‘RL’ e ‘RT’.

HC-SR501-RL-and-RT-solder-pads
Pads de solda do HC-SR501
  • RL  – Aqui podes adicionar um  light dependent resistor  (LDR) ou fotoresistor que tem baixa resistência sob luz ambiente forte. Isto faz com que o detector funcione apenas quando a área de deteção estiver suficientemente escura.
  • RT  – Este pad destina-se a um  thermistor. Adicionar este componente torna a sensibilidade do sensor menos dependente da temperatura ambiente.

Infelizmente, os datasheets não fornecem informações adicionais, por isso não tenho certeza dos valores dos componentes que deves usar.

Usar o sensor de movimento PIR HC-SR501 como unidade autónoma

Para a maioria das aplicações, podes usar o HC-SR501 como uma unidade autónoma. Podes usar o sinal de saída para ativar coisas como relés e LEDs.

A ligação é muito simples, como se vê na imagem abaixo. Basta ligar VCC e GND a uma bateria e um LED vermelho entre o pino de saída e o terra. A tensão de saída é 3,3 V, por isso adicionei um resistor limitador de corrente de 68 Ω em série com o LED.

HC-SR501-PIR-motion-sensor-with-LED-wiring-diagram-schematic
Diagrama de ligação do sensor de movimento PIR HC-SR501 com LED

Nota que, após ligar o sensor, precisas esperar 30 a 60 segundos para o sensor inicializar. Durante este período, o LED pode piscar algumas vezes. Depois de esperar um minuto, podes acenar com a mão em frente ao sensor e deverás ver o LED acender.

Com esta configuração, é fácil testar a funcionalidade do sensor. Este é também um bom momento para experimentar as definições de sensibilidade e atraso de tempo, bem como os dois modos de gatilho diferentes.

Ligação – Ligar o sensor de movimento PIR HC-SR501 ao Arduino UNO

Ao ligar o sensor de movimento a um microcontrolador como o Arduino UNO, podes usá-lo para controlar todo o tipo de coisas: LEDs, relés, motores, buzinas, etc.

No diagrama de ligação abaixo, podes ver como ligá-lo ao Arduino. Podes ler o sensor com um dos pinos de entrada/saída geral (GPIO) do Arduino. Neste exemplo, liguei-o ao pino digital 2. Os pinos VCC e GND estão ligados a 5 V e GND respetivamente.

HC-SR501-PIR-motion-sensor-with-Arduino-UNO-wiring-diagram-schematic
Diagrama de ligação do sensor de movimento PIR HC-SR501 com Arduino

As ligações também estão indicadas na tabela abaixo:

Ligações do sensor de movimento PIR HC-SR501

Sensor de movimento PIR HC-SR501 Arduino
VCC 5 V
OUT Pino 2
GND GND

Depois de ligares o sensor, o próximo passo é carregar algum código de exemplo.

Código de exemplo do sensor de movimento PIR HC-SR501 com Arduino UNO

Com o código de exemplo seguinte, podes ler o sensor e controlar o LED a bordo do Arduino (ligado ao pino 13). Este código também pode ser usado para controlar relés simples para ligar ou desligar uma luz maior.

Para que este código funcione corretamente, é melhor definir o jumper do modo de gatilho para ‘H’ (modo de gatilho repetido). Também ajusta o potenciômetro do atraso de tempo para o valor mais baixo. Gira-o no sentido anti-horário até ao limite.

O código vai ler o estado do sensor (ALTO ou BAIXO) e ligar ou desligar o LED a bordo em conformidade. Também imprime uma mensagem no Monitor Serial, que podes aceder em Tools ou pressionando (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;
    }
  }
}

Deverás ver a seguinte saída no monitor serial:

HC-SR501 PIR motion sensor Serial Monitor output
Saída do sensor PIR no monitor serial

Explicação do código:

O código é bastante simples e não precisas de bibliotecas Arduino para usar este sensor.

O sketch começa por definir o pino do sensor PIR e o pino do LED. Eu liguei-os ao pino 2 e 13 do Arduino (LED a bordo).

A instrução  #define  é usada para dar um nome a um valor constante. O compilador substituirá qualquer referência a esta constante pelo valor definido quando o programa for compilado. Assim, em todo o lado onde menciones  pirPin, o compilador substituirá pelo valor 2 quando o programa for compilado.

Também criei duas variáveis,  val  e  motionState, que são um  integer  e um  boolean  (verdadeiro/falso) respetivamente. A variável  val  é usada para armazenar a saída do sensor PIR (ALTO ou BAIXO) e  motionState  ficará verdadeira enquanto o movimento for detetado e falsa quando não houver movimento.

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

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

No  setup(), definimos os pinos como entrada ou saída com a função  pinMode(pin,mode). O pirPin é uma entrada e o ledPin é uma saída. Também iniciamos a comunicação serial a 9600 baud. Certifica-te de que o Monitor Serial está também configurado para 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);
}

No  loop(), primeiro leio o sensor com a função  digitalRead(pin). Esta função retorna ALTO ou BAIXO.

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

Quando a saída do sensor/val é ALTO, ligo o LED com a função  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;
    }
  }

De seguida, o motionState é alterado para verdadeiro e a mensagem ‘Motion detected!’ é impressa no Monitor Serial. Nota que primeiro verifico o estado atual do motionState, isto garante que a mensagem é impressa apenas uma vez por evento de movimento.

Se já não houver movimento em frente ao sensor,  val  passará para BAIXO, o LED será desligado e a mensagem ‘Motion ended!’ será impressa no monitor serial.

Criar um sistema de alarme com sensor de movimento PIR e buzzer

Com algumas alterações simples, podes criar um sistema de alarme com o HC-SR501 e um  piezoelectric buzzer. Liguei o buzzer com um resistor de 100 Ω entre o pino digital 5 e o GND. Provavelmente podes usar o buzzer sem resistor (ficará mais alto), mas o som não será tão agradável.

HC-SR501-PIR-motion-sensor-with-buzzer-and-Arduino-UNO-wiring-diagram-schematic
Diagrama de ligação do sensor de movimento PIR HC-SR501 com Arduino UNO e buzzer.

O código abaixo é quase igual ao exemplo anterior. Apenas adicionei uma função para criar o som de alarme intermitente. Podes alterar o tom do buzzer mudando o parâmetro de entrada da função  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);
}

Coisas a considerar ao projetar um sistema com sensor PIR

Tal como outros sensores PIR, o HC-SR501 precisa de algum tempo para inicializar e ajustar-se aos níveis de infravermelhos na sala. Isto demora aproximadamente 1 minuto após ser ligado pela primeira vez. Tenta eliminar qualquer movimento em frente ao sensor durante este período.

O vento e uma fonte de luz próxima do sensor podem causar interferências, por isso tenta ajustar o teu sistema para evitar isso. Além disso, nota que deves montar o sensor horizontalmente, pois a maior parte do movimento ocorre no plano horizontal (ex: a andar).

Além do tempo de atraso (Tx), o sensor também tem um ‘tempo de bloqueio’ (Ti). Por padrão, o tempo de bloqueio é de 2,5 segundos e não é fácil de alterar (ver datasheet do BISS0001). Cada vez que a saída passa de ALTO para BAIXO, o período de bloqueio começa. Durante este período, o sensor não deteta movimento.

Ao projetar um sistema baseado no HC-SR501, precisarás de considerar estes períodos de atraso.

Conclusão

Neste artigo, mostrei-te como funciona o sensor de movimento PIR HC-SR501 e como o podes usar com Arduino. Espero que tenhas achado útil e informativo. Se tiveres perguntas, sugestões ou achares que falta algo neste tutorial, por favor deixa um comentário abaixo.