Desenvolvimento de um protótipo de monitoramento de luminosidade com Esp2866.

Introdução

Olá, tudo bem com vocês?

Nós somos o Alesson, Gabriel e o Pablo, alunos do curso de Ciência da Computação da FURB, localizada em Blumenau-SC, Brasil.

Nesse blog, tentaremos exemplificar o trabalho final da matéria Tópicos especiais em computação I, lecionada pelo nosso professor mestre Miguel Alexandre Wisentainer.

Lembrando que o nosso projeto se trata de um sistema embarcado, aliado as ESP8266, onde o sensor capta os sinais de luminosidade e dispara alertas via e-mail quando necessário e mantém um histórico no https://thingspeak.com/

Aqui você vai encontrar toda tecnologia usada por nós. Iremos compartilhar nosso código fonte, ferramentas, apis e muito mais. Também iremos contar quais foram nossas dificuldades e quais as soluções utilizadas para terminar o trabalho em curto espaço de tempo.

Equipamentos e IDE utilizados no projeto

Imagem ilustrativa da IDE. Fonte.:https://bit.ly/2x1wVL2
Placa usada no trabalho. Fonte.: Pablo Mafessoli

Objetivo do projeto

O desafio consistia em criar uma aplicação que disparasse notificações via protocolo SMTP no momento em que um limiar de luminosidade, cadastrado pelo usuário juntamente com seu e-mail através de um formulário web, fosse ultrapassado. Para fins de consulta, os valores de luminosidade também são gravados no ThingSpeak[1], uma plataforma online para análise de dados provenientes de dispositivos IOT.

Para solucionar o problema, tivemos a possibilidade de escolher uma entre quatro linguagens de programação e seus respectivos ambientes integrados ao ESP8266: Lua e nodemcu, Python no ambiente MicroPython, C na plataforma Wiring e Basic. Iniciamos o desenvolvimento com Lua, mas por dificuldades encotradas na utilização dos módulos de SMTP (como a documentação precário e escassez de exemplos), migramos para C.O ‘‘Wiring IDE é um aplicativo de plataforma cruzada escrito em Java, derivado do IDE criado para a linguagem de programação Processing . Ele é projetado para introduzir programação e esboçar com eletrônica para artistas e designers. Ele inclui um editor de código com recursos como realce de sintaxe , correspondência de chave e recuo automático capaz de compilar e carregar programas para a placa com um único clique. O Wiring IDE inclui uma biblioteca C / C ++ chamada “Wiring”, que facilita muito as operações comuns de entrada / saída. Programas de fiação são escritos em um dialeto de C e C ++.’’

Fluxograma do projeto

Desenvolvimento

O esqueleto da aplicação consiste nas definições dos métodos setup e loop, os quais analisaremos em detalhe. Setup é responsável pela inicialização das configurações do microcontrolador, o método é executado apensa uma vez no ciclo de vida da aplicação[2], portanto é nele que definimos a abertura e taxa de transmissão de dados da porta serial (no nosso caso 115200, como apresentado na linha 147).

Outro recurso inicializado em setup é a conexão WiFi, que utilizamos para servir o formulário web para cadastro de informações e também a comunicação com o ThingSpeak. A conexão é estabelecida por meio de WiFi.begin[3] (importado do módulo ESP8266WiFi), que recebe o respectivo identificador (ssid) e a senha de acesso como parâmetros (linha 151).

Para tratar a necessidade de servir páginas que pudessem ser acessadas por usuários através de um browser, nossa aplicação se comporta como um servidor que tem sua inicialização e configuração de rotas definidas em setup. As funcionalidades do servidor são importadas de ESP8255WebServer[4], incluindo server.on que tem como objetivo o registro de rotas (associação de uma ação/função com um determinado path / caminho no servidor), e server.begin que efetivamente disponibiliza o servidor.

As funcionalidades do servidor foram divididas em três rotas para atender os requisitos:

  • “/” — Rota padrão: Aqui definimos e servimos o html, css e scripts que executarão na página da aplicação relacionados ao formulário de coleta de informações. A implementação do que é executado quando a rota padrão é acessada corresponde à função handleRoot.
Método handleRoot
  • “/load” — Rota de carregamento dos últimos dados persistidos: uma requisição para este path é disparada sempre que a página é carregada/recarregada, a fim de evitar que o usuário perca informações previamente cadastrada, handleLoad é função que implementamos para atender a este requisito.
Método handleSave

Vale destacar que as requisições para o servidor são realizadas de forma assíncrona via JavaScript por meio da API XMLHTTPRequist [5].

Método handleLoad

Após ter realizados todos os procedimentos do método setup, é chamado logo em seguida o método loop. Este método é de repetição, ou seja, sempre que terminar de executá-lo será chamado novamente fazendo os mesmos procedimentos dentro do seu bloco.

Primeiramente é feita uma validação para verificar se o usuário já inseriu um valor para o sensor na página web. Caso o usuário tenha preenchido um valor, entrará na condição e verificará se o valor atingido pelo sensor do ESP8266 passou o limite informado pelo usuário. Se o valor passar, será enviado uma mensagem para o endereço de e-mail cadastrado pelo usuário na página web e será enviado um valor para o ThingSpeak. Essas validações é feita a cada 5 segundos.

As funcionalidades para enviar mensagem para o e-mail[6] e para o ThingSpeak forma divididas em três métodos:

  • “sendEmail” — Este método enviará uma mensagem para o endereço de e-mail cadastrado pelo usuário na página web. A rotina realiza uma conexão SMTP e monta uma mensagem para o destinatário informando que o valor da luz ultrapassou o valor informado pelo mesmo. Esse método é um byte, retornando 0 caso ocorra algum erro ou 1 se tudo der certo. O e-mail e a senha devem ser convertidas para base64 por causa do protocolo SMTP. Ao usar esse método, foi necessário alterar a configuração de segurança do e-mail que será conectado pelo aplicativo ( No caso o que foi convertido para base64 ) para aceitar que o e-mail seja conectado por aplicativos menos seguro. Dentro desta rotina é utilizado o método ‘eRcv(client)’ que verifica se a conexão não foi perdida e se a requisição feita está correta.
Método sendEmail
  • “sendValueThingspeak” — Este método recebe o valor do sensor por parâmetro e se conecta com ThingSpeak, ao ser conectado a rotina fará um GET passando como parâmetro o valor do sensor. Ao enviar o valor, será verificado se a conexão com o servidor não foi perdida.
Método sendValueThingspeak

Participantes do projeto

Alesson Ricardo Bernardo

Gabriel Castellani de Oliveira

Pablo Mafessoli

Código fonte

Referências utilizadas para desenvolver o trabalho

[1] https://thingspeak.com/.

[2] https://learn.sparkfun.com/tutorials/digital-sandbox-arduino-companion/0-setup-and-loop

[3] https://www.arduino.cc/en/Reference/WiFiBegin

[4] https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WebServer/src/ESP8266WebServer.h

[5] https://developer.mozilla.org/pt-BR/docs/Web/API/XMLHTTPRequest

[6] https://www.automalabs.com.br/esp8266-como-enviar-e-mail-por-um-servidor-smtp/

Like what you read? Give concentrado topicosespeciais a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.