#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DHT_PIN 2
#define DHT_TYPE DHT22
#define LED_AZUL 3
#define LED_VERMELHO 4
DHT dht(DHT_PIN, DHT_TYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
int temperaturaMinima = 20;
int temperaturaMaxima = 25;
void setup() {
Serial.begin(9600);
dht.begin();
lcd.init();
lcd.backlight();
pinMode(LED_AZUL, OUTPUT);
pinMode(LED_VERMELHO, OUTPUT);
digitalWrite(LED_AZUL, LOW);
digitalWrite(LED_VERMELHO, LOW);
lcd.setCursor(0, 0);
lcd.print("Climatizacao");
lcd.setCursor(0, 1);
lcd.print("Automatico");
delay(2000);
lcd.clear();
Serial.println("=== SISTEMA DE CLIMATIZACAO ===");
Serial.println("Configuracao inicial:");
Serial.println("Minimo: 20 C");
Serial.println("Maximo: 25 C");
Serial.println();
Serial.println("Para alterar:");
Serial.println("Digite MIN seguido da temperatura");
Serial.println("Exemplo: MIN 20");
Serial.println("Digite MAX seguido da temperatura");
Serial.println("Exemplo: MAX 25");
}
void loop() {
// Verifica se foi digitado algo no Monitor Serial
if (Serial.available() > 0) {
String comando = Serial.readStringUntil('\n');
comando.trim();
processarComando(comando);
}
float temperatura = dht.readTemperature();
if (isnan(temperatura)) {
Serial.println("Erro ao ler o sensor DHT22!");
delay(2000);
return;
}
// =========================
// CONTROLE DA TEMPERATURA
// =========================
if (temperatura > temperaturaMaxima) {
// Muito quente
digitalWrite(LED_AZUL, HIGH);
digitalWrite(LED_VERMELHO, LOW);
mostrarLCD(temperatura, "VENTILACAO");
} else if (temperatura < temperaturaMinima) {
// Muito frio
digitalWrite(LED_AZUL, LOW);
digitalWrite(LED_VERMELHO, HIGH);
mostrarLCD(temperatura, "AQUECIMENTO");
} else {
// Temperatura confortável
digitalWrite(LED_AZUL, LOW);
digitalWrite(LED_VERMELHO, LOW);
mostrarLCD(temperatura, "CONFORTAVEL");
}
// Monitor Serial
Serial.print("Temperatura: ");
Serial.print(temperatura, 1);
Serial.print(" C | Min: ");
Serial.print(temperaturaMinima);
Serial.print(" C | Max: ");
Serial.print(temperaturaMaxima);
Serial.print(" C | Status: ");
if (temperatura > temperaturaMaxima) {
Serial.println("VENTILACAO ON");
}
else if (temperatura < temperaturaMinima) {
Serial.println("AQUECIMENTO ON");
}
else {
Serial.println("CONFORTAVEL");
}
delay(2000);
}
// ========================================
// FUNÇÃO PARA MOSTRAR INFORMAÇÕES NO LCD
// ========================================
void mostrarLCD(float temperatura, String status) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperatura, 1);
lcd.write(223);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print(status);
}
// ========================================
// FUNÇÃO PARA CONFIGURAR MIN E MAX
// ========================================
void processarComando(String comando) {
comando.toUpperCase();
// -------------------------
// TEMPERATURA MINIMA
// -------------------------
if (comando.startsWith("MIN")) {
int valor = comando.substring(3).toInt();
if (valor < 10 || valor > 30) {
Serial.println("ERRO: temperatura minima deve estar entre 10 e 30 C.");
}
else if (valor >= temperaturaMaxima) {
Serial.println("ERRO: temperatura minima deve ser menor que a maxima.");
}
else {
temperaturaMinima = valor;
Serial.print("Temperatura minima configurada para ");
Serial.print(temperaturaMinima);
Serial.println(" C.");
}
}
// -------------------------
// TEMPERATURA MAXIMA
// -------------------------
else if (comando.startsWith("MAX")) {
int valor = comando.substring(3).toInt();
if (valor < 10 || valor > 30) {
Serial.println("ERRO: temperatura maxima deve estar entre 10 e 30 C.");
}
else if (valor <= temperaturaMinima) {
Serial.println("ERRO: temperatura maxima deve ser maior que a minima.");
}
else {
temperaturaMaxima = valor;
Serial.print("Temperatura maxima configurada para ");
Serial.print(temperaturaMaxima);
Serial.println(" C.");
}
}
else {
Serial.println("Comando invalido.");
Serial.println("Use: MIN 20 ou MAX 25");
}
}