IOT — Aquisição de Dados

Nicolas de Souza
Editorial 20 21
Published in
7 min readSep 30, 2020

O Mundo tem se admirado com os avanços da tecnologia nos últimos anos, impressoras 3D, máquinas inteligentes e IOT, encantam a qualquer um. Hoje vamos conversar sobre alguns pontos fundamentais para entender a complexidade e relevância de projetos IOT.

IOT, do inglês internet of things, que é traduzido como internet das coisas, é um movimento de integração de dispositivos físicos. Simples assim, são objetos que se comunicam pela internet, entre eles e com outros dispositivos como celulares e computadores. De certo modo, IoT é um novo estágio da construção de sistemas embarcados.

Neste artigo, vou levantar alguns pontos pertinentes ao desenvolvimento de projetos deste tipo. Falaremos sobre alguns conceitos desde a idealização até a fase de testes, vamos falar principalmente sobre as falhas.

Sobre o Projeto

O objetivo é criar um sistema embarcado capaz de medir a temperatura, umidade e a intensidade luminosa. Não só medir como também salvar para visualizarmos estes dados.

Para isso precisamos pensar em qual coisa usaremos. No nosso caso, vamos utilizar o NODEMCU 8266, por ser a placa mais barato e simples atualmente no mercado — Poderíamos usar o ESP32, RASPBERRY ou qualquer outra que possuísse acesso à internet. Nossa placa vai se comunicar com o computador pela internet, enviando assim os dados de interesse.

Já sabemos qual coisa iremos usar, onde eles irão se comunicar, mas como?! Para que haja comunicação entre a placa e o computador, pode parecer simples então vou explicar um pouco mais. Imagine que cada coisa neste projeto fala um determinado idioma, o NodeMCU fala um, os sensores falam outros e o computador fala outro. Quase a torre de babel!

Para que seja possível que eles se comuniquem é necessário garantir que eles se entendam, existem algumas formas de fazer isso. Para isso vamos usar conceitos de API, Applicantion Programming Interface ou interface de programação de aplicativos.

Uma API é um conjunto de regras e rotinas que possibilita a programas diversos se comunicarem por estabelecer regras e padrões. Por exemplo, se você quer acessar dados do Google Maps, você não precisa ir ao código fonte e copiar o que está lá. Basta você acessar esses dados através da API, desta forma não importa qual linguagem de programação o código original foi feito ou o que você quer fazer. A interface já está pronta.

Nós vamos criar uma interface, nossa API, para disponibilizar os dados medidos na mesma rede Wi-Fi que nosso NodeMCU estiver conectado.

Agora vamos discutir como nossa API vai funcionar. API’s normalmente usam o protocolo HTTP, este protocolo é o queridinho do desenvolvimento web. É um protocolo relativamente seguro, fácil de implementar e de se entender.

O protocolo HTTP funciona com base em requisições. Uma requisição é um pedido, uma solicitação, por parte do cliente, que gera uma resposta do servidor. Essa requisição pode ser o pedido para envio de uma página que está no servidor, quando você clica para abrir um site por exemplo. Esta requisição se chama GET, ela solicita alguma coisa do servidor. Existe ainda a possibilidade de enviar algo ao servidor, um formulário por exemplo, nesse caso fazemos um POST.

Em nosso projeto o funcionamento será do seguinte modo, nossa API estará rodando no NodeMCU, que será nosso servidor, nosso computador será o cliente e fará requisições pedindo as informações. Mas como será essa resposta?!

Poderíamos enviar essas respostas HTML, gerar uma página inteira para quem fizesse a requisição, mas vamos usar algo mais apropriado. No mundo do desenvolvimento web, um formato muito utilizado tem sido o JSON.

O JSON, Javascript Object Notation em portugês objeto Javascript, é um tipo de dado estruturado similar aos dicionários do Python. Neste tipo de dado há o conceito de chave-valor, cada chave possui um valor, esse valor pode ser qualquer coisa.

Nós vamos usar a forma mais simples, três chaves, uma para cada dado. Nossas chaves serão temperature, humidity e luminosity, cada qual com o seu valor recente. Sempre que houver uma requisição por parte do nosso computador, nosso NodeMCU enviará o JSON abaixo.

Mãos à obra

Como tudo na plataforma Arduino, muita coisa já está pronta, feita ou adiantada em bibliotecas, aqui não é diferente. Nós vamos usar algumas bibliotecas nativas do NodeMCU, dessas o destaque é todo da ESP8266WebServer. Esta biblioteca entrega as funções de servidor, como mapeamento de rotas, envio de informações e requisições. Já a biblioteca ESP8266mDNS cuida do DNS da nossa conexão, disponibilizando para toda a rede Wi-Fi.

Além destas bibliotecas específicas da conexão à internet, usaremos também bibliotecas para o uso do sensor DHT11.

Vou destacar alguns pedaços do código para comentar, se algo passar despercebido e quiser conversar ou entender é só entrar em contato!

Nossa API, que estará rodando dentro do NodeMCU, possuíra duas rotas: “/” e “/data”. A primeira exibirá apenas uma mensagem de boas-vindas, a segunda é onde teremos o retorno dos dados. Abaixo é possível ver esse mapeamento de rotas, onde dizemos quais caminhos existem em nossa API.

O 200 indica ao cliente, no caso nosso computador, que o envio aconteceu normalmente.

A rota “/data” chamará a nossa função data. Nesta função fazemos as atualizações de valores e preparamos a resposta. Como em C/C++ não existe nenhum tipo de dado similar ao JSON, nós vamos precisar montá-lo como uma string e apenas informamos que se trata de uma tipo JSON ao enviar.

Nossa biblioteca nos ajuda ainda a tratar as rotas inexistente de uma maneira muito simples. Assim como criamos uma rota para enviar os dados com uma função, criamos uma função que enviará uma mensagem de erro sempre que necessário.

200 e 404, números presentes no método send, são codificações próprias do HTTP que indicam respectivamente que a requisição foi bem sucedida e erro.

Com essas informações fica mais fácil entender o código completo.

Para sermos capazes de guardar os dados ou manipulá-los, precisaremos criar um programa em nosso computador para realizar requisições HTTP ao nosso NodeMCU. Por questões de facilidades vamos usar o Python, mas praticamente qualquer linguagem de programação possui bibliotecas para lidar com requisições.

O código usado é extremamente simples, fazemos a requisição, tratamos a resposta e escrevemos num arquivo txt para que após a coleta fosse possível criar gráficos usando o Excel.

Se você possui intimidade com python, recomendo que use uma lib própria para visualização dos dados como Matplotlib

Um comentário que pode ser pertinente sobre o código python é o uso de excepte try.Fiz isso com o objetivo de saber se houvesse algum erro na leitura sem que a leitura fosse interrompida, no meu caso não aconteceu nenhum erro.

Debates

Agora que já sabem como eu realizei o projeto, vamos conversar sobre algumas coisas pertinentes às primeiras tentativas antes da coleta. Nesse ponto, estava tudo funcionando, dados sendo enviados, dados sendo recebidos e salvos em txt.

Alguns ajustes foram necessários, o primeiro era decidir a frequência que faríamos as requisições. Num primeiro momento pensei em fazer a cada 10 segundo, pensei que quanto mais dados melhor… Isso foi um erro.

Quais dados eu estava medindo? Temperatura, Humidade e luminosidade. Esses dados não variam tanto num intervalo! Eu estava tão fissurado em coletar dados que esqueci desse detalhe tão importante.

Depois disso, ajustei para um intervalo de um minuto. Ainda poderia ter colocado em um valor maior, talvez 5 minutos fosse melhor, mas queria obter um número grande de medições.

Algumas coisas me chamaram a atenção nos gráficos. Nas últimas medições da temperatura é possível notar um dente, uma medida muito baixa em relação a anterior e a próxima, isso deve ter se dado por falha do sensor.

Já no gráfico de luminosidade, vemos o seu valor percentual variar muito em certos momentos. No dia da medição havia muitas nuvens passando, isto interferiu diretamente na luminosidade dentro do cômodo.

O que eu achei mais legal de se observar foi a linearidade do aumento de luz logo no início do dia.

Próximos Passos

Para o futuro desse projeto, pretendo adicionar novos sensores para aumentar a quantidade e a qualidade da informação. Além disso, pretendo criar um App para acompanhar estas informações em tempo real.

Espero voltar logo com essas novidades!

Se quiser acessar as planilhas, códigos e imagens do texto basta acessar o repositório do projeto.

Espero que tenham gostado da nossa jornada. Se você se interessa por conteúdo desse tipo deixo algumas sugestões de textos e projetos que eu fiz para o 20 21.

--

--

Nicolas de Souza
Editorial 20 21

Um engenheiro por formação se aventurando no mundo do desenvolvimento de software!