



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.
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.
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.
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:
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.
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.
|
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.
Encontre tudo na Loja Eletrogate com frete grátis para compras acima de R$ 200