#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
// =========================
// DEFINIÇÕES
// =========================
#define PINO_DHT 4
#define MODELO_DHT DHT22
#define PINO_RELE 5
#define PINO_POT 35
// =========================
// OBJETOS
// =========================
DHT sensorDHT(PINO_DHT, MODELO_DHT);
LiquidCrystal_I2C display(0x27, 20, 4);
// =========================
// VARIÁVEIS GLOBAIS
// =========================
float tempAtual = 0;
float umidAtual = 0;
float tempDesejada = 0;
int valorPot = 0;
bool estadoRele = false;
// =========================
// FUNÇÕES AUXILIARES
// =========================
void lerPotenciometro() {
valorPot = analogRead(PINO_POT);
tempDesejada = map(valorPot, 0, 4095, 10, 50);
}
void lerSensor() {
tempAtual = sensorDHT.readTemperature();
umidAtual = sensorDHT.readHumidity();
}
void controlarRele() {
if (tempAtual > tempDesejada) {
digitalWrite(PINO_RELE, HIGH);
estadoRele = true;
} else {
digitalWrite(PINO_RELE, LOW);
estadoRele = false;
}
}
void mostrarDisplay() {
display.clear();
display.setCursor(0, 0);
display.print("Temp: ");
display.print(tempAtual, 1);
display.print((char)223);
display.print("C");
display.setCursor(0, 1);
display.print("Set: ");
display.print(tempDesejada, 1);
display.print((char)223);
display.print("C");
display.setCursor(0, 2);
display.print("Umid: ");
display.print(umidAtual, 1);
display.print("%");
display.setCursor(0, 3);
display.print("Rele: ");
display.print(estadoRele ? "ON" : "OFF");
}
void mostrarErro() {
display.clear();
display.setCursor(0, 0);
display.print("Erro no DHT!");
display.setCursor(0, 1);
display.print("Cheque sensor");
}
// =========================
// SETUP
// =========================
void setup() {
Serial.begin(115200);
sensorDHT.begin();
Wire.begin(21, 22);
display.init();
display.backlight();
pinMode(PINO_RELE, OUTPUT);
digitalWrite(PINO_RELE, LOW);
display.setCursor(0, 0);
display.print("Inicializando...");
display.setCursor(0, 1);
display.print("ESP32 + DHT22");
delay(2000);
display.clear();
}
// =========================
// LOOP PRINCIPAL
// =========================
void loop() {
lerPotenciometro();
lerSensor();
if (!isnan(tempAtual) && !isnan(umidAtual)) {
controlarRele();
mostrarDisplay();
Serial.print("Temp: ");
Serial.print(tempAtual);
Serial.print(" | Set: ");
Serial.print(tempDesejada);
Serial.print(" | Umid: ");
Serial.print(umidAtual);
Serial.print(" | Rele: ");
Serial.println(estadoRele ? "ON" : "OFF");
} else {
mostrarErro();
Serial.println("Erro ao ler DHT22!");
}
delay(2000);
}