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:

Funções Disponíveis

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!