#include <DHT.h>
#include <Wire.h>
#include <HCSR04.h>
// Definições de pinos e constantes
#define DHTPIN 33
#define DHTTYPE DHT22
#define AQUECIMENTO 15
#define VENTOINHA 2
#define BOMBA1 4
#define BOMBA2 0
#define CAPACITOR 32
// Limiares ajustáveis
const float TEMP_MIN = 22.0;
const float TEMP_MAX = 28.0;
const float UMIDADE_SOLO_MIN = 40.0;
const float UMIDADE_SOLO_MAX = 60.0;
const float NIVEL_AGUA_MIN = 5.0; // cm
// Inicializa o sensor ultrassônico nos pinos TRIG e ECHO
UltraSonicDistanceSensor distanceSensor(35, 34); // TRIG = 35, ECHO = 34
DHT dht(DHTPIN, DHTTYPE);
// Função para iniciar o hardware
void iniciarHardware() {
pinMode(AQUECIMENTO, OUTPUT);
pinMode(VENTOINHA, OUTPUT);
pinMode(BOMBA1, OUTPUT);
pinMode(BOMBA2, OUTPUT);
pinMode(CAPACITOR, OUTPUT);
Serial.begin(9600); // Adicionado para monitoramento pelo Serial
dht.begin();
}
// Função para leitura dos sensores
void lerSensores(float &temperatura, float &umidade, float &umidadeSolo, float &waterLevel)
{
temperatura = dht.readTemperature();
umidade = dht.readHumidity();
// Verificação para capturar falha de leitura no sensor DHT
if (isnan(temperatura) || isnan(umidade)) {
Serial.println("Falha ao ler o sensor DHT!");
return; // Abandona a leitura atual, evita erros nos cálculos
}
// Leitura e mapeamento da umidade do solo
umidadeSolo = analogRead(CAPACITOR);
umidadeSolo = map(umidadeSolo, 0, 4095, 0, 100); // Converte para porcentagem
// Cálculo do nível de água em cm
waterLevel = 20 - distanceSensor.measureDistanceCm();
// Exibe os valores lidos no monitor Serial
Serial.print("Temperatura: "); Serial.println(temperatura);
Serial.print("Umidade: "); Serial.println(umidade);
Serial.print("Umidade Solo: "); Serial.println(umidadeSolo);
Serial.print("Nível de Água: "); Serial.println(waterLevel);
}
// 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) {
// Verifica se há água suficiente antes de ligar a bomba de irrigação
if (umidadeSolo < UMIDADE_SOLO_MIN && waterLevel >= NIVEL_AGUA_MIN) {
digitalWrite(BOMBA2, HIGH);
} else {
digitalWrite(BOMBA2, LOW);
}
if (waterLevel < NIVEL_AGUA_MIN) {
digitalWrite(BOMBA1, HIGH);
} else {
digitalWrite(BOMBA1, LOW);
}
}
// Função principal
void setup() {
iniciarHardware();
}
void loop() {
float temperatura, umidade, umidadeSolo, waterLevel;
lerSensores(temperatura, umidade, umidadeSolo, waterLevel);
controlarTemperatura(temperatura);
controlarIrrigacao(umidadeSolo, waterLevel);
delay(2000); // Delay para evitar leituras muito rápidas
}