Monitor de entrada analógica - ESP8266

Este post é um trabalho de conclusão da disciplina de Tópicos Especiais em Computação I ministrada por Miguel Alexandre Wisintainer, do curso de bacharelado em Ciência da Computação da Fundação Universidade Regional de Blumenau (FURB).
A premissa do projeto era que, a cada ciclo de 5 (cinco) segundos, fosse verificada a entrada analógica do hardware (A0), e se o valor retornado fosse maior do que o definido pelo usuário via web server, o hardware enviaria via SMPT um e-mail de aviso ao endereço de e-mail, também informado via web server pelo usuário, e juntamente ao envio do e-mail o hardware deveria enviar os dados lidos para um tópico no servidor MQTT thingspeak.com. Os valor informados no web server deveriam ser gravados no file system, e quando o hardware fosse reiniciado, deveria manter as configurações informadas pelo usuário.

Imagem 1: Foto do hardware durante uma aula de desenvolvimento.

Para o desenvolvimento do trabalho, foi utilizado um módulo ESP8266 (NodeMCU), um fotoresistor, um breadboard  e um resistor. Para o software foi utilizada a IDE Arduino configurada para o ESP8266 para fazer a compilação do programa e o upload dele para a placa.
Foi desenvolvido na linguagem Wiring C, que foi utilizada por familiaridade com a linguagem, pois já era conhecida pelos desenvolvedores do projeto, e também por existirem vários exemplos, já que o Wiring C é amplamente utilizado com este tipo de hardware.

Imagem 2: Web Server com os campos preenchidos.

Uma das maiores vantagens de ter utilizado C para o desenvolvimento deste projeto, é que o C possui vários exemplos na internet, e várias bibliotecas já prontas para uso, afinal é a linguagem nativa do hardware. Em questão de desvantagens, a pinagem do ESP8266 é diferente da pinagem do modelo Arduino, o que gerou alguma dificuldade de entender em qual pino deveria ser feita a leitura, além disso, o ESP possui menos pinos, o que o faz perder lugar no mercado quando se trata de uma automação maior.
A maior dificuldade encontrada foi salvar as entradas do web server no file system, pois na primeira tentativa, eram gravados e lidos dois arquivos diferentes, um para cada entrada do web server, o que fazia com que o ESP se perdesse no código e carregasse a mesma informação nos dois arquivos. Numa segunda tentativa, foi utilizado um arquivo no formato json, que facilitou bastante a leitura e escrita.
Aqui veremos uma sequencia com os fluxogramas de cada função desenvolvida e utilizada no código.

Imagem 3: Fluxograma da função setup()

Imagem 4: Fluxograma da função loop()

Imagem 5: Fluxograma da função handleRoot()

Imagem 6: Fluxograma da função handleNotFound()

Imagem 7: Fluxograma da função handleSave()

Imagem 8: Fluxograma da função readFile()

Imagem 9: Fluxograma da função writeFile()

Imagem 10: Fluxograma da função exists()

Imagem 11: Fluxograma da função SendEmail()

Imagem 12: Fluxograma da função eRcv()

EXPLICANDO AS FUNÇÕES

A função setup() se encarrega de inicializar todos os recursos necessários para o funcionamento das funções desenvolvidas, tal como o FileSystem, o canal Serial, o módulo Wifi do hardware e o Webserver. É a primeira função executada quando o hardware é reiniciado. Segue o código fonte:
Imagem 13: Código fonte da função setup()

A função loop() é o que o hardware vai executar a cada ciclo de 5 segundos. No caso do trabalho desenvolvido, o hardware fará uma leitura do pino de entrada, verificar se esse valor é maior que o definido pelo usuário, e se for, enviar o email de aviso e os valores lidos ao MQTT. Note que a rotina de envio das informações só será executada se o valor definido for diferente de 0, pois se deixar com 0 informado, a cada 5 segundos, iria envar um email e um request ao MQTT, e o servidor de SMTP iria identificar como spam. Segue código fonte: 
Imagem 14: Código fonte da função loop()

A função handleRoot() vai se encarregar da página inicial do webserver, nela serão informados os parâmetros de configuração para o valor e endereço de email do usuário. É enviado ao server uma página web(html) com os parâmetros que já foram definidos anteriormente, com status 200(OK)
Imagem 15: Código fonte da função handleRoot()

A função handleNotFound() ficará responsável por qualquer outra página que for acessada dentro do webserver. É enviado ao server uma mensagem de texto inforando que o que foi requisitado não foi encontrado, com o status 404(NOT_FOUND). 

Imagem 16: Código fonte da função handleNotFound()

A função handleSave() ficará responsável por escrever o json com os parâmetros de configuração informados na página inicial do webserver.
Imagem 17: Código fonte da função handleSave()

A função readFile() lê o arquivo definido pelo parâmetro "path" e salva o que foi lido do json na estrutura de configuração cfg.
Imagem 18: Código fonte da função readFile()

A função writeFile() escreve o que está salvo na estrutura cfg dentro de um arquivo json que ficará salvo no local definido pelo parâmetro "path".
Imagem 19: Código fonte da função writeFile()

A função exists() verifica a existência do arquivo definido por "path" dentro do FileSystem do ESP8266.
Imagem 20: Código fonte da função exists()

A função sendEmail() ficará responsável pelo envio do email de aviso ao endereço de email informado no webserver pelo usuário. Nesta função, existe um endereço de email fixo, que é o remetente do envio de email, no caso deste trabalho, o email remetente é "test@test.com".
Imagem 21: Código fonte da função sendEmail()

A função eRcv() verifica a disponibilidade do cliente SMTP para o envio do email, para abortar o envio caso a conexão seja interrompida ao tentar enviar o email. 
Imagem 22: Código fonte da função eRcv()

REFERÊNCIAS

COMUNITY, Arduino. Arduino Home Page. Disponível em <https://www.arduino.cc/> Acessado em 26/07/2018.

BLANCHON, Benoît. Arduino Json Assistant. Disponível em <https://arduinojson.org/v5/assistant/> Acessado em 26/07/2018.

COMUNITY, Arduino. Arduino Forum - Sending email thru smtp2go. Disponível em <https://forum.arduino.cc/index.php?topic=482030.0> Acessado em 25/07/2018.

INC, The MathWorks. ThingSpeak Documentation. Disponível em <https://www.mathworks.com/help/thingspeak/> Acessado em 25/07/2018.

SMTP2GO. SMTP2GO Support. Disponível em <https://support.smtp2go.com/hc/en-gb> Acessado em 25/07/2018.

DESENVOLVEDORES

Caroline Batistel - 20 anos, programadora júnior na Philips EMR, cursando Bacharelado em Ciências da Computação pela Fundação Universidade Regional de Blumenau (FURB).

Lucas Matheus Westphal - 20 anos, programador júnior na RZ Sistemas, cursando Bacharelado em Ciências da Computação pela Fundação Universidade Regional de Blumenau (FURB).

CONTATO

Email = westphallucas1@outlook.com

Comentários