#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <HCSR04.h> // Biblioteca para o sensor ultrassônico HC-SR04
// Definições de pinos e constantes
#define DHTPIN 4
#define DHTTYPE DHT22
#define AQUECIMENTO 16
#define VENTOINHA 26
#define BOMBA1 25
#define BOMBA2 2
#define CAPACITOR 14
#define LCD 0x27
// Limiares ajustáveis
const float TEMP_MIN = 22.0;
const float TEMP_MAX = 28.0;
const float UMIDADE_SOLO_LIMIAR = 60.0;
const float NIVEL_AGUA_MIN = 10.0; // cm
// Inicializa o sensor ultrassônico nos pinos TRIG e ECHO
UltraSonicDistanceSensor distanceSensor(35, 34); // TRIG = 35, ECHO = 34
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(LCD, 16, 2);
// Função para iniciar o hardware
void iniciarHardware() {
pinMode(AQUECIMENTO, OUTPUT);
pinMode(VENTOINHA, OUTPUT);
pinMode(BOMBA1, OUTPUT);
pinMode(BOMBA2, OUTPUT);
pinMode(CAPACITOR, OUTPUT);
lcd.begin(16, 2);
lcd.print("Inicializando...");
dht.begin();
}
// Função para leitura dos sensores
void lerSensores(float &temperatura, float &umidade, float &umidadeSolo, float &waterLevel) {
temperatura = dht.readTemperature();
umidade = dht.readHumidity();
umidadeSolo = analogRead(CAPACITOR);
waterLevel = 20 - distanceSensor.measureDistanceCm();
}
// Função para mostrar dados no LCD
void mostrarLCD(float temperatura, float waterLevel) {
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperatura);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Nivel: ");
lcd.print(waterLevel);
lcd.print("cm");
}
// Função para controle de temperatura
void controlarTemperatura(float temperatura) {
if (temperatura < TEMP_MIN) {
digitalWrite(AQUECIMENTO, HIGH);
digitalWrite(VENTOINHA, LOW);
} else if (temperatura > TEMP_MAX) {
digitalWrite(AQUECIMENTO, LOW);
digitalWrite(VENTOINHA, HIGH);
} else {
digitalWrite(AQUECIMENTO, LOW);
digitalWrite(VENTOINHA, LOW);
}
}
// Função para controle de irrigação
void controlarIrrigacao(float umidadeSolo, float waterLevel) {
if (umidadeSolo < UMIDADE_SOLO_LIMIAR) {
digitalWrite(BOMBA1, HIGH);
} else {
digitalWrite(BOMBA1, LOW);
}
if (waterLevel < NIVEL_AGUA_MIN) {
digitalWrite(BOMBA2, HIGH);
} else {
digitalWrite(BOMBA2, LOW);
}
}
// Função principal
void setup() {
iniciarHardware();
}
void loop() {
float temperatura, umidade, umidadeSolo, waterLevel;
lerSensores(temperatura, umidade, umidadeSolo, waterLevel);
mostrarLCD(temperatura, waterLevel);
controlarTemperatura(temperatura);
controlarIrrigacao(umidadeSolo, waterLevel);
delay(2000); // Delay para evitar leituras muito rápidas
}