Sistema de Rega Automático com o Arduino

No nosso último artigo de projetos, exploramos o módulo TEA5767 construindo um Rádio FM com o Arduino (podem ver o nosso vídeo no YouTube aqui), e pedimos sugestões para novos projetos a trazer ao nosso canal. A pedido de um subscritor, vamos, neste artigo, criar um sistema de rega inteligente, capaz de tratar das nossas plantas de forma autónoma, capaz de medir a humidade do solo e ajustar, através de um relé ligado a uma electroválvula, o fluxo de água para a mesma.

Para recriar todo este incrível projeto, vai precisar dos seguintes componentes:

Imagem Produto Comprar
Arduino (Nano)

Display LCD 20×4 I2C

Breadboard 400 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

Montagem do Circuito

Vamos interligar todos os componentes anteriormente mencionados, de acordo com o seguinte esquema de ligações:

Preparação do Ambiente e Envio do Código

Vamos começar por transferir as bibliotecas necessárias para o projeto, assim:
Biblioteca LiquidCrytal_I2C.h
Biblioteca DHT11.h
Acompanhante da Biblioteca DHT11.h

De seguida, vamos aceder ao Arduino IDE e instalar as bibliotecas necessárias, acedendo a “Rascunho” -> “Incluir Biblioteca” -> “Adicionar Biblioteca .ZIP” e selecionando, um por um, os ficheiros .ZIP transferidos.

Após selecionar a respetiva placa microcontroladora a utilizar, basta compilar e carregar o seguinte código:

/*Código do Sistema de Rega Automático
 * 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
 * www.electrofun.pt/blog/sistema-de-rega-automatico-com-o-arduino
 * Electrofun@2021 ---> www.electrofun.pt
 */

//Inclusão de livrarias
#include <LiquidCrystal_I2C.h>
#include <DHT.h>

//Definição de pinos
#define pinoSensorHumSolo A0 //Conectar o sensor de humidade de solo ao pino A0
#define pinoSensorTemp 6  //Conectar o sensor de temperatura DHT11 ao pino 6
#define pinoEletrovalvula 7 //Conectar o relé ao pino 7
#define pinoRegaAutomatica 2  //Conectar o botão de pressão em configuração pull-up resistor ao pino 2

LiquidCrystal_I2C lcd(0x27, 20, 4);
DHT dht(pinoSensorTemp, DHT11);

//Variáveis necessárias
int valorHumidadeSolo, valorHumidadeSoloPerc, temperaturaAr, humidadeAr;
char simbolograu = (char)223;

void setup() {
  pinMode(pinoSensorHumSolo, INPUT);
  pinMode(pinoEletrovalvula, OUTPUT);
  pinMode(pinoRegaAutomatica, INPUT);
  attachInterrupt(digitalPinToInterrupt(pinoRegaAutomatica), regaAutomaticaBotoes, RISING);
  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
  regaAutomatica(); //Se a humidade do solo for inferior a um threshold definido, ligar o relé (electroválvula) para regar a planta
  delay(500);
}


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, 1023, 0, 0, 100);
}

void regaAutomatica() {
  if (valorHumidadeSolo > 700) {
    digitalWrite(pinoEletrovalvula, HIGH);
  } else if (valorHumidadeSolo <= 700) { digitalWrite(pinoEletrovalvula, LOW); } } 
//Interrupção para rega manual 
void regaAutomaticaBotoes() { 
  long tempo_ultima_int = 0; 
  long tempo_int = millis(); 
  //Código para debounce 
  if (tempo_int - tempo_ultima_int > 200)
    {
      while (digitalRead(pinoRegaAutomatica) == 1) {
      digitalWrite(pinoEletrovalvula, HIGH);
    }
  }
  tempo_ultima_int = tempo_int;
}

Resta, por último, testar o funcionamento e nunca mais nos preocuparmos com as nossas plantas!

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!