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

Tempo de leitura: 11 minutes

Neste tutorial, você aprenderá como funciona o sensor de movimento PIR HC-SR501 e como usá-lo com o Arduino. Você pode encontrar sensores infravermelhos passivos (PIR) ao seu redor, eles não são usados apenas para fins de 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 você possa começar a fazer experiências com seu sensor. Após cada exemplo, eu analiso e explico como o código funciona, então você não deve ter problemas para modificá-lo para atender às suas necessidades.

Primeiro, vou mostrar como você pode usar o HC-SR501 como uma unidade autônoma. A seguir, iremos conectá-lo a um Arduino UNO e mostraremos como usá-lo como um sistema de alarme simples.

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

 

Suprimentos

Componentes de hardware

Sensor de movimento PIR HC-SR501
Arduino Uno Rev 3
ProtoBoard
Fios de jumpers
Resistor variedade
LEDs vermelhos
Buzzer passivo
Cabo USB tipo A/B

 

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 de fresnel. O elemento de detecção piroelétrico pode detectar radiação infravermelha. Todos os objetos com temperatura acima do zero absoluto (0 Kelvin/-273,15 °C) emitem energia térmica na forma de radiação infravermelha, incluindo corpos humanos.

Um sensor piroelétrico possui duas ranhuras retangulares feitas de um material que permite a passagem da radiação infravermelha. Atrás deles, existem dois eletrodos sensores infravermelhos separados, um responsável por produzir uma saída positiva e o outro uma saída negativa. A razão para isso é que estamos procurando uma mudança nos níveis de IR e não nos níveis de IR do ambiente. Os dois eletrodos são conectados de forma que se cancelem. Se uma metade vê mais ou menos radiação IV do que a outra, a saída oscila para cima ou para baixo.

O IC de processamento de sinal on-board processa este sinal e torna o pino de saída do sensor HIGH ou LOW de acordo.

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

 

Sensor de movimento PIR HC-SR501

O sensor de movimento HC-SR501 PIR é construído em torno do IC detector de movimento PIR Micro Power BISS0001. Este IC foi desenvolvido especificamente para processar o sinal dos sensores de movimento PIR.

Se você remover a lente de fresnel, verá o elemento sensor piroelétrico RE200B. No PCB você também pode encontrar um regulador de tensão embutido. Isso significa que você pode alimentar a placa com uma grande faixa de tensão DC, normalmente 5 V são usados.

As especificações do HC-SR501 são fornecidas na tabela abaixo, observe que pode haver pequenas diferenças entre os fabricantes.

 

Especificações HC-SR501

Tensão operacional4.5 – 20 V
Corrente quiescente50 μA
Saída de nívelHIGH 3.3 V / LOW 0 V
TriggerL gatilho único / gatilho de repetição H
Tempo de atraso3 – 300 s
Tempo de bloqueio2.5 s (default)
TriggerL gatilho único / gatilho de repetição H
Faixa de medição3 – 7 m máximo
2 mm
Ângulo de medição< 110° cone angle
Dimensões de PCB32.5 x 24 mm
Furos de montagem2 mm, 28.5 mm spacing
Dimensões da lente de Fresnel15 mm x 23 mm diameter
Temperatura de operação-15 – 70 °C
CustoCusto Aproximado de 15R$ a 25R$

Para mais informações, você pode verificar as fichas técnicas abaixo:

 

Ajustando o HC-SR501

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

Ajuste de sensibilidade (intervalo)

O HC-SR501 possui uma distância máxima de detecção (alcance de detecção) de 7 metros. Você pode ajustar a distância de detecção girando o potenciômetro de sensibilidade no sentido horário ou anti-horário (veja a imagem acima). Girar o potenciômetro no sentido horário aumenta a distância de detecção para um máximo de 7 metros. Girá-lo no sentido anti-horário diminui a distância de detecção para um mínimo de 3 metros.

Ajuste de atraso de tempo (Tx)

Este potenciômetro pode ser usado para ajustar o tempo em que a saída permanece ALTA depois que o movimento é detectado. O atraso mínimo é de 3 segundos e, no máximo, é de 300 segundos ou 5 minutos. Gire o potenciômetro no sentido horário para aumentar o atraso e no sentido anti-horário para diminuir o atraso.

Jumper de seleção de gatilho

O jumper (amarelo) pode ser usado para selecionar um dos dois modos de disparo. Pode ser definido como L (gatilho único) ou H (gatilho de repetição):

  • Gatilho único – A saída ficará ALTA assim que o movimento for detectado. Ele permanecerá ALTO durante o tempo definido pelo potenciômetro. Qualquer movimento durante este período não é processado e não reinicia o cronômetro.
  • Gatilho de repetição – Cada vez que movimento é detectado, o temporizador de atraso é reiniciado.

A diferença entre o modo de disparo único e de repetição é mostrada na figura abaixo.

Diferença entre o modo de disparo único e de repetição. As setas indicam o tempo de retardo definido.

 

Adicionando um termistor e/ou LDR ao HC-SR501

Como pode ser visto na imagem abaixo, o HC-SR501 possui almofadas de solda para dois componentes adicionais. Essas almofadas são normalmente rotuladas como ‘RL’ e ‘RT’.

  • RL – aqui você pode adicionar um resistor dependente de luz (LDR) ou fotoresistor que tem uma baixa resistência sob forte luz ambiente. Isso faz com que o detector funcione apenas quando a área de detecção estiver suficientemente escura.
  • RT – Esta almofada é destinada a um termistor. Adicionar isso torna a sensibilidade do sensor menos dependente da temperatura ambiente

Infelizmente, nenhuma informação adicional é fornecida no DataSheet, então não estou totalmente certo sobre quais valores de componente você deve usar.

 

Usando o sensor de movimento PIR HC-SR501 como uma unidade autônoma

Para a maioria das aplicações, você pode usar o HC-SR501 apenas como uma unidade autônoma. Você pode usar o sinal de saída para acionar coisas como relés e LEDs.

A ligação é muito simples como pode ser visto na imagem abaixo. Basta conectar o VCC e o GND a uma bateria e um LED vermelho entre o pino de saída e o aterramento. A tensão de saída é 3,3 V, então adicionei um resistor limitador de corrente de 68Ω em série com o LED.

Sensor de movimento PIR HC-SR501 com diagrama elétrico de LED

Observe que, depois de ligar o sensor, você precisa aguardar de 30 a 60 segundos para que o sensor inicialize. Durante este período, o LED pode piscar algumas vezes. Depois de esperar um minuto, você pode acenar com a mão na frente do sensor e deve ser capaz de ver o LED acender.

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

Conectando o sensor de movimento PIR HC-SR501 ao Arduino UNO

Ao conectar o sensor de movimento a um microcontrolador como o Arduino UNO, você pode usá-lo para controlar todos os tipos de coisas: LEDs, relés, motores, campainhas etc.

No diagrama de ligação abaixo, você pode ver como conectá-lo ao Arduino. Você pode ler o sensor com um dos pinos de entrada/saída de uso geral (GPIO) do Arduino. Neste exemplo, eu o conectei ao pino digital 2. Os pinos VCC e GND são conectados a 5 V e GND respectivamente.

Sensor de movimento PIR HC-SR501 com diagrama de ligação ao Arduino

As conexões também são fornecidas na tabela abaixo:

 

HC-SR501 Conexões do sensor de movimento PIR

Sensor de movimento PIR HC-SR501Arduino
VCC5 V
OUTPino 2
GNDGND

Depois de conectar o sensor, a próxima etapa é carregar algum código de exemplo.

 

Sensor de movimento PIR HC-SR501 com código de exemplo Arduino UNO

Com o código de exemplo a seguir, você pode ler o sensor e controlar o LED on-board do Arduino (conectado ao pino 13). Este código também pode ser usado para controlar relés simples para ligar ou desligar uma luz maior.

Você pode fazer upload do código de exemplo com o IDE do Arduino.

Para que este código funcione corretamente, é melhor definir o jumper do modo de disparo para ‘H’ (modo de disparo de repetição). Ajuste também o potenciômetro de retardo de tempo para o valor mais baixo. Gire-o no sentido anti-horário até o fim.

O código lerá o estado do sensor (HIGH ou LOW) e ligará ou desligará o LED integrado de acordo. Ele também imprimirá uma mensagem para o Monitor Serial, que você pode acessar em Ferramentas ou digitar (Ctrl + Shift + M).

/* Código de exemplo para sensor de movimento PIR HC-SR501 com Arduino. */
// Definir pinos de conexão:
#define pirPin 2
#define ledPin 13
// Crie variáveis:
int val = 0;
bool motionState = false; // Começamos sem nenhum movimento detectado.

void setup() {
  // Configure os pinos como entrada ou saída:
  pinMode(ledPin, OUTPUT);
  pinMode(pirPin, INPUT);
  // Comece a comunicação serial a uma taxa de transmissão de 9600:
  Serial.begin(9600);
}

void loop() {
  // Leia o pirPin e armazene como val:
  val = digitalRead(pirPin);
  // Se o movimento for detectado (pirPin = HIGH), faça o seguinte:
  if (val == HIGH) {
    digitalWrite(ledPin, HIGH); // Liga o LED integrado.
    // Altere o estado de movimento para verdadeiro (movimento detectado):
    if (motionState == false) {
      Serial.println("Movimento detectado!");
      motionState = true;
    }
  } else {  // Se nenhum movimento for detectado (pirPin = LOW), faça o seguinte:
    digitalWrite(ledPin, LOW); // Desligue o LED integrado.
    // Altere o estado de movimento para falso (sem movimento):
    if (motionState == true) {
      Serial.println("Movimento finalizado!");
      motionState = false;
    }
  }
}

Você deve ver a seguinte saída no monitor serial:

 

Explicação do código:

O código é bastante simples e você não precisa de nenhuma biblioteca Arduino para usar este sensor.

O sketch começa com a definição do pino do sensor PIR e do pino do LED. Eu os conectei aos pinos 2 e 13 do Arduino (LED on-board).

A instrução #define é usada para dar um nome a um valor constante. O compilador substituirá todas as referências a esta constante pelo valor definido quando o programa for compilado. Portanto, sempre que você mencionar o pirPin, o compilador o substituirá pelo valor 2 quando o programa for compilado.

Também criei duas variáveis, val e motionState, que são inteiras e booleanas (verdadeiro/falso), respectivamente. A variável val é usada para armazenar a saída do sensor PIR (HIGH ou LOW) e motionState se tornará verdadeiro enquanto o movimento for detectado e para falso quando não houver movimento.

// Definir pinos de conexão:
#define pirPin 2
#define ledPin 13
// Crie variáveis:
int val = 0;
bool motionState = false; // Começamos sem nenhum movimento detectado

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 uma taxa de transmissão de 9600. Certifique-se de que o Monitor Serial também esteja definido como 9600.

void setup() {
  // Configure os pinos como entrada ou saída:
  pinMode(ledPin, OUTPUT);
  pinMode(pirPin, INPUT);
  // Comece a comunicação serial a uma taxa de transmissão de 9600:
  Serial.begin(9600);
}

No loop(), li primeiro o sensor com a função digitalRead(pino). Esta função retorna HIGH ou LOW.

// Leia o pirPin e armazene como val:
val = digitalRead(pirPin);

Quando a saída/val do sensor é HIGH, eu ligo o LED com a função digitalWrite(pin,value)

// Se o movimento for detectado (pirPin = HIGH), faça o seguinte:
if (val == HIGH) {
  digitalWrite(ledPin, HIGH); // Liga o LED integrado.
  // Altere o estado de movimento para verdadeiro (movimento detectado):
  if (motionState == false) {
    Serial.println("Motion detected!");
    motionState = true;
  }
}

Em seguida, o motionState é alterado para verdadeiro e a mensagem ‘Movimento detectado!’ É impressa no Monitor Serial. Observe que primeiro eu verifico o motionState atual, isso garante que a mensagem seja impressa apenas uma vez por evento de movimento.

Se não houver mais movimento na frente do sensor, val mudará para BAIXO e o LED será desligado e a mensagem ‘Movimento finalizado!’ Será impressa no monitor serial.

 

Crie um sistema de alarme com sensor de movimento PIR e campainha

Com algumas mudanças simples, você pode criar um sistema de alarme com o HC-SR501 e uma campainha piezoelétrica. Eu conectei a campainha com um resistor de 100 Ω entre o pino digital 5 e o GND. Você provavelmente pode usar a campainha sem um resistor (isso torna o som mais alto), mas não soará tão bem.

Sensor de movimento HC-SR501 PIR com Arduino UNO e diagrama de ligação do buzzer.

O código abaixo é basicamente igual ao do exemplo anterior. Eu apenas adicionei uma função para criar o som de alarme sonoro. Você pode alterar o tom da campainha alterando o parâmetro de entrada da função de alarm(duration,frequency).

/* Exemplo de código para criar um sistema de alarme com sensor de movimento HC-SR501 PIR, campainha e Arduino. */
// Definir pinos de conexão:
#define buzzerPin 5
#define pirPin 2
#define ledPin 13
// Crie variáveis:
int val = 0;
bool motionState = false; // Começamos sem nenhum movimento detectado.
void setup() {
  // Configure os pinos como entrada ou saída:
  pinMode(buzzerPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(pirPin, INPUT);
  // Comece a comunicação serial a uma taxa de transmissão de 9600:
  Serial.begin(9600);
}
void loop() {
  // Leia o pirPin e armazene como val:
  val = digitalRead(pirPin);
  // Se o movimento for detectado (pirPin = HIGH), faça o seguinte:
  if (val == HIGH) {
    digitalWrite(ledPin, HIGH); // Liga o LED integrado.
    alarm(500, 1000);  // Chame a função de alarme (duração, frequência).
    delay(150);
    // Altere o estado de movimento para verdadeiro (movimento detectado):
    if (motionState == false) {
      Serial.println("Motion detected!");
      motionState = true;
    }
  } else { // Se nenhum movimento for detectado (pirPin = LOW), faça o seguinte:
    digitalWrite(ledPin, LOW); // Desligue o LED integrado.
    noTone(buzzerPin); // Certifique-se de que nenhum tom seja reproduzido quando nenhum movimento for detectado.
    delay(150);
    // Altere o estado de movimento para falso (sem movimento):
    if (motionState == true) {
      Serial.println("Motion ended!");
      motionState = false;
    }
  }
}

// Função para criar um tom com parâmetros de duração e frequência:
void alarm(long duration, int freq) {
  tone(buzzerPin, freq);
  delay(duration);
  noTone(buzzerPin);
}

 

Coisas a considerar ao projetar um sistema de sensor PIR

Assim como outros sensores PIR, o HC-SR501 precisa de algum tempo para inicializar e se ajustar aos níveis de infravermelho na sala. Isso leva aproximadamente 1 minuto quando é ligado pela primeira vez. Tente eliminar qualquer movimento na frente do sensor durante este período.

O vento e uma fonte de luz perto do sensor podem causar interferência, portanto, tente ajustar sua configuração para evitar isso. Além disso, observe que você deve montar o sensor horizontalmente, pois a maior parte do movimento acontecerá no plano horizontal (por exemplo, caminhando).

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 é muito fácil de alterar (consulte a ficha técnica do BISS0001). Cada vez que a saída vai de HIGH para LOW, o período de bloqueio começa. Durante esse período, o sensor não detectará nenhum movimento.

Ao projetar um sistema baseado no HC-SR501, você precisará levar esses períodos de atraso em consideração.

 

Conclusão

Neste artigo, mostrei como o sensor de movimento HC-SR501 PIR funciona e como você pode usá-lo com o Arduino. Espero que você tenha achado útil e informativo. Se sim, compartilhe com um amigo que também gosta de eletrônicos e de fazer coisas!

Eu adoraria saber quais projetos você planeja construir (ou já construiu) com este sensor. Se você tiver alguma dúvida, sugestão, ou se achar que falta alguma coisa neste tutorial, por favor, deixe um comentário abaixo.