#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
#include <ESP_Mail_Client.h>
#include <DHT.h>
// --- Pines ---
#define DHTPIN 4 // DHT11
#define DHTTYPE DHT11
#define PUERTA 12
#define VENTANA 14
#define BUZZER 13
#define BUTTON 19 // Botón para buzzer
// --- LCD I2C ---
#define LCD_SDA 21 // Pin SDA ESP32
#define LCD_SCL 22 // Pin SCL ESP32
LiquidCrystal_I2C lcd(0x27,16,2); // Dirección 0x27, pantalla 16x2
// --- WiFi y Telegram ---
const char *ssid="LBZTecnicos",*pass="Tecnicos2025";
const char *BOT="8290037385:AAELggwPY6tkH5OlCpHVm3L_Qb8pgxAQpf0",*CHAT="1462442390";
// --- Mail ---
const char *user="[email protected]",*pwd="vrld wsmo jytt pdlu",*dest="[email protected]";
DHT dht(DHTPIN,DHTTYPE);
WiFiClientSecure client;
UniversalTelegramBot bot(BOT,client);
SMTPSession smtp;
float Tmin=10,Hmax=80;
unsigned long last=0;
// --- Funciones ---
String estado(){
float h=dht.readHumidity(), t=dht.readTemperature();
return "Temp: "+String(t,1)+"°C | Hum: "+String(h,1)+"% | Puerta "+String(digitalRead(PUERTA)==LOW?"ABIERTA":"CERRADA")+" | Ventana "+String(digitalRead(VENTANA)==LOW?"ABIERTA":"CERRADA");
}
void enviarMail(String msg){
ESP_Mail_Session s;
s.server.host_name="smtp.gmail.com";
s.server.port=465;
s.login.email=user;
s.login.password=pwd;
SMTP_Message m;
m.sender.email=user;
m.subject="⚠ ESP32 Mail Test";
m.addRecipient("",dest);
m.text.content=msg.c_str();
String res="📧 Correo enviado ✅";
if(smtp.connect(&s)){
if(!MailClient.sendMail(&smtp,&m))
res="❌ Error correo: "+smtp.errorReason();
} else res="❌ No se pudo conectar al SMTP";
Serial.println(res);
bot.sendMessage(CHAT,res,"");
}
// --- Setup ---
void setup(){
Serial.begin(115200);
dht.begin();
pinMode(PUERTA,INPUT_PULLUP);
pinMode(VENTANA,INPUT_PULLUP);
pinMode(BUZZER,OUTPUT);
pinMode(BUTTON, INPUT_PULLUP);
// Inicializar LCD
Wire.begin(LCD_SDA, LCD_SCL);
lcd.init();
lcd.backlight();
WiFi.begin(ssid,pass);
while(WiFi.status()!=WL_CONNECTED) delay(500);
client.setInsecure();
bot.sendMessage(CHAT,"🌡 Central Meteo Iniciada","");
Serial.println("Central Meteo Iniciada");
}
// --- Loop ---
void loop(){
// --- Lectura sensores ---
float temp=dht.readTemperature();
float hum=dht.readHumidity();
bool puertaCerrada = digitalRead(PUERTA)!=LOW; // HIGH = cerrada
bool botonPresionado = digitalRead(BUTTON)==LOW; // LOW = presionado
if(isnan(temp) || isnan(hum)){
Serial.println("Error al leer el sensor DHT11");
delay(2000);
return;
}
// --- Mostrar en Serial ---
Serial.print("Temp: "); Serial.print(temp);
Serial.print(" °C | Hum: "); Serial.print(hum);
Serial.print(" % | Boton: "); Serial.print(botonPresionado?"Presionado":"Suelto");
Serial.print(" | Puerta: "); Serial.println(puertaCerrada?"CERRADA":"ABIERTA");
// --- Mostrar en LCD ---
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temp: ");
lcd.print(temp,1);
lcd.print((char)223); // ° símbolo
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Hum: ");
lcd.print(hum,1);
lcd.print("%");
// --- Lógica buzzer ---
if(temp < 30 && !botonPresionado){
digitalWrite(BUZZER, HIGH); // Suena buzzer
Serial.println("Cerra la puerta");
} else {
digitalWrite(BUZZER, LOW); // Apaga buzzer
}
// --- Alertas automáticas cada 10s ---
if(millis()-last>10000){
String a="";
if(temp<Tmin && hum>Hmax) a="⚠ Doble alerta: "+String(temp,1)+"°C / "+String(hum,1)+"%";
else {
if(temp<Tmin) a="❄ Temp baja: "+String(temp,1)+"°C";
if(hum>Hmax) a="💧 Hum alta: "+String(hum,1)+"%";
}
if(a!="") enviarMail(a+" | "+estado());
last=millis();
}
delay(5000);
}