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:

Sobre o Sensor de Movimento HC-SR501

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.

Pinagem do Sensor de Movimento HC-SR501

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

Diagrama de Ligação Arduino Sensor de Movimento

This image is created using Fritzing. Click to enlarge image

Configuração Inicial

Ajuste de Tempo de AtrasoGire-o totalmente no sentido anti-horário.
Ajuste de Alcance de DetecçãoGire-o totalmente no sentido horário.
Seletor de Disparo RepetidoColoque o jumper como mostrado na imagem.
configuração inicial do sensor de movimento arduino

Como Programar o Sensor de Movimento

  • Configure um pino do Arduino no modo de entrada digital usando a função pinMode()
pinMode(PIN_TO_SENSOR, INPUT);
  • Leia o estado do pino OUTPUT do sensor usando a função digitalRead().
pinStateCurrent = digitalRead(PIN_TO_SENSOR);
  • Detecte o início do movimento (o estado do pino muda de LOW para HIGH)
pinStatePrevious = pinStateCurrent; // store old state pinStateCurrent = digitalRead(PIN_TO_SENSOR); // read new state if (pinStatePrevious == LOW && pinStateCurrent == HIGH) { // pin state change: LOW -> HIGH Serial.println("Motion detected!"); }
  • Detecte o fim do movimento (o estado do pino muda de HIGH para LOW)
pinStatePrevious = pinStateCurrent; // store old state pinStateCurrent = digitalRead(PIN_TO_SENSOR); // read new state if (pinStatePrevious == HIGH && pinStateCurrent == LOW) { // pin state change: HIGH -> LOW Serial.println("Motion stopped!"); }

Código Arduino

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-motion-sensor */ const int PIN_TO_SENSOR = 2; // the pin that OUTPUT pin of sensor is connected to int pinStateCurrent = LOW; // current state of pin int pinStatePrevious = LOW; // previous state of pin void setup() { Serial.begin(9600); // initialize serial pinMode(PIN_TO_SENSOR, INPUT); // set arduino pin to input mode to read value from OUTPUT pin of sensor } void loop() { pinStatePrevious = pinStateCurrent; // store old state pinStateCurrent = digitalRead(PIN_TO_SENSOR); // read new state if (pinStatePrevious == LOW && pinStateCurrent == HIGH) { // pin state change: LOW -> HIGH Serial.println("Motion detected!"); // TODO: turn on alarm, light or activate a device ... here } else if (pinStatePrevious == HIGH && pinStateCurrent == LOW) { // pin state change: HIGH -> LOW Serial.println("Motion stopped!"); // TODO: turn off alarm, light or deactivate a device ... here } }

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
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Motion detected! Motion stopped!
Ln 11, Col 1
Arduino Uno on COM15
2

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:

#include <Servo.h> #define SENSOR_PIN 2 // The Arduino UNO R4 connected to the output pin of the motion sensor #define SERVO_PIN 5 #define BUZZER_PIN 6 Servo servo; int motion_state = LOW; // Initialize current pin state to LOW int prev_motion_state = LOW; // Initialize previous pin state to LOW void setup() { Serial.begin(9600); // Start serial communication at 9600 baud rate pinMode(SENSOR_PIN, INPUT); // Configure pin 2 as an input for the sensor pinMode(BUZZER_PIN, OUTPUT); // Configure the buzzer pin as output servo.attach(SERVO_PIN); servo.write(0); noTone(BUZZER_PIN); } void beep() { for (int i = 0; i < 2; i++) { tone(BUZZER_PIN, 5000); delay(100); noTone(BUZZER_PIN); delay(100); } } void loop() { prev_motion_state = motion_state; // Assign the current pin state to the previous pin state for comparison motion_state = digitalRead(SENSOR_PIN); // Read the current state from the sensor output // Check for transition from LOW to HIGH which indicates motion detected if (prev_motion_state == LOW && motion_state == HIGH) { Serial.println("Motion detected!"); // Print message when motion is detected servo.write(180); beep(); // Optional: Additional actions when motion is detected } // Check for transition from HIGH to LOW which indicates motion has stopped else if (prev_motion_state == HIGH && motion_state == LOW) { Serial.println("Motion stopped!"); // Print message when motion has stopped servo.write(0); beep(); // Optional: Additional actions when motion stops } }

Usos Avançados

Esta seção traz um conhecimento mais aprofundado. NÃO se preocupe se você não entender. Pule esta seção se ela parecer difícil demais e volte outro dia. Continue lendo as próximas seções.

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.
Alcance de Detecção do Sensor de Movimento

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.

ajuste do tempo de atraso do sensor de movimento

Seletor de Disparo Repetido

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

seleção de disparo do sensor de movimento

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 único do sensor de movimento
  • Modo de disparo repetível: o estado do pino OUTPUT permanece em HIGH durante (motion_time + time_delay).
modo de disparo repetível do sensor de movimento

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:
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Arduino Uno
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Arduino Uno' on 'COM15')
    New Line
    9600 baud
    Motion detected! Motion stopped! Motion detected! Motion stopped! Motion detected! Motion stopped!
    Ln 11, Col 1
    Arduino Uno on COM15
    2
    • 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:
      ∞
      Newbiely | Arduino IDE 2.3.8
      ──
      ☐
      ✕
      File
      Edit
      Sketch
      Tools
      Help
      Arduino Uno
      Newbiely.ino
      ···
      8 Serial.println("Hello World!");
      Output
      Serial Monitor
      Message (Enter to send message to 'Arduino Uno' on 'COM15')
      New Line
      9600 baud
      Motion detected! Motion stopped!
      Ln 11, Col 1
      Arduino Uno on COM15
      2

      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:

      • 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.

      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:

      • 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

      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

      /* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-motion-sensor */ const int PIN_TO_SENSOR = 2; // the pin that OUTPUT pin of sensor is connected to int pinStateCurrent = LOW; // current state of pin int pinStatePrevious = LOW; // previous state of pin const unsigned long DELAY_TIME_MS = 30000; // 30000 miliseconds ~ 30 seconds bool delayEnabled = false; unsigned long delayStartTime; void setup() { Serial.begin(9600); // initialize serial pinMode(PIN_TO_SENSOR, INPUT); // set arduino pin to input mode to read value from OUTPUT pin of sensor } void loop() { pinStatePrevious = pinStateCurrent; // store state pinStateCurrent = digitalRead(PIN_TO_SENSOR); // read new state if (pinStatePrevious == LOW && pinStateCurrent == HIGH) { // pin state change: LOW -> HIGH Serial.println("Motion detected!"); Serial.println("Turning on / activating"); delayEnabled = false; // disable delay // TODO: turn on alarm, light or activate a device ... here } else if (pinStatePrevious == HIGH && pinStateCurrent == LOW) { // pin state change: HIGH -> LOW Serial.println("Motion stopped!"); delayEnabled = true; // enable delay delayStartTime = millis(); // set start time } if (delayEnabled == true && (millis() - delayStartTime) >= DELAY_TIME_MS) { Serial.println("Turning off / deactivating"); delayEnabled = false; // disable delay // TODO: turn off alarm, light or deactivate a device ... here } }

      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.

Referências de Funções

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!