#include <DHT.h>
#include <DHT_U.h>
#include <LiquidCrystal_I2C.h>
#define bomb_agua 2
#define ven_entrada 3
#define ven_saida 4
#define lampada 5
#define umidificador 6
#define grau 30
// Defina quantas horas a lâmpada deve ficar ligada em um período de 24 horas
int horasLigado = 12; // Ajuste este valor conforme necessário (1 a 23)
// Calcula o intervalo de tempo em milissegundos
unsigned long intervaloLigado = horasLigado * 60UL * 60UL * 1000UL;
unsigned long intervaloDesligado = (24 - horasLigado) * 60UL * 60UL * 1000UL;
// Definição de caracteres personalizados para o LCD
byte a[8] = {B00110, B01001, B00110, B00000, B00000, B00000, B00000, B00000};
// Variável para armazenar o tempo do último ciclo
unsigned long ultimoCiclo = millis(); // Inicializa com millis() para iniciar ligado
// Variável para armazenar o estado atual
bool estadoLampada = true; // Inicializa como true para iniciar ligado
LiquidCrystal_I2C lcd(0x27, 20, 4); // Endereço I2C 0x27, 20 colunas e 4 linhas
// Define o pino do sensor DHT e o tipo de sensor
DHT dht(7, DHT22);
void setup() {
// Inicializa o sensor DHT
dht.begin();
// Inicializa a comunicação serial a 9600 bps
Serial.begin(9600);
// Inicializa o LCD
lcd.init();
lcd.backlight();
lcd.clear();
// Inicializa as saídas
pinMode(bomb_agua, OUTPUT);
pinMode(ven_entrada, OUTPUT);
pinMode(ven_saida, OUTPUT);
pinMode(lampada, OUTPUT);
pinMode(umidificador, OUTPUT);
// Define caracteres personalizados no LCD
lcd.createChar(0, a);
// Inicializa a lâmpada no estado ligado
digitalWrite(lampada, HIGH);
}
void loop() {
// Lê a temperatura do sensor DHT22
float temp = dht.readTemperature();
// Lê a umidade do sensor DHT22
float umid = dht.readHumidity();
// Verifica se houve erro ao ler o sensor DHT
if (isnan(temp) || isnan(umid)) {
lcd.setCursor(0, 0);
lcd.print("Erro no sensor.");
lcd.setCursor(0, 1);
lcd.print("Confira o DHT");
delay(3000);
}
// Obtém o tempo atual
unsigned long tempoAtual = millis();
// Verifica se o estado da lâmpada é ligado e o tempo ligado já passou
if (estadoLampada && (tempoAtual - ultimoCiclo >= intervaloLigado)) {
// Desliga a lâmpada
estadoLampada = false;
digitalWrite(lampada, LOW);
// Atualiza o tempo do último ciclo
ultimoCiclo = tempoAtual;
// Imprime o estado atual da lâmpada no monitor serial
Serial.println("Lâmpada desligada");
}
// Verifica se o estado da lâmpada é desligado e o tempo desligado já passou
else if (!estadoLampada && (tempoAtual - ultimoCiclo >= intervaloDesligado)) {
// Liga a lâmpada
estadoLampada = true;
digitalWrite(lampada, HIGH);
// Atualiza o tempo do último ciclo
ultimoCiclo = tempoAtual;
lcd.setCursor(0, 0);
// Imprime o estado atual da lâmpada no monitor serial
Serial.println("Lâmpada ligada");
}
// Limpa a tela do LCD
lcd.clear();
// Tranforma o valor da porta (A0) 1023.0 em sensor_solo
int sensor_solo = (analogRead(A0) / 10.23); // Correção no cálculo para porcentagem
// Exibe a umidade do solo no LCD
lcd.setCursor(0, 0);
lcd.print("Umid SO: ");
lcd.print(sensor_solo);
lcd.print("%");
// Exibe a umidade do ar no LCD
lcd.setCursor(0, 1);
lcd.print("Umid AR: ");
lcd.print(umid);
lcd.print("%");
// Exibe a temperatura do ar no LCD
lcd.setCursor(0, 2);
lcd.print("Temp AR: ");
lcd.print(temp);
lcd.write(0); // Escreve o símbolo de grau
lcd.print("C");
delay(3000);
lcd.clear();
// Verifica se a temperatura está acima de 30 ºC e controla os ventiladores
if (temp >= grau) {
lcd.setCursor(0, 0);
lcd.print("Ventiladores:");
lcd.setCursor(0, 1);
lcd.print("Entrada [LIG]");
digitalWrite(ven_entrada, HIGH);
lcd.setCursor(0, 2);
lcd.print("Saida [LIG]");
digitalWrite(ven_saida, HIGH);
} else {
lcd.setCursor(0, 0);
lcd.print("Ventiladores:");
lcd.setCursor(0, 1);
lcd.print("Entrada [DES]");
digitalWrite(ven_entrada, LOW);
lcd.setCursor(0, 2);
lcd.print("Saida [DES]");
digitalWrite(ven_saida, LOW);
}
delay(3000);
lcd.clear();
// Verifica se o valor do sensor de umidade do solo está dentro do especificado e liga a bomba de água
if (sensor_solo <= 30) {
lcd.setCursor(0, 0);
lcd.print("Bomba de agua [LIG]");
digitalWrite(bomb_agua, HIGH);
} else {
digitalWrite(bomb_agua, LOW);
}
// Verifica se a umidade está acima de 30%, caso contrário, liga o umidificador de ar
if (umid <= 30) {
lcd.setCursor(0, 1);
lcd.print("Umidificador [LIG]");
digitalWrite(umidificador, HIGH);
} else {
digitalWrite(umidificador, LOW);
}
// Aguarda 1 segundo antes de fazer a próxima leitura
delay(2000);
}