/* Assigancion de Pines
DHT22 pin D2
sensor PIR pin D3
LED_VERDE D4
LED_AMARILLO D5
LED_ROJO D6
BUZZER D7
LCD I2C A4 (SDA) A5 (SCL)*/
//Seccion de librerias
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
//Defines del proyecto
//Temperatura y humedad
#define DHTPIN 2
#define DHTTYPE DHT22
//Precensia
#define PIR_PIN 3
#define LDR_PIN A0
//STATUS y ALARMA
#define LED_VERDE 4
#define LED_AMARILLO 5
#define LED_ROJO 6
#define BUZZER 7
LiquidCrystal_I2C lcd(0x27, 20, 4); //Definicion Objeto LCD si no funciona cambiar 0x27 por 0x3f
DHT dht(DHTPIN, DHTTYPE); //Definicion Objeto DHT 22
//Seccion de variables
//Rango de Temperatura segura
const float TEMP_MIN = 18.0;
const float TEMP_MAX = 28.0;
// Iluminación (set de Lecturas analogas correspondientes)
const int LUZ_BAJA = 300;
const int LUZ_ALTA = 800;
// Horario simulado (24H - 8AM 6PM o 18)
const unsigned long MS_HORA = 3600000UL;
const unsigned long DIA_MS = 24UL * MS_HORA;
const unsigned long HORA_INICIO = 8UL * MS_HORA;
const unsigned long HORA_FIN = 18UL * MS_HORA;
// Función para actualizar DATA en la LCD
void LCD_UPDATE(float temp, bool lBaja, bool lAlta, bool pres, bool ocupNoAut, bool tFuera) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temp: ");
lcd.print(temp, 1);
lcd.print(" C");
lcd.setCursor(0,1);
lcd.print("Luz: ");
if (lBaja) lcd.print("Baja");
else if (lAlta) lcd.print("Alta");
else lcd.print("Adecuada");
lcd.setCursor(0,2);
lcd.print("Ocupacion: ");
lcd.print(pres ? "SI" : "NO");
lcd.setCursor(0,3);
if (ocupNoAut) {
lcd.print("OCUP NO AUTORIZ");
}
else if (tFuera) { // Ajustado para mostrar alerta siempre que tFuera sea true
lcd.print("ALERTA TEMP");
}
else {
lcd.print("Estado Normal");
}
}
void setup() {
pinMode(PIR_PIN, INPUT);
pinMode(LED_VERDE, OUTPUT);
pinMode(LED_AMARILLO, OUTPUT);
pinMode(LED_ROJO, OUTPUT);
pinMode(BUZZER, OUTPUT);
lcd.init();
lcd.backlight();
dht.begin();
}
void loop() {
float temperatura = dht.readTemperature();
int luz = analogRead(LDR_PIN);
bool presencia = digitalRead(PIR_PIN);
unsigned long ahora = millis() % DIA_MS;
bool horarioPermitido = (ahora >= HORA_INICIO && ahora <= HORA_FIN);
bool tempFueraRango = (temperatura < TEMP_MIN || temperatura > TEMP_MAX);
bool luzBaja = (luz > LUZ_ALTA);
bool luzAlta = (luz < LUZ_BAJA);
bool luzAdecuada = (!luzBaja && !luzAlta);
bool ocupacionNoAutorizada = (presencia && !horarioPermitido);
// Reset de estados
digitalWrite(LED_VERDE, LOW);
digitalWrite(LED_AMARILLO, LOW);
digitalWrite(LED_ROJO, LOW);
digitalWrite(BUZZER, LOW);
// LOGICA DE SALIDAS (CORREGIDA)
if (tempFueraRango || ocupacionNoAutorizada) {
digitalWrite(LED_ROJO, HIGH);
digitalWrite(BUZZER, HIGH);
}
else if (!luzAdecuada) {
digitalWrite(LED_AMARILLO, HIGH);
}
else {
digitalWrite(LED_VERDE, HIGH);
}
LCD_UPDATE(temperatura, luzBaja, luzAlta, presencia, ocupacionNoAutorizada, tempFueraRango);
delay(1500);
}
Sensor LDR
Nivel de Iluminacion
LCD 2004 I2C
Temperatura
Humedad
Presencia
LEDs de estados