REGUE AS PLANTAS FORA DE CASA! SISTEMA DE REGA INTELIGENTE com ESP32!

Nos últimos projetos, desenvolvemos um Sistema de Rega Inteligente com o Arduino e, recentemente, um Sistema de Rega Inteligente com o Envio de Dados para uma Base de Dados. Vamos, neste artigo, criar um sistema de rega com controlo remoto através de outra placa microcontroladora ESP32.

Para acompanhar este tutorial irá necessitar dos seguintes artigos:

Imagem Produto Comprar
2 ESP32 (NodeMCU)

2 Display’s LCD 20×4 I2C

2 Breadboard’s 830 Pinos

Módulo Relé 5V 1 Canal

Sensor de Humidade do Solo

2 Botões de Pressão

2 Resistências 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 os nossos últimos projetos de Sistema de Rega Automático com o Arduino e Sistema de Rega Inteligente com o Envio de Dados para uma Base de Dados, vamos inserir os dados da temperatura ambiente, humidade ambiente e da humidade do solo da planta na nossa base de dados e, efetuando a leitura dos mesmos dados noutra ESP32, permitir ver remotamente a humidade do solo e controlar a eletroválvula de rega!

 

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

Master

/*Código (MASTER) do Sistema de Rega Inteligente com Controlo Remoto
   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 e permite ser controlada remotamente
   www.electrofun.pt/blog/regue-as-plantas-fora-de-casa-sistema-de-rega-inteligente-com-esp32
   Electrofun@2022 ---> 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"
#define WIFI_PASSWORD "PASSWORD"
#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 2  //Conectar o botão de pressão em configuração pull-up resistor ao pino GPIO 2

LiquidCrystal_I2C lcd(0x27, 20, 4);
DHT dht(pinoSensorTemp, DHT11);
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;

//Variáveis necessárias
int humidadeSolo, humidadeSoloPerc, temperaturaAr, humidadeAr;
int humidadeSoloAnt, humidadeSoloPercAnt, temperaturaArAnt, humidadeArAnt;
long tempo = 0;
char simbolograu = (char)223;
bool signupOK = false;
bool estadoEletrovalvulaMaster, estadoEletrovalvulaSlave;

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(9, 2);
  lcd.print("V2");
  lcd.setCursor(1, 3);
  lcd.print("By Electrofun@2022");
  delay(5000);
}

void loop() {
  if (millis() - tempo > 7000 || tempo == 0) {
    tempo = millis();
    temperaturaAr = dht.readTemperature();
    humidadeAr = dht.readHumidity();
    humidadeSolo = analogRead(pinoSensorHumSolo);
    humidadeSoloPerc = map(humidadeSolo, 4095, 1360, 0, 100);
  }
  int leituraPinoRega = digitalRead(pinoRega);
  if (leituraPinoRega == 0) {
    estadoEletrovalvulaMaster = 0;
    if (Firebase.RTDB.getBool(&fbdo, "Valores/Estado Eletroválvula Slave")) {
      estadoEletrovalvulaSlave = fbdo.boolData();
    }
  } else if (leituraPinoRega == 1) {
    estadoEletrovalvulaMaster = 1;
  }
  if (estadoEletrovalvulaMaster == 1 || estadoEletrovalvulaSlave == 1) {
    Firebase.RTDB.setBool(&fbdo, "Valores/Estado Eletroválvula Master", 1);
    long loopDelay = millis();
    while (millis() - loopDelay < 10000) {
      digitalWrite(pinoEletrovalvula, HIGH);
    }
    digitalWrite(pinoEletrovalvula, LOW);
    Firebase.RTDB.setBool(&fbdo, "Valores/Estado Eletroválvula Master", 0);
  }
  if (temperaturaAr != temperaturaArAnt || humidadeAr != humidadeArAnt || humidadeSolo != humidadeSoloAnt) {
    temperaturaArAnt = temperaturaAr;
    humidadeArAnt = humidadeAr;
    humidadeSoloAnt = humidadeSolo;
    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(humidadeSoloPerc);
    lcd.print("%");
    Firebase.RTDB.setInt(&fbdo, "Valores/Temperatura Ar", temperaturaAr);
    Firebase.RTDB.setInt(&fbdo, "Valores/Humidade Ar", humidadeAr);
    Firebase.RTDB.setInt(&fbdo, "Valores/Humidade Solo", humidadeSoloPerc);
  }
}

Slave

/*Código (SLAVE) do Sistema de Rega Inteligente com Controlo Remoto
   No seu display, mostra a humidade do solo e o estado da eletroválvula de rega
   Com o botão de pressão, é possível regar a planta manualmente
   Envia os dados obtidos para a Realtime Database da Firebase e permite controlar remotamente
   www.electrofun.pt/blog/regue-as-plantas-fora-de-casa-sistema-de-rega-inteligente-com-esp32
   Electrofun@2022 ---> 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"
#define WIFI_PASSWORD "PASSWORD"
#define API_KEY "API_KEY"
#define DATABASE_URL "DATABASE_URL"

//Definição de pinos
#define pinoBotao 19 //Conectar o botão de pressão em configuração pull-up resistor ao pino GPIO 19

LiquidCrystal_I2C lcd(0x27, 20, 4);
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;

//Variáveis necessárias
int humidadeSoloPerc, humidadeSoloPercAnt;
int fTR = 1;
long tempoEspera = 0;
bool signupOK = false;
bool estadoBotaoAnt = 0;
bool estadoBotao, estadoEletrovalvulaMaster, estadoEletrovalvulaMasterAnt , estadoEletrovalvulaSlave;

void setup() {
  pinMode(pinoBotao, INPUT);
  Serial.begin(115200);
  //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();
  lcd.setCursor(4, 0);
  lcd.print("Sistema de");
  lcd.setCursor(2, 1);
  lcd.print("Rega Inteligente");
  lcd.setCursor(9, 2);
  lcd.print("V2");
  lcd.setCursor(1, 3);
  lcd.print("By Electrofun@2022");
  delay(5000);
  lcd.clear();
}

void loop() {
  if (Firebase.ready() && signupOK && (millis() - tempoEspera > 7000 || tempoEspera == 0)) {
    tempoEspera = millis();
    if (Firebase.RTDB.getInt(&fbdo, "Valores/Humidade Solo")) {
      humidadeSoloPerc = fbdo.floatData();
    }

    if (Firebase.RTDB.getBool(&fbdo, "Valores/Estado Eletroválvula Master")) {
      estadoEletrovalvulaMaster = fbdo.boolData();
    }
  }
  estadoBotao = digitalRead(pinoBotao);
  if (estadoBotaoAnt != estadoBotao || fTR == 1) {
    fTR = 2;
    estadoBotaoAnt = estadoBotao;
    if (estadoBotao == 1) {
      estadoEletrovalvulaSlave == 1;
      Firebase.RTDB.setBool(&fbdo, "Valores/Estado Eletroválvula Slave", 1);
    } else if (estadoBotao == 0) {
      estadoEletrovalvulaSlave == 0;
      Firebase.RTDB.setBool(&fbdo, "Valores/Estado Eletroválvula Slave", 0);
    }
  }
  if (humidadeSoloPerc != humidadeSoloPercAnt || estadoEletrovalvulaMasterAnt != estadoEletrovalvulaMaster) {
    humidadeSoloPercAnt = humidadeSoloPerc;
    estadoEletrovalvulaMasterAnt = estadoEletrovalvulaMaster;
    lcd.clear();
    lcd.setCursor(6, 0);
    lcd.print("STATUS");
    lcd.setCursor(0, 1);
    lcd.print("Estado Eletrovalvula");
    lcd.setCursor(0, 2);
    if (estadoEletrovalvulaSlave == 1 || estadoEletrovalvulaMaster == 1) {
      lcd.print("Ligada");
    } else {
      lcd.print("Desligada");
    }
    lcd.setCursor(0, 3);
    lcd.print("Humidade Solo:");
    lcd.setCursor(15, 3);
    lcd.print(humidadeSoloPerc);
    lcd.print("%");
  }
}

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!