fbpx

Como utilizar o sensor de presença/movimento HC-SR501 PIR com Arduino

O sensor de presença / movimento é um componente eletrônico capaz de medir a luz infravermelha que irradia de objetos em seu raio de detecção. Este tipo de sensor comumente usa sensor infravermelho passivo (PIR) como detector de movimento.

O sensor PIR é construído de um sensor piroelétrico que pode detectar níveis de radiação infravermelha e uma lente especial chamada de lente de Fresnel que focaliza os sinais infravermelhos no sensor piroelétrico.

Todos os objetos com temperatura acima do zero absoluto (0 Kelvin/ -273,15ºC) emitem energia térmica na forma de radiação infravermelha e, quanto mais quente for o objeto mais radiação é emitida.

O sensor detector de movimento é dividido em duas metades. A razão para isso é procuramos detectar movimento (mudança) e não níveis médios de infravermelho. As duas metades são conectadas de modo que se cancelem. Se uma metade vê mais ou menos radiação infravermelha do que a outra, a saída oscila para cima ou para baixo.

Deste modo, quando não há movimento ao redor do sensor, ele está ocioso. Ambas as metades detectam a mesma quantidade de radiação infravermelha, resultando em um sinal de saída igual a zero.

No entanto, quando alguma pessoa ou animal passa, a primeira metade do sensor percebe uma mudança no nível de radiação infravermelha, o que causa uma mudança diferencial positiva entre as duas metades. Quando a pessoa ou animal deixa a área de detecção, ocorre o processo inverso, gerando uma mudança diferencial negativa. O pulso correspondente de sinais resulta no sensor configurando seu pino de saída alto.

O sensor de presença / movimento HC-SR501 PIR (Figura 1) é utilizado na maioria dos projetos no Arduino para a detecção de presença ou movimento. Este componente possui baixo consumo de energia, é bem robusto, possui uma ampla gama de lentes e é fácil de conectar.

A imagem tem a finalidade de mostrar um sensor de presença de movimento HC-SR501 em sua forma real e física
Figura 1 – Sensor de presença / movimento HC-SR501 PIR.


O sensor de presença / movimento HC-SR501 PIR possui três pinos, sendo terra GND, saída digital e alimentação (4,5 – 20 V). Além disso, este sensor conta com dois potenciômetros para ajuste da sensibilidade e tempo, conforme Figura 2.

A imagem ilustra Pinos e potenciometros de ajuste do sensor de presença de movimento HC-SR501 de maneira ilustrativa
Figura 2 – Pinos e potenciômetros de ajuste do sensor de presença / movimento HC-SR501 PIR.


O ajuste de sensibilidade define a distância máxima em que o movimento pode ser detectado. Esta distância varia de 3 a 7 metros, aproximadamente, sendo que a extensão do local em que o sensor for instalado pode afetar o alcance do sensor.

O ajuste de tempo define por quanto tempo a saída deverá permanecer em nível lógico alto (HIGH) após a detecção. O tempo mínimo é de 3 segundos e o máximo 300 segundos (5 minutos), aproximadamente.

Em nosso projeto, vamos usar o sensor de presença / movimento HC-SR501 PIR para acionar um LED.


MATERIAIS NECESSÁRIOS


ESQUEMÁTICO DE LIGAÇÃO DOS COMPONENTES

Inicialmente, certifique-se que sua placa Arduino esteja desligada. Monte o circuito da Figura 3 utilizando a protoboard, o sensor de presença, o LED, o resistor e os fios.

Figura 3 – Circuito para para projeto acionar um LED com sensor de presença / movimento HC-SR501 PIR.

Ao montar seu circuito na protoboard observe os seguintes pontos:

  • O pino 1 do sensor de presença deve ser ligado a alimentação de 5V da placa UNO, o pino 2 deve ser conectado à porta digital 7 e o pino 3 deve ser conectado ao GND;
  • Conecte o LED ao pino digital 6 da placa UNO.


SIMULAÇÃO

Observação: Na simulação do TinkerCad, o Sensor de presença / movimento HC-SR501 PIR possui a disposição de seus pinos diferentes, na seguinte ordem: Saída, VCC e GND.


ELABORANDO O CÓDIGO

O principal intuito deste projeto é utilizar o sensor de presença HC-SR501 PIR para acionar um LED. Vamos entender a lógica de programação deste projeto a partir dos seguintes passos :

1 – Inicializar a comunicação serial e configurações iniciais

Dentro da função setup(), inicializamos a comunicação serial através da instrução: Serial.begin(9600);.

Também na função setup(), definimos ledPin como saída (OUTPUT) e sensorPin como entrada (INPUT).

2 – Realizar a leitura do sensor de presença

Iniciaremos a função loop() realizando a leitura digital do sensor de presença e armazenando o valor lido na variável leitura através da instrução leitura = digitalRead(sensorPin);.

3 – Verificar se o sensor detectou movimento

O sensor de presença atua como uma saída digital simples. Desse modo, para verificar se o sensor detectou movimento, vamos observar se leitura muda para HIGH (Detectou movimento) ou para LOW (Sem movimento).

Para isto, usaremos a condicional if … else (se/senão), com a seguinte lógica:

  • Se o valor digital lido leitura for igual a nível lógico alto (HIGH), o LED será acionado, a variável estadoSensor será alterada para true e a mensagem “Movimento detectado” será impressa no monitor serial.
  • Senão, o LED será desligado, a variável estadoSensor será definida como false e a mensagem “Sem movimento” será exibida no monitor serial.

Assim sendo, o Sketch deste projeto terá a seguinte estrutura :

int ledPin = 6; //Pino do LED
int sensorPin = 7; //Pino do sensor de presença
int leitura = 0; //Variável para armazenar a leitura do sensor
bool estadoSensor = false; //Variável para armazenar o estado do sensor

void setup() {
  Serial.begin(9600); //Inicializa a comunicação serial
  pinMode(ledPin, OUTPUT); //Define ledPin como saída
  pinMode(sensorPin, INPUT); //Define sensorPin como entrada
}

void loop() {
  leitura = digitalRead(sensorPin); //Realiza a leitura do sensor de presença

  if (leitura == HIGH) { //Se leitura for igual a HIGH, o movimento foi detectado
    digitalWrite(ledPin, HIGH); //Aciona o LED
    if (estadoSensor == false) { //Compara o valor de estado do LED
      Serial.println("Movimento detectado"); //Imprime a mensagem no monitor serial
      estadoSensor = true; //Altera o valor de estadoSensor para HIGH
    }
    delay(5000); //Tempo de LED acionado

  } else { //Se leitura for igual a LOW, não houve movimento detectado
    digitalWrite(ledPin, LOW); //Desliga o LED
    if (estadoSensor == true) { //Compara o valor de estado do LED
      Serial.println("Sem movimento"); //Imprime a mensagem no monitor serial
      estadoSensor = false; //Altera o valor de estadoSensor para HIGH
    }
  }
}

Espero ter ajudado,

Obrigada a todos e em caso de dúvidas deixe seu comentário abaixo!

Att. Carol Correia Viana

Dúvidas? Deixe seu comentário

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.