#include <DHT.h>
#include <LiquidCrystal_I2C.h>
// Definição dos Pinos
#define PINO_DHT 12
#define TIPO_DHT DHT22
#define LED_AZUL 11
#define LED_VERDE 9
#define LED_Vermelho 10
#define LEDB 3
#define LEDG 5
#define LEDR 6
int intervaloLeitura = 2000; //Dois segundos
// Endereço mais comum do LCD I2C: 0x27
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Sensor DHT
DHT dht(PINO_DHT, TIPO_DHT);
// ============= FUNÇÃO CLASSIFICAR TEMPERATURA =================
String classificarTemperatura(float temperatura) {
if (temperatura <= 20) {
return "FRIO";
}
else if (temperatura > 20 && temperatura < 30) {
return "NORMAL";
}
else {
return "QUENTE";
}
}
String classificarUmidade(float umidade) {
if (umidade <= 40) {
return "Seco";
}
else if (umidade > 20 && umidade < 70) {
return "NORMAL";
}
else {
return "Saturado";
}
}
// ================== FUNÇÃO CONTROLE DO LED RGB ==================
void apagarLeds() {
analogWrite(LED_AZUL, 0);
analogWrite(LED_VERDE, 0);
analogWrite(LED_Vermelho, 0);
}
void Dies() {
analogWrite(LEDR, 0);
analogWrite(LEDG, 0);
analogWrite(LEDB, 0);
}
// ================== FUNÇÃO CONTROLE DO LED RGB ==================
void acenderLed(String nivel) {
apagarLeds();
if (nivel == "FRIO") {
analogWrite(LED_AZUL, 255);
}
else if (nivel == "NORMAL") {
analogWrite(LED_VERDE, 255);
}
else if (nivel == "QUENTE") {
analogWrite(LED_Vermelho, 255);
}
}
void acenderLeda(String never) {
Dies();
if (never == "Seco") {
analogWrite(LEDR, 255);
}
else if (never == "NORMAL") {
analogWrite(LEDG, 255);
}
else if (never == "Saturado") {
analogWrite(LEDB, 255);
}
}
// ================== VOID SETUP ==================
void setup() {
Serial.begin(9600);
pinMode(LED_AZUL, OUTPUT);
pinMode(LED_VERDE, OUTPUT);
pinMode(LED_Vermelho, OUTPUT);
pinMode(LEDR, OUTPUT);
pinMode(LEDG, OUTPUT);
pinMode(LEDB, OUTPUT);
dht.begin();
// ================ Inicializa LCD ================
lcd.init();
lcd.backlight();
//================= Tela inicial ==================
lcd.setCursor(0, 0);
lcd.print("Monitoramento");
lcd.setCursor(0, 1);
lcd.print("Temperatura");
delay(2000);
lcd.clear();
Serial.println("=== MONITORAMENTO ===");
}
// ================== LOOP PRINCIPAL ==================
void loop() {
float temperatura = dht.readTemperature();
float umidade = dht.readHumidity();
//================== Verifica erro ==================
if (isnan(temperatura) || isnan(umidade)) {
Serial.println("Erro no DHT22");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Erro Sensor");
delay(intervaloLeitura);
return;
}
// ================ Classificão da temperatura
String nivel = classificarTemperatura(temperatura);
String never = classificarUmidade(umidade);
// Acende LED correto de acordo com o nível de temperatura
acenderLed(nivel);
acenderLeda(never);
// ============ MOSTRA NO MONITOR SERIAL ==================
Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.println(" C");
Serial.print("Umidade: ");
Serial.print(umidade);
Serial.println(" %");
Serial.print("Nivel de Tempetatura: ");
Serial.println(nivel);
Serial.print("Nivel de Umidade: ");
Serial.println(never);
Serial.println("----------------------");
// ============ MOSTRAR NO LCD 16x2 ==============
lcd.clear();
// Primeira linha
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temperatura);
lcd.print((char)223); // símbolo °
lcd.print("C ");
lcd.print(nivel);
// Segunda linha
lcd.setCursor(0, 1);
lcd.print("U:");
lcd.print(umidade);
lcd.print("% ");
lcd.print(never);
// Aguarda próxima leitura
delay(intervaloLeitura);
}