O projeto "Aviso de Invasor" foi desenvolvido com o software Arduino, a plataforma eletrônica NodeMCU, o aplicativo ThigSpeak e o site Easycoding.tn.
O software Arduino possui compatibilidade não apenas com a plataforma Arduino, mas também com o NodeMCU, por exemplo, por isso o utilizamos. Esse software usa, basicamente, a linguagem de programação C em conjunto com bibliotecas e funcionalidades próprias do Arduino, como a capacidade de ativar e desligar leds, ler os valores emitidos por sensores etc.
O software Arduino possui compatibilidade não apenas com a plataforma Arduino, mas também com o NodeMCU, por exemplo, por isso o utilizamos. Esse software usa, basicamente, a linguagem de programação C em conjunto com bibliotecas e funcionalidades próprias do Arduino, como a capacidade de ativar e desligar leds, ler os valores emitidos por sensores etc.
ThingSpeak é um app que faz a integração entre ser humano e máquina, no sentido de enviar os dados gerados pela NodeMCU às pessoas. O ThingSpeak faz essa incrível tarefa por meio de apps internos a ele, como o ThingTweet, que envia um Tweet em uma conta previamente conectada a ele. Para fazer isso, o ThingTweet gera uma "chave" (API Key), que pode ser utilizada nos códigos em formato Arduino (exemplo.ino).
Figura: ThingTweet, API Key
Fonte: Guilherme Nunes, 2019.
Easycoding.tn é um site que permite o desenvolvimento de códigos no formato de blocos, especificamente para aplicações em NodeMCU, ou seja, permite a criação de estruturas que envolvem IOT (Internet Of Things).
Figura: Easyconding.tn, blocos
Fonte: Guilherme Nunes, 2019.
Agora, após introduzir os componentes do projeto, falemos dele, de fato. O título oficial de nosso trabalho é "Detecção de Intrusos Utilizando NodeMCU e Sensor PIR", destacando a presença de um sensor PIR, que é o principal responsável por determinar a presença de pessoas em uma residência, devido a sua capacidade de detectar variações nos níveis de radiação infravermelha (infrared - IR).
O sensor é muito simples: a parte de cima (a redoma) possui o sensor, propriamente dito, que capta a radiação infravermelha, emitida por uma mão, por exemplo, e muda seu estado para HIGH, ou seja, ativado. Com essa funcionalidade construímos nosso projeto.
Figura: Sensor PIR com a redoma
O sensor possui ainda duas chaves que podem ser giradas para ajustar a sensibilidade e o tempo de ativação, ou seja, o raio de sensibilidade (em metros) e o tempo em que o sensor ficará HIGH ao ser ativado.
Figura: Ajustes do sensor PIR
Fonte: Mercado Livre, 2019.
Ademais, é importante informar que o sensor possui três pinos: uma entrada de energia, uma saída digital e um "terra". VCC (5V) é o pino de energia, SIGNAL é a saída digital e GND (ground) é o terra.
Figura: Pinos do sensor PIR
Fonte: Blog Baú da Eletrônica, 2018.
Agora, falando do projeto em si: para montar o circuito, além de utilizar o sensor e NodeMCU, também utilizamos jumpers (os cabinhos coloridos na imagem), um cabo USB (cabo branco conectado à NodeMCU), um led (com a luz verde acesa) e uma protoboard, responsável por conectar todos os anteriores.
Segue abaixo uma ilustração do projeto em TinkerCad. As únicas ressalvas são que nessa imagem utilizamos um Arduino no lugar da NodeMCU pois o site TinkerCad não a possui e, além disso, os pinos digitais 7 e 0 deveriam ser substituídos por D1 e D0, respectivamente, sendo que o primeiro se refere ao led e o segundo ao sensor PIR.
A parte física do projeto foi construída com a NodeMCU, uma protoboard, jumpers, um sensor PIR, um led, um resistor de 150Ω, um cabo USB e uma fonte de energia (um computador, no caso). Confira abaixo uma foto.
Toda vez que uma mão ou outra fonte de calor encostar no sensor será enviado um tweet pela conta conectada, com uma mensagem previamente definida, como a seguinte:
Segue abaixo uma ilustração do projeto em TinkerCad. As únicas ressalvas são que nessa imagem utilizamos um Arduino no lugar da NodeMCU pois o site TinkerCad não a possui e, além disso, os pinos digitais 7 e 0 deveriam ser substituídos por D1 e D0, respectivamente, sendo que o primeiro se refere ao led e o segundo ao sensor PIR.
Figura: Projeto em TinkerCad
Fonte: Guilherme Nunes, 2019.
A parte física do projeto foi construída com a NodeMCU, uma protoboard, jumpers, um sensor PIR, um led, um resistor de 150Ω, um cabo USB e uma fonte de energia (um computador, no caso). Confira abaixo uma foto.
Figura: Circuito do projeto
Fonte: Guilherme Nunes, 2019.
Toda vez que uma mão ou outra fonte de calor encostar no sensor será enviado um tweet pela conta conectada, com uma mensagem previamente definida, como a seguinte:
Figura: Tweet
Fonte: Guilherme Nunes, 2019.
A pessoa que estiver usando nosso código com um Arduino (software) poderá acompanhar algumas mensagens impressas no monitor serial. Se ninguém estiver em contato com o sensor, será impressa a mensagem "Ninguém presente", indicando que ninguém está tentando invadir a casa (o intuito do projeto é detectar invasores) e, quando aparecer a mensagem "Tweet enviado", significa que o tweet "Minha casa está sendo invadida" foi enviado pela conta do Twitter conectada à chave de ativação inserida no código.
Figura: Monitor serial
Fonte: Guilherme Nunes, 2019.
Abaixo segue um vídeo fazendo uma demonstração do monitor serial e do envio da mensagem ao Twitter. Perdão pela marca d'água no vídeo, meu editor filmora9 possui essa regra para o plano gratuito.
O vídeo abaixo mostra o funcionamento da parte física do projeto, ou seja, o que acontece no Twitter quando o led acende. Foi gravado com câmera de celular mesmo.
Agora, por fim, explicarei o código:
Figura: Código, parte 1
Fonte: Guilherme Nunes, 2019.
1: Inclui a biblioteca ESP8266WiFi.h,
que permite a utilização das funcionalidades WiFi da plataforma NodeMCU;
3: Ativamos o cliente WiFi da
NodeMCU;
5: Definimos uma lista do tipo “char”
que recebe o site api.thingspeak.com, plataforma utilizada para permitir que
nosso código envie uma mensagem pelo Twitter;
6: Essa variável recebe uma sequência
de caracteres correspondentes a uma chave de ativação gerada pela aplicação ThingTweet.
Essa chave, ao ser usada no código, permite o envio de um tweet por uma conta conectada;
7: “tsData” tem a função de receber a
mensagem que será enviada por Twitter;
9: “pinoLED” é uma variável constante
do tipo inteiro (const int) que recebe o pino de conexão de um led, nesse caso,
D1. Ela deve ser constante pois seu valor jamais mudará;
10: “pinoPIR” também é uma “const
int”, mas recebe o pino de entrada de um sensor PIR (sensor de calor – radiação
infravermelha, mais precisamente), nesse caso, D0;
12: “timer” é uma variável unsigned
long, ou seja, uma variável de tamanho extendido para armazenamento de números
não negativos. Essa variável armazena dados em milissegundos, por isso
utilizamos esse tipo de dados;
13: “cont”, como o nome sugere, é um
contador, por isso possui o tipo inteiro (int);
Figura: Código, parte 2
Fonte: Guilherme Nunes, 2019.
15: A função “void setup” é utilizada
para inicializar variáveis e configurar os pinos INPUT e OUTPUT;
16: Configuramos a variável pinoLED
para apenas trabalhar como saída de dados (brilhar, no caso do led);
17: Configuramos a variável pinoPIR
para apenas trabalhar recebendo dados externos ao programa (dados de radiação
infravermelha, no caso do sensor PIR);
19: Iniciamos o funcionamento do
monitor serial, aplicação gráfica do Arduino de visualização de “prints”;
20: A função “WiFi.disconnect()” faz
com que a NodeMCU desligue a conexão com qualquer rede WiFi com a qual esteja
conectada;
21: Um “delay” (espera) de 3000
milissegundos, ou 3 segundos, para executar o próximo comando;
22: “Serial.print” indica a impressão
de uma mensagem no monitor serial, no caso, a mensagem é “START”, que informa o
início da parte visual e interativa do programa;
23: A função “WiFi.begin” conecta a
NodeMCU a uma rede WiFi. Os parâmetros “guilherme” e “santos2016” referem-se,
respectivamente, ao nome da rede e à senha;
26: Essa estrutura “while” é
responsável por imprimir no monitor serial reticências (“...”) a cada meio
segundo, enquanto a NodeMCU não estiver conectada à internet;
27: O “println” indica que após
imprimir as reticências, o próximo comando deverá ser executado (impresso, no
caso) na próxima linha;
28: Esse delay é o tempo de espera
entre cada impressão. 500 milissegundos é o mesmo que meio segundo;
30: Se o comando do loop (while)
parar de ser executado, significa que a NodeMCU se conectou à rede e o
programa, logo em seguida, imprimirá uma mensagem informando que ela está
conectada;
Figura: Código, parte 3
Fonte: Guilherme Nunes, 2019.
33: “void loop” é uma função que será
executada indefinidamente, até que a energia da plataforma seja cortada;
34: A variável “timer” é atribuída
com a função “millis()”, que permitirá o armazenamento de dados de tempo em
milissegundos;
36, 37 e 38: Se o valor da variável
timer exceder 30000 milissegundos (30 segundos), ela passará por um novo teste:
se seu valor corresponder a exatos 30000 então uma mensagem será impressa no
monitor serial, indicando que o usuário já pode começar a interagir com o
sensor. Adicionamos essa condição de tempo pois o tweet estava sendo enviado
logo quando o loop era acionado;
40: Se o pino digital “pinoPIR”
indicar o valor HIGH, ou seja, se o sensor PIR identificar a presença de
radiação infravermelha, calor, uma nova condição será testada;
41: Caso a NodeMCU estiver conectada
ao site api.thingspeak.com será ativado um loop, referente ao envio do tweet;
42: “cont++” representa um acréscimo
de uma unidade à variável cont, toda vez que o loop é repetido. Percebemos que
logo quando a NodeMCU se conectava ao site o tweet era enviado, mesmo sem
ninguém tocar no led, então decidimos usar um contador para esperar um tempo e
deixar o sistema se estabilizar;
43 – 51: Essas linhas foram
produzidas a partir da programação em um site chamado easycoding.tn, que
facilita a programação com aplicações em IOT. Veja abaixo um esboço do início
de nosso código. A área marcada com 43 – 51 indica a linha que gerou as 9 linhas
citadas (de 43 a 51 são 9 linhas ao todo). Nós baixamos esse código e ele
passou para o formato “.ino” (referente ao software Arduino).
Figura: Easycoding.tn programming
Fonte: Guilherme Nunes, 2019.
Figura: Código, parte 4
Fonte: Guilherme Nunes, 2019.
52: Quando o contador está maior do que 10 percebemos que é um bom momento para permitir o envio do tweet, pois não há mais erros relacionados ao envio da mensagem sem a interação com o usuário (invasor);
53 e 54: Se o código foi executado até aqui, significa que o sensor possui valor HIGH, então o led deveria estar aceso, mas isso só é possível quando o contador chega a 10. Quando isso acontece, o led acende e é impressa no monitor serial a mensagem “Tweet enviado”;
56, 57 e 58: Enquanto o valor do contador for menor que 10 o led possuirá valor LOW e será impressa no monitor serial a mensagem “Ninguém presente”;
60: Entre a impressão de uma ou outra mensagem (“Tweet enviado” ou “Ninguém presente”) é dado um delay (uma espera) de 700 milissegundos (0,7 segundo);
63 – 66: Esse “else” refere-se ao comando condicional (if) do sensor PIR. Se o sensor possuir valor LOW, o valor do led também será LOW e será impressa no monitor serial a mensagem “Ninguém presente”, a cada 500 milissegundos (meio segundo);
69, 70 e 71: Esse último “else” refere-se à variável “timer”. Se o timer for menor que 30.000 milissegundos (30 segundos) serão impressas reticências (...) no monitor serial, com um delay de meio segundo.
Figura: Tweet enviado
Fonte: Guilherme Nunes, 2019.