ESP8266 - Sensor de Movimento

Você já se perguntou “Como ele consegue fazer isso?” ao encontrar lugares com portas que abrem e fecham sozinhas, lâmpadas que acendem e apagam ou escadas rolantes que ligam sem nenhuma intervenção humana? Se sim, este tutorial não só vai responder à sua pergunta, como também vai mostrar como fazer isso acontecer usando o ESP8266 e um sensor de movimento. Vamos começar!

Este tutorial ensina como usar o ESP8266 com um sensor de movimento. Em detalhes, vamos aprender:

Hardware Necessário

1×ESP8266 NodeMCU ESP-12F
1×Alternatively, ESP8266 D1 Mini NodeMCU ESP-12F
1×Alternatively, ESP8266 NodeMCU ESP-12E (Uno-form)
1×Micro USB Cable
1×Alternatively, ESP8266 NodeMCU ESP-12F (SMD-form)
1×Cabo USB Tipo-A para Tipo-C (para PC com USB-A)
1×Cabo USB Tipo-C para Tipo-C (para PC com USB-C)
1×Sensor de Movimento HC-SR501
1×Fios Jumper
1×(Recomendado) Placa de Expansão com Bornes de Parafuso para ESP8266

Or you can buy the following kits:

1×DIYables Sensor Kit (18 sensors/displays)
Divulgação: Alguns dos links desta seção são links de afiliado da Amazon. Podemos receber uma comissão pelas compras feitas por meio desses links, sem custo adicional para você. Agradecemos o seu apoio.

Sobre o Sensor de Movimento HC-SR501

HC-SR501 Motion Sensor

O sensor PIR HC-SR501 é um módulo que consegue detectar o movimento de pessoas (ou animais). Ele é muito usado em diversas aplicações para detectar a presença de pessoas, como ligar/desligar automaticamente uma lâmpada, abrir/fechar uma porta, ativar/desativar uma escada rolante ou detectar um intruso.

Pinagem do Sensor de Movimento

O sensor de movimento HC-SR501 tem três pinos:

  • Pino GND: deve ser ligado ao GND (0V)
  • Pino VCC: deve ser ligado ao VCC (5V)
  • Pino OUTPUT: é um pino de saída. Ele fica em LOW quando nenhum movimento é detectado e em HIGH quando um movimento é detectado. Esse pino precisa ser conectado a um pino de entrada do ESP8266.

O HC-SR501 tem um jumper e dois potenciômetros que são usados para ajustar as configurações do sensor.

HC-SR501 Motion Sensor pinout

Como Funciona

O sensor HC-SR501 consegue detectar movimento com base nas variações da radiação infravermelha emitida por um objeto em movimento. Para que o sensor HC-SR501 identifique o objeto, dois critérios precisam ser atendidos:

  • O objeto deve estar em movimento ou vibrando
  • O objeto deve emitir radiação infravermelha

Consequentemente:

  • Se um objeto está em movimento, mas não emite raios infravermelhos (por exemplo, um robô ou um carrinho de brinquedo), ele não será detectado pelo sensor.
  • Se um objeto emite raios infravermelhos, mas não está em movimento (por exemplo, uma pessoa parada), ele não será detectado pelo sensor.

Pessoas e animais são fontes de radiação infravermelha. Assim, o sensor consegue detectar seus movimentos.

O estado do pino OUTPUT do sensor:

  • Quando nenhuma pessoa (ou animal) está presente na faixa de detecção, ele fica em LOW.
  • Quando uma pessoa (ou animal) entra na faixa de detecção, o pino muda de LOW para HIGH, indicando que um movimento foi detectado.
  • Quando a pessoa (ou animal) sai da faixa de detecção, o pino muda de HIGH para LOW, mostrando que o movimento parou.

O vídeo acima mostra como o sensor de movimento funciona na teoria. Na prática, o sensor de movimento funciona de forma um pouco diferente, dependendo das configurações do sensor (que são descritas na seção Usos Avançados).

Detectando a Presença de Pessoas

O sensor não detecta diretamente a presença de pessoas. Ele detecta apenas movimento. Usamos o ESP8266 para inferir se há pessoas presentes ou não com base no movimento detectado pelo sensor, seguindo esta regra:

  • Se o movimento é detectado, isso implica que há pessoas presentes
  • Se o movimento não é detectado, isso implica que não há pessoas presentes

Essa regra não é perfeita e não funciona em um cenário em que as pessoas estão dentro da faixa do sensor, mas não se movem: o movimento não é detectado e o ESP8266 conclui que a pessoa não está presente. No entanto, isso ainda é aceitável, porque as pessoas geralmente fazem pequenos movimentos.

Por exemplo, na sua sala de reuniões, o sensor de movimento é usado para ligar e desligar a luz. Quando as pessoas entram na sala, ela é iluminada automaticamente. No entanto, se todos ficarem parados durante a reunião, o sensor não detectará nenhum movimento, indicando que ninguém está presente, e a luz será desligada. Para ligar a luz novamente, alguém precisa se mover.

No entanto, esse problema NÃO é sério e o sensor é barato. Por isso, ele é amplamente usado para detectar pessoas em muitas aplicações.

ESP8266 - Sensor de Movimento HC-SR501

Conecte um pino de entrada digital do Arduino ao pino OUTPUT do sensor HC-SR501. Usando o código do ESP8266, verifique o valor do pino OUTPUT para detectar movimento.

Diagrama de Ligação

The wiring diagram between ESP8266 NodeMCU and Motion Sensor

This image is created using Fritzing. Click to enlarge image

Para mais informações, veja Pinagem do ESP8266 e como alimentar o ESP8266 e outros componentes.

Configuração Inicial

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

Como Programar o Sensor de Movimento

  • Configure uma entrada digital em um pino do Arduino usando a função pinMode().
pinMode(MOTION_SENSOR_PIN, INPUT);
  • Leia o estado do pino OUTPUT do sensor com a função digitalRead().
motion_state = digitalRead(MOTION_SENSOR_PIN);
  • Identifique quando o pino muda de LOW para HIGH, indicando o início do movimento.
prev_motion_state = motion_state; // store old state motion_state = digitalRead(MOTION_SENSOR_PIN); // read new state if (prev_motion_state == LOW && motion_state == HIGH) { // pin state change: LOW -> HIGH Serial.println("Motion detected!"); }
  • Identifique quando o pino muda do estado HIGH para LOW, indicando que o movimento parou.
prev_motion_state = motion_state; // store old state motion_state = digitalRead(MOTION_SENSOR_PIN); // read new state if (prev_motion_state == HIGH && motion_state == LOW) { // pin state change: HIGH -> LOW Serial.println("Motion stopped!"); }

Código ESP8266

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

Passos Rápidos

Para começar com o ESP8266 no Arduino IDE, siga estes passos:

  • Confira o tutorial como configurar o ambiente para o ESP8266 no Arduino IDE se esta for a sua primeira vez usando o ESP8266.
  • Ligue os componentes como mostrado no diagrama.
  • Conecte a placa ESP8266 ao seu computador usando um cabo USB.
  • Abra o Arduino IDE no seu computador.
  • Escolha a placa ESP8266 correta, como (por exemplo, NodeMCU 1.0 (ESP-12E Module)), e a respectiva porta COM.
  • Copie o código e abra-o com o Arduino IDE.
  • Clique no botão Upload no Arduino IDE para enviar o código ao ESP8266.
  • Abra o Serial Monitor.
  • Mova a mão na frente da faixa de detecção do sensor.
  • Confira a saída no Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Nodemcu 1.0 (ESP-12E Module)
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
New Line
9600 baud
Motion detected! Motion stopped!
Ln 11, Col 1
Nodemcu 1.0 (ESP-12E Module) on COM15
2

Vídeo

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 dito anteriormente, podemos alterar a configuração do sensor usando um jumper e dois potenciômetros.

Ajuste do Alcance de Detecção

Este potenciômetro é usado para mudar a distância em que algo pode ser detectado (cerca de 3 a 7 metros):

  • Se você girá-lo totalmente para a direita, ele só detecta objetos dentro de 3 metros.
  • Se você girá-lo totalmente para a esquerda, ele detecta objetos a até 7 metros de distância.
Motion Sensor Detection Range

Ajuste do Tempo de Atraso

Este potenciômetro é usado para modificar o tempo de atraso:

  • Quando girado totalmente no sentido horário, o tempo de atraso é de aproximadamente 5 minutos.
  • Quando girado totalmente no sentido anti-horário, o tempo de atraso é de aproximadamente 3 segundos.

A seção a seguir explica o conceito de tempo de atraso em conjunto com o Disparo Repetido.

motion sensor adjust time delay

Seletor de Disparo Repetido

Existe um jumper que é usado para escolher os modos de disparo: disparo único ou disparo repetido.

motion sensor trigger selection

Vamos chamar a configuração do tempo de atraso (definida pelo Ajuste do Tempo de Atraso) de time_delay. Se você continuar se movendo na faixa do sensor por um longo período (chamado de motion_time) (várias vezes maior que time_delay):

  • Modo de disparo único: o estado do pino OUTPUT alternará entre LOW e HIGH várias vezes. A duração em HIGH será igual a time_delay, enquanto a duração em LOW será fixa em 3 segundos.
motion sensor single trigger mode
  • Modo de disparo repetido: o estado do pino OUTPUT permanecerá em HIGH durante (motion_time mais time_delay).
motion sensor repeatable trigger mode

Teste

  • Modo de Disparo Único:
    • Coloque o jumper para selecionar o modo de disparo único
    • Mova a mão na frente do sensor por aproximadamente 10 segundos
    • Tire a mão da faixa de detecção do sensor
    • Espere 3 segundos e você verá a saída no Serial Monitor da seguinte forma:
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Nodemcu 1.0 (ESP-12E Module)
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
    New Line
    9600 baud
    Motion detected! Motion stopped! Motion detected! Motion stopped! Motion detected! Motion stopped!
    Ln 11, Col 1
    Nodemcu 1.0 (ESP-12E Module) on COM15
    2

    Modo de disparo repetido:

    • Coloque o jumper para selecionar o modo de disparo repetido
    • Acene com a mão na frente do sensor por aproximadamente 10 segundos
    • Afaste a mão da faixa de detecção do sensor
    • Espere 3 segundos e você verá a saída no Serial Monitor da seguinte forma:
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    Nodemcu 1.0 (ESP-12E Module)
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
    New Line
    9600 baud
    Motion detected! Motion stopped!
    Ln 11, Col 1
    Nodemcu 1.0 (ESP-12E Module) on COM15
    2

    Podemos observar que, no modo de disparo único, o sensor dispara duas ou três vezes. Já no modo de disparo repetido, ele dispara apenas uma vez.

    ※ Nota:

    Durante o tempo em LOW (3 segundos), que é fixo e não ajustável, o sensor não consegue detectar nenhum movimento. Isso não causa problemas na prática.

    Recomenda-se usar o modo de disparo repetido.

    Em muitas aplicações do mundo real, ligamos ou ativamos máquinas/dispositivos quando uma pessoa está presente, e não os desligamos nem desativamos imediatamente quando a pessoa deixa de estar presente. Em vez disso, esperamos um tempo limite antes de desligá-los ou desativá-los.

    Como Usar o Tempo de Atraso

    Se nenhuma pessoa for detectada, o sistema de automação esperará um período de tempo antes de iniciar a ação.

    O tempo de atraso pode ser ajustado no sensor de movimento e no código do ESP8266:

    • No sensor de movimento: o mínimo é de 3 segundos e o máximo é de 5 minutos, o que é feito pelo Ajuste do Tempo de Atraso.
    • No Código do ESP8266: qualquer valor pode ser definido, o que é feito por meio de programação.

    Se não especificarmos um tempo limite no código do ESP8266, . o valor do tempo limite será o mesmo que o tempo de atraso na configuração do sensor.

    Se especificarmos um tempo limite no código do ESP8266, o tempo de atraso total será a combinação do atraso definido no sensor com o atraso especificado no código do ESP8266.

    Definindo o tempo de atraso no código do ESP8266

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

    Se o modo de disparo repetido estiver ativado, o atraso será de 30 segundos mais time_delay, que pode ser ajustado nas configurações do sensor usando o Ajuste do Tempo de Atraso.

Desafie-se

Use o sensor de movimento para realizar um dos seguintes projetos:

  • Ative as luzes quando você entrar no seu quarto e desative-as 30 segundos depois que você sair. Dica: Dê uma olhada em ESP8266 - Relé.
  • Dispare um alarme quando alguém se aproximar dos seus objetos de valor. Dica: Confira ESP8266 - Buzzer Piezoelétrico.

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!