#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// Inicializa o LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pinos
#define PIN_LDR 33
#define PIN_DHT 5
#define PIN_LED_LUZ 2
#define PIN_LED_TMP 15
#define PIN_BUZZER 4
// Limites
#define LIMITE_LUZ 40
#define LIMITE_TEMP 28.0
// Inicializa o DHT22
DHT dht(PIN_DHT, DHT22);
void setup() {
Serial.begin(115200);
pinMode(PIN_LED_LUZ, OUTPUT);
pinMode(PIN_LED_TMP, OUTPUT);
pinMode(PIN_BUZZER, OUTPUT);
dht.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Iniciando...");
delay(2000);
lcd.clear();
}
void loop() {
// Leitura do LDR
int leituraBruta = analogRead(PIN_LDR);
int luminosidade = map(leituraBruta, 4095, 0, 0, 100);
// Leitura do DHT22
float temperatura = dht.readTemperature();
float umidade = dht.readHumidity();
// Verifica se a leitura do DHT22 é válida
if (isnan(temperatura) || isnan(umidade)) {
Serial.println("Erro na leitura do DHT22!");
delay(1000);
return;
}
// Exibe no Serial Monitor
Serial.print("Lum: "); Serial.print(luminosidade); Serial.print("% | ");
Serial.print("Temp: "); Serial.print(temperatura); Serial.print("°C | ");
Serial.print("Umidade: "); Serial.print(umidade); Serial.println("%");
// Controle de iluminação
if (luminosidade < LIMITE_LUZ) {
digitalWrite(PIN_LED_LUZ, HIGH);
} else {
digitalWrite(PIN_LED_LUZ, LOW);
}
// Controle de temperatura
if (temperatura > LIMITE_TEMP) {
digitalWrite(PIN_LED_TMP, HIGH);
digitalWrite(PIN_BUZZER, HIGH);
} else {
digitalWrite(PIN_LED_TMP, LOW);
digitalWrite(PIN_BUZZER, LOW);
}
// Atualiza LCD linha 1
lcd.setCursor(0, 0);
lcd.print("L:");
lcd.print(luminosidade);
lcd.print("% T:");
lcd.print(temperatura, 1);
lcd.print("C ");
// Atualiza LCD linha 2
lcd.setCursor(0, 1);
if (temperatura > LIMITE_TEMP && luminosidade < LIMITE_LUZ) {
lcd.print("LUZ+TEMP:ALERTA ");
} else if (temperatura > LIMITE_TEMP) {
lcd.print("TEMP: ALERTA! ");
} else if (luminosidade < LIMITE_LUZ) {
lcd.print("LUZ: LIGADA ");
} else {
lcd.print("Sistema: OK ");
}
delay(1000);
}