Como Utilizar a Firebase para Visualizar Dados de um Arduino (ESP32)
No último projeto, desenvolvemos um Sistema de Rega Inteligente com o Arduino. Vamos, neste artigo, melhorar esse mesmo projeto, acrescentando o envio de todos os dados processados para uma base de dados, neste caso, a Firebase, pertencente à Google.
Para acompanhar este tutorial irá necessitar dos seguintes artigos:
Imagem | Produto | Comprar |
---|---|---|
ESP32 (NodeMCU) | ||
Display LCD 20×4 I2C | ||
Breadboard 830 Pinos | ||
Módulo Relé 5V 1 Canal | ||
Sensor de Humidade do Solo | ||
Botão de Pressão | ||
Resistência 1K | ||
Fios de Ligação Macho-Macho | ||
Fios de Ligação Macho-Fêmea |
O que é a Firebase?
A Firebase é uma plataforma desenvolvida pela Google utilizada para facilitar o desenvolvimento de WebApplications compatíveis com inúmeras plataformas – Unity, Android, JavaScript, Python, Etc… Devido à sua vasta compatibilidade, é uma excelente opção a ter em conta nos seus projetos de eletrónica/domótica.
Atualmente, a Firebase dispões de diversas funcionalidades:
Neste artigo iremos utilizar a Base de Dados em Tempo Real (Realtime Database), que é uma base de dados atualizada em tempo real e, adaptando o nosso último projeto de Sistema de Rega Automático com o Arduino, vamos inserir os dados da temperatura ambiente, humidade ambiente e da humidade do solo da planta na nossa base de dados.
Projeto
- Montagem do Circuito
Vamos interligar todos os componentes anteriormente mencionados, de acordo com o seguinte esquema de ligações:
- Configurar a Realtime Database (Base de Dados em Tempo Real)
Inicialmente, é necessário criar uma conta google. caso não tenha, pode criar aqui. Efetuamos todas as confirmações e preenchemos todos os campos necessários para a criação da mesma.
De seguida, acedemos ao site da Firebase e clicamos em “Ir para o console”.
Criamos um novo projeto, dando-lhe um nome, no nosso caso, “Sistema de Rega Automatico” (o nome do projeto não pode conter caracteres especiais) e desativamos a opção da Google Analytics para este projeto.
Uma vez na consola do projeto, esta disponibiliza diversas opções, ao qual vamos selecionar, do lado esquerdo, a janela “Criação” ,”Base de Dados em Tempo Real”.
Criando o banco de dados, selecionamos o servidor mais conveniente (se viver na Europa, selecione o europe-west1) e inicie no modo de teste.
Acabamos de criar a nossa base de dados! Vamos, de seguida, obter a nossa chave de API e o endereço da mesma.
- Obter a chave da API e o endereço da Database
Nesta parte do processo, vamos precisar de guardar duas credenciais muito importantes: a chave da API e o endereço da nossa base de dados. Este último pode ser encontrado na página anterior, “Realtime Database”. No que toca à chave da API, acedemos a “Criação”, “Autenticação”, “Primeiros Passos”, e, em “Provedores nativos”, escolhemos “Anónimo”.
Ativamos, guardamos e, acedendo às configurações do projeto, retiramos a chave da API.
Por último, resta abrir o Arduino IDE, transferir todas as livrarias necessárias para o projeto, selecionar a correta placa microcontroladora, bem como a sua porta série, e colar o código do projeto.
Biblioteca da Plataforma Firebase
Biblioteca LiquidCrytal_I2C.h
Biblioteca DHT11.h
Acompanhante da Biblioteca DHT11.h
/*Código do Sistema de Rega Automático com Envio dos Dados para a Database Firebase Com o seu sensor de humidade de solo, é capaz de regular o fluxo de água para uma planta No seu display, mostra a humidade do solo, a humidade do ambiente onde está situada a planta bem como a temperatura. Com o botão de pressão, é possível regar a planta manualmente Envia os dados obtidos para a Realtime Database da Firebase www.electrofun.pt/blog/como-utilizar-o-firebase-para-visualizar-dados-de-um-arduino-esp32 Electrofun@2021 ---> www.electrofun.pt */ //Inclusão de livrarias e add-on's #include <LiquidCrystal_I2C.h> #include <DHT.h> #include <Arduino.h> #include <WiFi.h> #include <Firebase_ESP_Client.h> #include "addons/TokenHelper.h" #include "addons/RTDBHelper.h" //Definição de variáveis #define WIFI_SSID "SSID_DA_SUA_REDE" #define WIFI_PASSWORD "PASSWORD_DA_SUA_REDE" #define API_KEY "API_KEY" #define DATABASE_URL "DATABASE_URL" //Definição de pinos #define pinoSensorHumSolo 34 //Conectar o sensor de humidade de solo ao pino GPIO 34 #define pinoSensorTemp 33 //Conectar o sensor de temperatura DHT11 ao pino GPIO 33 #define pinoEletrovalvula 32 //Conectar o relé ao pino GPIO 32 #define pinoRega 14 //Conectar o botão de pressão em configuração pull-up resistor ao pino GPIO 14 LiquidCrystal_I2C lcd(0x27, 20, 4); DHT dht(pinoSensorTemp, DHT11); FirebaseData fbdo; FirebaseAuth auth; FirebaseConfig config; //Variáveis necessárias int valorHumidadeSolo, valorHumidadeSoloPerc, temperaturaAr, humidadeAr; char simbolograu = (char)223; unsigned long sendDataPrevMillis = 0; bool signupOK = false; void setup() { Serial.begin(115200); pinMode(pinoSensorHumSolo, INPUT); pinMode(pinoEletrovalvula, OUTPUT); pinMode(pinoRega, INPUT); //Ligação à Rede Wi-Fi WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.print("A ligar à rede Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(300); } Serial.println(); Serial.print("Conexão bem sucedida. IP: "); Serial.println(WiFi.localIP()); Serial.println(); config.api_key = API_KEY; config.database_url = DATABASE_URL; if (Firebase.signUp(&config, &auth, "", "")) { Serial.println("Acesso à base de dados concedido com sucesso!"); signupOK = true; } else { Serial.printf("%s\n", config.signer.signupError.message.c_str()); } Firebase.begin(&config, &auth); Firebase.reconnectWiFi(true); lcd.init(); lcd.backlight(); dht.begin(); lcd.setCursor(4, 0); lcd.print("Sistema de"); lcd.setCursor(2, 1); lcd.print("Rega Inteligente"); lcd.setCursor(1, 3); lcd.print("By Electrofun@2021"); delay(5000); } void loop() { atualizarInformacoes(); //Atualiza os dados de todos os sensores informacoesIniciais(); //Atualiza o display regaAutomaticaEManual(); //Se a humidade do solo for inferior a um threshold definido, ou se for pressionado o botão de pressão, ligar o relé (electroválvula) para regar a planta atualizarDatabase(); //Função capaz de enviar os dados para a base de dados delay(1000); } void informacoesIniciais() { lcd.clear(); lcd.setCursor(6, 0); lcd.print("STATUS"); lcd.setCursor(0, 1); lcd.print("Temperatura Ar:"); lcd.setCursor(16, 1); lcd.print(temperaturaAr); lcd.print(simbolograu); lcd.setCursor(0, 2); lcd.print("Humidade Ar:"); lcd.setCursor(13, 2); lcd.print(humidadeAr); lcd.print("%"); lcd.setCursor(0, 3); lcd.print("Humidade Solo:"); lcd.setCursor(15, 3); lcd.print(valorHumidadeSoloPerc); lcd.print("%"); } void atualizarInformacoes() { temperaturaAr = dht.readTemperature(); humidadeAr = dht.readHumidity(); valorHumidadeSolo = analogRead(pinoSensorHumSolo); valorHumidadeSoloPerc = map(valorHumidadeSolo, 4095, 1360, 0, 100); } void regaAutomaticaEManual() { if (digitalRead(pinoRega)== 1) { Firebase.RTDB.setFloat(&fbdo, "Valores/Estado Eletroválvula", 1); if (Firebase.RTDB.setFloat(&fbdo, "Valores/Estado Eletroválvula", 1)) { Serial.print("Enviado para: "); Serial.println(fbdo.dataPath()); } else { Serial.println("Não Enviado"); Serial.println("Motivo: " + fbdo.errorReason()); } while (digitalRead(pinoRega)== 1) { digitalWrite(pinoEletrovalvula, HIGH); } Firebase.RTDB.setFloat(&fbdo, "Valores/Estado Eletroválvula", 0); if (Firebase.RTDB.setFloat(&fbdo, "Valores/Estado Eletroválvula", 0)) { Serial.print("Enviado para: "); Serial.println(fbdo.dataPath()); } else { Serial.println("Não Enviado"); Serial.println("Motivo: " + fbdo.errorReason()); } } else if (digitalRead(pinoRega == 0)) { if (valorHumidadeSolo > 2802) { digitalWrite(pinoEletrovalvula, HIGH); Firebase.RTDB.setFloat(&fbdo, "Valores/Estado Eletroválvula", 1); if (Firebase.RTDB.setFloat(&fbdo, "Valores/Estado Eletroválvula", 1)) { Serial.print("Enviado para: "); Serial.println(fbdo.dataPath()); } else { Serial.println("Não Enviado"); Serial.println("Motivo: " + fbdo.errorReason()); } } else if (valorHumidadeSolo <= 2802) { digitalWrite(pinoEletrovalvula, LOW); Firebase.RTDB.setFloat(&fbdo, "Valores/Estado Eletroválvula", 0); if (Firebase.RTDB.setFloat(&fbdo, "Valores/Estado Eletroválvula", 0)) { Serial.print("Enviado para: "); Serial.println(fbdo.dataPath()); } else { Serial.println("Não Enviado"); Serial.println("Motivo: " + fbdo.errorReason()); } } } } } void atualizarDatabase() { if (Firebase.ready() && signupOK && (millis() - sendDataPrevMillis > 7000 || sendDataPrevMillis == 0)) { sendDataPrevMillis = millis(); Firebase.RTDB.setFloat(&fbdo, "Valores/Humidade Ar", humidadeAr); if (Firebase.RTDB.setFloat(&fbdo, "Valores/Humidade Ar", humidadeAr)) { Serial.print("Enviado para: "); Serial.println(fbdo.dataPath()); } else { Serial.println("Não Enviado"); Serial.println("Motivo: " + fbdo.errorReason()); } Firebase.RTDB.setFloat(&fbdo, "Valores/Temperatura Ar", temperaturaAr); if (Firebase.RTDB.setFloat(&fbdo, "Valores/Temperatura Ar", temperaturaAr)) { Serial.print("Enviado para: "); Serial.println(fbdo.dataPath()); } else { Serial.println("Não Enviado"); Serial.println("Motivo: " + fbdo.errorReason()); } Firebase.RTDB.setInt(&fbdo, "Valores/Humidade Solo", valorHumidadeSoloPerc); if (Firebase.RTDB.setInt(&fbdo, "Valores/Humidade Solo", valorHumidadeSoloPerc)) { Serial.print("Enviado para: "); Serial.println(fbdo.dataPath()); } else { Serial.println("Não Enviado"); Serial.println("Motivo: " + fbdo.errorReason()); } } }
Não se esqueçam de ver o nosso vídeo sobre este artigo no nosso canal do YouTube:
Para mais projetos, percorram o nosso blog, onde podem encontrar vários artigos interessantes relacionados com eletrónica, robótica e muito mais! Visitem também o nosso site, onde encontram tudo para eletrónica e robótica!