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!
Comments
Comentários