Arduino - Sensor de Movimento
Quando você se aproxima de lugares onde as portas abrem/fecham automaticamente, as lâmpadas acendem/apagam automaticamente ou a escada rolante é ativada automaticamente, você já se perguntou: “Como isso funciona?” ? Se sim, este tutorial não só responde, mas também mostra como fazer isso. Vamos começar!
Neste tutorial, vamos aprender:
- Como funciona o sensor de movimento HC-SR501
- Como conectar o sensor de movimento HC-SR501 ao Arduino
- Como programar o Arduino para ler o estado do sensor de movimento HC-SR501
- Como usar o Arduino e o sensor de movimento HC-SR501 para detectar a entrada de pessoas e executar uma ação com base nisso.
Hardware Necessário
Or you can buy the following kits:
| 1 | × | DIYables STEM V3 Starter Kit (Arduino included) | |
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Sobre o Sensor de Movimento HC-SR501

O sensor PIR HC-SR501 é um sensor que pode detectar o movimento de pessoas (ou animais). Ele é muito usado para detectar a presença de pessoas em diversas aplicações (acender/apagar lâmpadas automaticamente, abrir/fechar portas, ativar/desativar escadas rolantes, detectar um intruso ...)
Pinagem
O sensor de movimento HC-SR501 tem 3 pinos:
- Pino GND: deve ser conectado ao GND (0V)
- Pino VCC: deve ser conectado ao VCC (5V)
- Pino OUTPUT: é um pino de saída: LOW quando nenhum movimento é detectado, HIGH quando um movimento é detectado. Este pino deve ser conectado a um pino de entrada do Arduino.
O HC-SR501 também tem um jumper e dois potenciômetros, que são usados para ajustar a configuração do sensor. Primeiro, mantenha a configuração padrão. Os detalhes são descritos na seção Usos Avançados.

Como Funciona
O sensor HC-SR501 detecta movimento com base na mudança da radiação infravermelha do objeto em movimento. Para ser detectado pelo sensor HC-SR501, o objeto deve atender a duas condições:
- Estar se movendo ou balançando
- Estar emitindo raios infravermelhos.
Então:
- Se um objeto está se movendo mas NÃO está emitindo raios infravermelhos (ex: um robô ou carrinho de brinquedo), ele NÃO é detectado pelo sensor.
- Se um objeto está emitindo raios infravermelhos mas NÃO está se movendo (ex: uma pessoa parada sem se mexer), ele NÃO é detectado pelo sensor.
Pessoas e animais emitem raios infravermelhos naturalmente. Por isso, o sensor consegue detectar o movimento de pessoas e animais.
Estado do pino OUTPUT:
- Quando NÃO há nenhuma pessoa (ou animal) se movendo no alcance de detecção do sensor, o pino OUTPUT do sensor fica em LOW.
- Quando uma pessoa (ou animal) se move para dentro do alcance de detecção do sensor, o pino OUTPUT do sensor muda de LOW para HIGH (⇒ movimento detectado).
- Quando uma pessoa (ou animal) sai do alcance de detecção do sensor, o pino OUTPUT do sensor muda de HIGH para LOW (⇒ movimento terminado).
O vídeo acima mostra como o sensor de movimento funciona em princípio. Na prática, o sensor de movimento funciona de forma um pouco diferente, dependendo da configuração do sensor (descrita na seção Usos Avançados)
Detectar a Presença de Pessoas
O sensor em si NÃO detecta a presença de pessoas, ele apenas detecta o movimento. Usamos o Arduino (ou MCU) para deduzir a presença de pessoas com base na detecção de movimento do sensor, de acordo com a seguinte regra:
- Se um movimento for detectado, há pessoas presentes
- Se NENHUM movimento for detectado, NÃO há pessoas presentes
Essa regra está incorreta em um caso prático: as pessoas estão presentes no alcance do sensor, mas NÃO estão se movendo. O movimento NÃO é detectado. O Arduino (ou MCU) deduz que NÃO há pessoas presentes.
Por exemplo, sua sala de reuniões usa o sensor de movimento para acender/apagar a luz automaticamente, e a luz acende automaticamente quando as pessoas entram na sala. Durante a reunião, se todos ficarem sentados sem se mexer, o movimento NÃO é detectado ⇒ NÃO há pessoas presentes ⇒ a luz se apaga automaticamente. Para acender a luz, alguém precisa se mexer.
No entanto, esse problema NÃO é grave e o sensor é barato. Por isso, o sensor é muito usado para detectar pessoas em diversas aplicações.
Arduino - Sensor de Movimento HC-SR501
Quando um pino do Arduino é configurado como entrada digital, ele pode ler o estado (LOW ou HIGH) de qualquer coisa conectada a ele.
Ao conectar o pino do Arduino ao pino OUTPUT do sensor HC-SR501, podemos usar o código do Arduino para verificar o valor do pino OUTPUT e detectar o movimento.
Diagrama de Ligação

This image is created using Fritzing. Click to enlarge image
Configuração Inicial
| Ajuste de Tempo de Atraso | Gire-o totalmente no sentido anti-horário. |
| Ajuste de Alcance de Detecção | Gire-o totalmente no sentido horário. |
| Seletor de Disparo Repetido | Coloque o jumper como mostrado na imagem. |

Como Programar o Sensor de Movimento
- Configure um pino do Arduino no modo de entrada digital usando a função pinMode()
- Leia o estado do pino OUTPUT do sensor usando a função digitalRead().
- Detecte o início do movimento (o estado do pino muda de LOW para HIGH)
- Detecte o fim do movimento (o estado do pino muda de HIGH para LOW)
Código Arduino
Passos Rápidos
- Copie o código acima e abra-o no Arduino IDE
- Clique no botão Upload no Arduino IDE para carregar o código no Arduino
- Abra o Serial Monitor
- Mova sua mão na frente do alcance do sensor
- Veja o resultado no Serial Monitor
Arduino com Sensor de Movimento HC-SR501 - Tutorial em Vídeo
Abaixo está um tutorial em vídeo passo a passo mostrando como usar o sensor de movimento HC-SR501 com o Arduino. No final do vídeo, você verá como fazer um sistema de porta automática com um servo e um buzzer usando o código abaixo:
Usos Avançados
Como mencionado acima, podemos ajustar a configuração do sensor por meio de um jumper e dois potenciômetros.
Ajuste de Alcance de Detecção
Este potenciômetro é usado para ajustar o alcance de detecção (aproximadamente de 3 metros a 7 metros).
- Se ele for girado totalmente no sentido horário, o alcance de detecção é de aproximadamente 3 metros.
- Se ele for girado totalmente no sentido anti-horário, o alcance de detecção é de aproximadamente 7 metros.

Podemos ajustar o potenciômetro para obter o alcance desejado (um valor entre 3m e 7m)
Ajuste de Tempo de Atraso
Este potenciômetro é usado para ajustar o tempo de atraso.
- Se ele for girado totalmente no sentido horário, o tempo de atraso é de aproximadamente 5 minutos.
- Se ele for girado totalmente no sentido anti-horário, o tempo de atraso é de aproximadamente 3 segundos.
O significado do tempo de atraso é explicado junto com o Disparo Repetido na próxima parte.

Seletor de Disparo Repetido
Há um jumper, que é usado para selecionar os modos de disparo: disparo único ou disparo repetível.

Vamos chamar a configuração do tempo de atraso (definida pelo Ajuste de Tempo de Atraso) de time_delay. Suponha que você continue se movendo no alcance do sensor por um longo tempo (chamado de motion_time) (várias vezes maior que time_delay)
- Modo de disparo único: o estado do pino OUTPUT alterna entre LOW e HIGH várias vezes. A duração em HIGH é igual a time_delay. A duração em LOW é fixa em 3 segundos.

- Modo de disparo repetível: o estado do pino OUTPUT permanece em HIGH durante (motion_time + time_delay).

Teste
Para ver como os modos de disparo funcionam, vamos fazer um teste. Gire o Ajuste de Tempo de Atraso totalmente no sentido anti-horário para definir o tempo de atraso em 3 segundos.
- Modo de disparo único:
- Coloque o jumper para selecionar o modo de disparo único
- Continue movendo sua mão na frente do sensor por cerca de 10 segundos.
- Tire sua mão do alcance do sensor
- Aguarde 3 segundos, você verá o resultado no Serial Monitor da seguinte forma:
- Modo de disparo repetível:
- Coloque o jumper para selecionar o modo de disparo repetível
- Continue movendo sua mão na frente do sensor por cerca de 10 segundos.
- Tire sua mão do alcance do sensor
- Aguarde 3 segundos, você verá o resultado no Serial Monitor da seguinte forma:
- Ligamos ou ativamos dispositivos/máquinas logo após a presença de uma pessoa
- NÃO desligamos ou desativamos dispositivos/máquinas imediatamente logo após a pessoa NÃO estar mais presente. Desligamos ou desativamos dispositivos/máquinas após um tempo limite.
- No sensor de movimento: o mínimo é 3 segundos e o máximo é 5 minutos. Feito pelo Ajuste de Tempo de Atraso
- No código do Arduino: qualquer valor, feito por programação
Como podemos ver, no modo de disparo único, o sensor dispara duas ou três vezes. No modo de disparo repetível, o sensor dispara apenas uma vez.
※ Nota:
Em ambos os casos, durante o tempo em LOW (3 segundos) (um valor fixo e não ajustável), o sensor NÃO consegue detectar nenhum movimento. Em outras palavras, o sensor fica bloqueado nesse período. Na prática, isso NÃO causa nenhum problema.
É recomendado usar o modo de disparo repetível.
Em muitas aplicações reais:
Como Usar o Tempo de Atraso
Quando é detectado que NÃO há pessoas presentes, o sistema de automação executa uma ação após um tempo de atraso.
O tempo de atraso pode ser definido no sensor de movimento e no código do Arduino:
Se NÃO definirmos um tempo limite no código do Arduino, o tempo limite é igual ao tempo de atraso da configuração do sensor.
Se definirmos um tempo limite no código do Arduino, o tempo limite é a soma do tempo de atraso da configuração do sensor com o tempo de atraso do código do Arduino.
Definindo o tempo de atraso no código do Arduino
Suponha que o modo de disparo repetível esteja configurado. O atraso neste código é definido como 30 segundos. Isso significa que o tempo de atraso é igual a 30 segundos mais o time_delay, que é definido na configuração do sensor (pelo Ajuste de Tempo de Atraso).
Desafie-se
Use o sensor de movimento para fazer um dos seguintes projetos:
- Acender a luz automaticamente quando você entrar no seu quarto e apagar a luz 30 segundos depois que você sair. Dica: Consulte Arduino - Relé.
- Disparar um alarme automaticamente quando alguém se aproximar dos seus objetos de valor. Dica: Consulte Arduino - Buzzer Piezo.