#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Configuração do display LCD 20x4 I2C
LiquidCrystal_I2C lcd(0x27, 20, 4); // Endereço 0x27 para displays I2C
// Definição dos pinos
const int sensorUmidade1 = A1;
const int sensorUmidade2 = A2;
const int sensorUmidade3 = A3;
const int rele1 = 2;
const int rele2 = 3;
const int rele3 = 4;
const int Btn_Menu = 13;
const int Btn_Up = 12;
const int Btn_Down = 11;
const int Btn_Enter = 10;
// Limiares independentes para a ativação da irrigação
int limiteUmidade1 = 200; // Limite para o sensor 1
int limiteUmidade2 = 300; // Limite para o sensor 2
int limiteUmidade3 = 500; // Limite para o sensor 3
// Variáveis para controle de exibição
unsigned long tempoAnterior = 0;
const long intervalo = 2000; // Intervalo de troca de mensagens (2 segundos)
int zonaAtual = 0; // Controla qual zona está sendo exibida
// Variáveis para controle de depuração dos botões
bool btnMenuPrevState = HIGH;
bool btnUpPrevState = HIGH;
bool btnDownPrevState = HIGH;
bool btnEnterPrevState = HIGH;
// Variáveis para controle de depuração dos sensores
int umidade1Prev = -1;
int umidade2Prev = -1;
int umidade3Prev = -1;
void setup() {
// Inicialização do display LCD
lcd.begin(20, 4); // Definindo 20 colunas e 4 linhas
lcd.backlight(); // Ligando a luz de fundo do display
// Inicialização dos relés
pinMode(rele1, OUTPUT);
pinMode(rele2, OUTPUT);
pinMode(rele3, OUTPUT);
// Inicialização dos sensores
pinMode(sensorUmidade1, INPUT);
pinMode(sensorUmidade2, INPUT);
pinMode(sensorUmidade3, INPUT);
// Inicialização dos botões
pinMode(Btn_Menu, INPUT_PULLUP);
pinMode(Btn_Up, INPUT_PULLUP);
pinMode(Btn_Down, INPUT_PULLUP);
pinMode(Btn_Enter, INPUT_PULLUP);
// Inicialização da comunicação Serial
Serial.begin(9600);
// Mensagem inicial no display
lcd.setCursor(0, 0);
lcd.print("Sistema de Irrigacao");
lcd.setCursor(0, 2);
lcd.print("v 1.1.5");
lcd.setCursor(0, 1);
lcd.print("Inicializando.");
delay(600);
lcd.setCursor(0, 1);
lcd.print("Inicializando..");
delay(600);
lcd.setCursor(0, 1);
lcd.print("Inicializando...");
delay(600);
lcd.setCursor(0, 1);
lcd.print("Inicializando....");
delay(600);
lcd.setCursor(0, 1);
lcd.print("Inicializando.....");
delay(1000);
lcd.clear();
}
void loop() {
// Leitura dos sensores
int umidade1 = analogRead(sensorUmidade1);
int umidade2 = analogRead(sensorUmidade2);
int umidade3 = analogRead(sensorUmidade3);
// Controle dos relés com limiares independentes
bool irrigandoZona1 = umidade1 < limiteUmidade1;
bool irrigandoZona2 = umidade2 < limiteUmidade2;
bool irrigandoZona3 = umidade3 < limiteUmidade3;
digitalWrite(rele1, irrigandoZona1 ? HIGH : LOW);
digitalWrite(rele2, irrigandoZona2 ? HIGH : LOW);
digitalWrite(rele3, irrigandoZona3 ? HIGH : LOW);
// Leitura do estado dos botões
bool btnMenuState = digitalRead(Btn_Menu) == LOW; // Botão pressionado
bool btnUpState = digitalRead(Btn_Up) == LOW; // Botão pressionado
bool btnDownState = digitalRead(Btn_Down) == LOW; // Botão pressionado
bool btnEnterState = digitalRead(Btn_Enter) == LOW; // Botão pressionado
// Atualiza a tela LCD intercalando as zonas
unsigned long tempoAtual = millis();
if (tempoAtual - tempoAnterior >= intervalo) {
tempoAnterior = tempoAtual;
zonaAtual++;
if (zonaAtual > 3) zonaAtual = 1; // Volta para a zona 1
//lcd.clear(); mudei para msg inicial do display.
lcd.setCursor(0, 0);
lcd.print("Umidade1: ");
lcd.print(umidade1);
lcd.setCursor(0, 1);
lcd.print("Umidade2: ");
lcd.print(umidade2);
lcd.setCursor(0, 2);
lcd.print("Umidade3: ");
lcd.print(umidade3);
// Exibe a mensagem de irrigação na quarta linha, intercalando zonas
lcd.setCursor(0, 3);
if (irrigandoZona1 && zonaAtual == 1) {
lcd.print("Irrigando Zona 1...");
} else if (irrigandoZona2 && zonaAtual == 2) {
lcd.print("Irrigando Zona 2...");
} else if (irrigandoZona3 && zonaAtual == 3) {
lcd.print("Irrigando Zona 3...");
} else {
lcd.print(" "); // Limpa a linha se nenhuma zona está irrigando
}
}
// Imprime o estado dos botões apenas quando mudam de estado
if (btnMenuState != btnMenuPrevState) {
if (btnMenuState == LOW) {
Serial.println("Btn_Menu Pressed");
}
btnMenuPrevState = btnMenuState;
}
if (btnUpState != btnUpPrevState) {
if (btnUpState == LOW) {
Serial.println("Btn_Up Pressed");
}
btnUpPrevState = btnUpState;
}
if (btnDownState != btnDownPrevState) {
if (btnDownState == LOW) {
Serial.println("Btn_Down Pressed");
}
btnDownPrevState = btnDownState;
}
if (btnEnterState != btnEnterPrevState) {
if (btnEnterState == LOW) {
Serial.println("Btn_Enter Pressed");
}
btnEnterPrevState = btnEnterState;
}
// Imprime o valor dos sensores apenas quando mudam
if (umidade1 != umidade1Prev) {
Serial.print("Umidade1: ");
Serial.println(umidade1);
umidade1Prev = umidade1;
}
if (umidade2 != umidade2Prev) {
Serial.print("Umidade2: ");
Serial.println(umidade2);
umidade2Prev = umidade2;
}
if (umidade3 != umidade3Prev) {
Serial.print("Umidade3: ");
Serial.println(umidade3);
umidade3Prev = umidade3;
}
delay(100); // Pequena pausa para garantir que a troca de mensagens funcione corretamente
}