O Arduino é bastante interessante para projetos onde é necessário monitorar temperaturas, som, luminosidade, vazão de um liquido e as mais diversas variáveis do nosso dia a dia.
Na maioria dos projetos nós utilizamos um display para monitorar as variáveis, e alguns projetos de controle a grandeza de interesse não é monitorada. Isso gera problemas ao longo prazo, pois, em casos de erros no projeto, ou possíveis problemas, é desejável saber em qual condição ocorreu o defeito.
Vamos pensar no caso de um sistema de armazenamento de medicamentos como a insulina, onde a temperatura sempre deve estar entre 2°C a 8°C no máximo. Seria muito interessante poder salvar todas as medidas para que seja fácil avaliar se o medicamento está em boas condições.
Existem diversas soluções comerciais para o armazenamento de dados em longo prazo, e essa é a função de um Datalogger. A principal desvantagem de um datalogger comum é o acesso aos dados.
O acesso aos dados em um datalogger sem conexão sem fio se dá por uma interface física, o que dificulta uma visualização em tempo real. Com o uso de um banco de dados em nuvem, temos a vantagem de reter dados como um Datalogger e a visualização em tempo real.
Se caso você não sabe o que é um banco de dados, não se preocupe, aqui vou te explicar um pouco sobre esse conceito de forma simples.
Um banco de dados é um conjunto de dados relacionados entre si que são organizados de forma extremamente otimizada para que seja rápido a busca, e de forma compacta.
De forma muito simplista, podemos comparar o armazenamento de um banco de dados a várias tabelas de um Excel, onde no Excel o que chamamos de planilha, no banco de dados chamamos de tabelas (um banco de dados pode ser composto por várias tabelas) . O que chamamos no excel de colunas, no banco de dados chamamos de campo. E o que no Excel chamamos de linha, no banco de dados chamamos de registro.
Diferente do Excel, a principal vantagem de um banco de dados está no sistema que gerencia esses dados, que utiliza uma linguagem de consulta própria, onde através dela possamos incluir dados, consultar os dados e gerenciar todo o banco de dados. Recomendo fortemente que pesquise sobre o assunto caso tenha interesse.
Existem vários tipos de bancos de dados, no qual a linguagem de consulta pode mudar, e que o banco de dados em si podem estar armazenados em vários locais diferentes: ou uma máquina local, ou em uma rede local, ou até mesmo em uma máquina na internet que está a vários quilômetros de distância. Essa última opção que é a mais interessante para a gente.
Existem várias empresas que fornecem esse serviço de cloud de banco de dados, e para esse post escolhemos a Clever Cloud, que possui diversas ferramentas interessantes para desenvolvedores e analista de dados, e que é grátis para até 10mb de uso.
Existem outros projetos na internet que utilizam o db4free.net, que é bom, mas em minha experiência achei uma ferramenta bastante instável, mas tem a vantagem de poder ser utilizado até 200mb.
A linguagem de consulta de dados que vamos escolher é a MySQL, por ser simples, possuir uma comunidade grande e uma boa biblioteca para Arduino.
Tendo em vista todos estes conceitos aprendidos, iremos desenvolver um sistema que através do Arduino Uno faça a leitura de vários sensores de temperatura, e envie esse dado para um ESP-01, para que ele envie a medida para o banco de dados online, e posteriormente possamos analisar.
Este projeto pode ser bastante útil para diversos tipos de aplicação onde seja necessário registrar dados em nuvens e apresentar ele através da Web.
Para este projeto escolhemos um Arduino Uno + o ESP-01 porque sabemos que grande parte de vocês possui um Arduino Uno, e dessa forma poderemos fazer o projeto com os materiais que vocês já possuem.
É possível facilmente adaptar o projeto para uma placa NodeMCU, e fica a critério de vocês escolherem o melhor caminho.
O primeiro passo para o desenvolvimento do projeto é criar uma conta na Clever Cloud (clique aqui), e vá em Sign Up Free.
Coloque o seu e-mail pessoal que exista, e crie sua conta.
Vá no seu e-mail e ative a sua conta clicando no link onde está o campo em vermelho.
Preencha seus dados para finalizar.
E assim sua conta estará criada.
No canto esquerdo, clique em “Personal space” e vá em clique em “Create… an add-on”
E selecione a opção MySQL.
Escolha o plano DEV, que é grátis para até 10MB.
Depois de tudo criado, você terá as credenciais para o seu banco de dados. As do meu banco de dado são estas, as suas são diferentes.
Não passe essas credenciais a ninguém.
Para conferir sua senha, basta clicar na parte destacada abaixo.
E assim o seu banco de dados já estará criado e pronto para ser usado, mas ainda é necessário criar uma tabela para inserirmos os dados.
Vá em Datalogger(nome do projeto)>Addon dashboard>PHPMyAdmin.
Vá em “Databases”.
Clique na primeira planilha (a sua deve possuir um nome diferente).
Coloque o nome “Temperatura” (Se atente a primeira letra ser maiúscula), e selecione 3 colunas. Após isso clique em GO.
Nomeie exatamente como na imagem abaixo, e coloque os mesmos tipos de variáveis. E no “DATA_HORA”, é muito importante colocar ela do tipo CURRENT_TIMESTAMP. Clique em save depois de concluido.
Assim a sua tabela e o seu banco de dados foram criados com sucesso.
Para este projeto, precisamos ter em mente que utilizaremos o módulo ESP-01 em Standalone, isso é, gravaremos nele nosso próprio firmware personalizado que será disponibilizado aqui nesse post.
Como sabemos, gravar as placas ESP precisa de alguns macetes, que podem ser vistos nesse post (clique aqui).
Aqui nesse post ensinaremos também a gravar o firmware utilizando o próprio Arduino Uno (Se caso você possuir um adaptador USB, você pode pular essa parte).
Para gravar o seu programa no ESP-01 utilizando o Arduino Uno se caso você não possuir um adaptador USB, ou um conversor USB/Serial, primeiramente abra a Arduino IDE (Se não possuir ou não sabe o que é, recomendo ler este post) e carregue um código em branco para a sua placa.
Depois faça a seguinte montagem com o Arduino e o ESP-01:
O ESP-01 é alimentado em 3.3V
Obs: O RX está com o RX, e o TX com o TX, e o pino GPIO_0 está ligado diretamente ao GND.
Com essa ligação feita, abra a Arduino IDE já configurada para enviar programas para ESP-8266. Se caso você não realizou essa configuração, clique aqui e aprenda como configurar.
Você irá precisar instalar a seguinte biblioteca (Vá em ferramentas > Gerenciador de bibliotecas):
Depois de instalada, preencha o código abaixo com as informações das credenciais da Clever Cloud que está disponível no ultimo passo que vimos do tópico anterior, insira também as informações do seu Wi-Fi.
Coloquei um > < nas informação que você deve alterar.
Envie o seguinte código:
/* * Programa para ESP-01 * Eletrogate * Arduino IDE versão 1.8.12 */ #include <ESP8266WiFi.h> #include <MySQL_Connection.h> #include <MySQL_Cursor.h> IPAddress server_addr(54, 39, 75, 7); // O IP DO SERVIDOR DA CLEVER CLOUD char user[] = ">USUARIO CLEVER CLOUD<"; // Usuario MySQL char password[] = ">COLOQUE AQUI A SENHA<"; // Senha MySQL char ssid[] = ">SEU USUARIO WIFI<"; // Nome de rede Wifi char pass[] = ">SENHA_WIFI<"; // Senha Wi-Fi char INSERT_DATA[] = "INSERT INTO >NOME_DO_BANCO_DE_DADOS<.Temperatura (ID_SENSOR, Temperatura) VALUES (%d,%s)"; // EXEMPLO ACIMA: "INSERT INTO b3d3z8bggux9ngtdusfw.Temperatura (ID_SENSOR, Temperatura) VALUES (%d,%s)"; WiFiClient client; MySQL_Connection conn(&client); MySQL_Cursor* cursor; void setup() { Serial.begin(9600); VerificaWiFi(); } void loop() { int id; float temp; AguardaDados(); Leitura(&id, &temp); delay(100); EnviaDados(id, temp); Serial.println(); } void AguardaDados() { while (!(Serial.available() > 0)) {} } void Leitura(int *id, float *temp) { char mensagem[20]; byte atual, i = 0; atual = 255; if (Serial.available() > 0) { while (atual != 10) { if (Serial.available() > 0) { atual = Serial.read(); // Serial.print((char)leitura); mensagem[i] = (char)atual; i++; } } i = 0; *id = atoi(strtok(mensagem, "|")); *temp = atof(strtok(NULL, "|")); } } void EnviaDados(int id, float temp) { char query[128]; char temperatura[10]; VerificaWiFi(); if (conn.connect(server_addr, 3306, user, password)) { delay(1000); MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn); // Save dtostrf(temp, 1, 1, temperatura); sprintf(query, INSERT_DATA, id, temperatura); // Execute the query cur_mem->execute(query); // Note: since there are no results, we do not need to read any data // Deleting the cursor also frees up memory used delete cur_mem; Serial.println(); Serial.println("Data recorded."); // } else Serial.println(); Serial.println("Connection failed."); // conn.close(); } void VerificaWiFi() { if (WiFi.status() != WL_CONNECTED) { //Serial.println("Sem conexão"); // WiFi.disconnect(); delay(1000); WiFi.begin(ssid, pass); // Serial.println();Serial.println("Conectando ao WiFi."); // while (WiFi.status() != WL_CONNECTED) { delay(500); } // Serial.println();Serial.println("Conectado a rede!"); // } }
E aguarde a mensagem “Hard resetting via RTS pin” aparecer, que é o sinal de que sua placa já foi gravada.
Agora faça a seguinte montagem com sua placa Arduino e sensores DS18B20.
Observe bem que foi mudado a posição dos jumpers RX e TX, em relação ao diagrama anterior.
Se você quiser utilizar mais sensores de temperatura, você pode utilizar quantos quiser nesse projeto.
Instale estas bibliotecas em sua Arduino IDE:
E carregue o seguinte código para o Arduino.
#include <OneWire.h> // Biblioteca para o protocolo de comunicação #include <DallasTemperature.h> //Biblioteca das funções do sensor de temperatura #include <SoftwareSerial.h> // A biblioteca para comunicar o Arduino com o ESP-01 SoftwareSerial SoftSerial(8,9); // RX Arduino 8, TX Arduino 9. class Sensor { // Criando uma classe para ficar mais fácil usar os sensores uint8_t ID_num ; OneWire _Wire; DallasTemperature sensor; public: void SetPin(uint8_t pin1) { _Wire.begin(pin1); sensor.setOneWire(&_Wire); sensor.setResolution(12); sensor.begin(); //INICIA O SENSOR sensor.requestTemperatures(); } float Temp() { sensor.requestTemperatures(); return (sensor.getTempCByIndex(0)); } void SetID(uint8_t n) { ID_num = n;} uint8_t ID() { return (ID_num);} }; Sensor TempAmbiente; // Crio um tipo de sensor de temperatura que é para medir o ambiente void setup() { delay(7000); // Aguarda um tempo para inicialização do ESP TempAmbiente.SetPin(2); // Defino o pino 2 como o pino do sensor de temperatura TempAmbiente.SetID(1); // Seto o ID como o sensor de temperatura do ambiente como 1 Serial.begin(9600); //INICIALIZA A SERIAL SoftSerial.begin(9600); } void loop() { EnviaESP(TempAmbiente.ID(),TempAmbiente.Temp()); // Envio para o ESP os dados do ID e da temperatura EscutandoESP(8000); // O Arduino ouve o ESP-01 por 8 segundos, para imprimir as mensagens seriais. } void EnviaESP(uint8_t ID, float Temperatura){ SoftSerial.print(ID);SoftSerial.print("|"); SoftSerial.print(Temperatura);SoftSerial.println("|"); } void EscutandoESP(int tempo){ unsigned long time1; char check[2]; char resposta[25] = {" "}; byte leitura, i=0; time1 = millis(); while(abs((millis()-time1)<tempo)){ leitura=255; if(SoftSerial.available()>0){ while(leitura != 10){ if(SoftSerial.available()>0){ leitura = SoftSerial.read(); // Serial.print((char)leitura); resposta[i]= (char)leitura; i++; } } i=0; for(int j=0; (int)resposta[j] != 10; j++) Serial.print(resposta[j]); Serial.println(); } } }
Com o código carregado, tudo já está funcionando se os dados foram colocados corretamente.
Note que por este código só estamos utilizando um sensor, mas para utilizar outros é bem simples, basta no loop setup você definir o pino de conexão desse sensor e o ID dele. Exemplo:
// (...) Sensor TempAmbiente, TempExterna; void setup() { delay(5000); TempAmbiente.SetPin(2); TempAmbiente.SetID(1); TempExterna.SetPin(3); TempExterna.SetID(2); Serial.begin(9600); //INICIALIZA A SERIAL SoftSerial.begin(9600); } void loop() { EnviaESP(TempAmbiente.ID(),TempAmbiente.Temp()); EscutandoESP(8000); EnviaESP(TempExterna.ID(),TempExterna.Temp()); EscutandoESP(8000); } // (...)
Inicie a conexão serial para verificar se está funcionando corretamente. Se caso tiver, você vera mensagens como esta:
Um possível erro pode estar no endereço do host. No nosso código para ESP-01 o endereço do host foi colocado direto como
IPAddress server_addr(54, 39, 75, 7); // O IP DO SERVIDOR DA CLEVER CLOUD
Se caso não estiver funcionando, pode ser que o seu servidor seja outro. Para descobrir o IP do seu HOST, copie o endereço http dele, e vá no Prompt de comandos
Digite: ping (endereço do host)
E assim você receberá o endereço do seu servidor de banco de dados.
Uma das vantagens do Clever Cloud é que ele permite manipular os dados em uma interface gráfica.
Para fazer o download de todo a tabela de dados das temperaturas registradas é bem simples. Entre na planilha em “PHPMyAdmin > Databases > (nome do banco de dados) > Temperatura”
Clique em export, .
Escolha o melhor formato para que você possa manipular esses dados (eu escolhi CSV do Excel)
Em seguida clique em Go.
Abra o arquivo no Excel, pressione Ctrl + L (ou Ctrl + F se for a versão em inglês), e substitua todo o ponto por vírgula, se caso seus números forem com a notação de decimais com vírgula.
Inverta de lugar as colunas DATA_HORA e Temperatura.
Gere um gráfico de dispersão linear selecionando todos os pontos.
E o resultado será este:
Onde esta é a medição da temperatura no meu quarto no fim de semana.
É possível usar o próprio Clever Cloud para gerar o gráfico, clicando em “Display Chart”
E você deverá selecionar o número máximo de colunas. Não achei muito viável porque demora bastante para gerar os gráficos.
Então assim aprendemos como criar um sistema de Datalogger sem a necessidade de uma mídia fisica ou local para gravar os dados.
Se caso você dominar tecnologias como PHP e outras, é bem interessante apresentar os dados em tempo real para serem visíveis.
É altamente recomendado que se você altere o código e deixe do melhor jeito para a sua aplicação, pois ele é livre.
Espero que você tenha tido um bom aprendizado. Se você montou e curtiu muito o resultado, nos marque lá no instagram: @eletrogate
Gostou? Deixe um curtir. Se caso quiser deixar uma dúvida, ou um elogio, deixe um comentário!
Obrigado por ter lido até aqui.
Tenha a Metodologia Eletrogate na sua Escola! Conheça nosso Programa de Robótica Educacional.
|
A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.
Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!