#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Librería para el LCD I2C
#include <Servo.h>
#define DHTPIN 2 // Pin de datos del sensor DHT11
#define DHTTYPE DHT22 // Tipo de sensor DHT (DHT11 o DHT22)
Servo servoTemp; // Objeto del servo para controlar la temperatura
Servo servoLuz; // Objeto del servo para controlar la luz
DHT dht(DHTPIN, DHTTYPE); // Inicializar el sensor DHT11
// Dirección de tu módulo LCD I2C (Puedes encontrar la dirección en la documentación del módulo o usar un escáner I2C)
const int i2cAddr = 0x27; // Cambiar esta dirección según tu módulo LCD I2C
const int lcdCols = 16; // Número de columnas del LCD
const int lcdRows = 2; // Número de filas del LCD
LiquidCrystal_I2C lcd(i2cAddr, lcdCols, lcdRows); // Inicializar el LCD I2C
const int Habitacion1_PIN = 13;
const int Habitacion2_PIN = 12;
int LUX;
const int LDR1_PIN = 0;
const int LDR2_PIN = 4;
const int ledTempPin = 7; // Pin para el LED indicador de temperatura
const int ledHumedadPin = 8; // Pin para el LED indicador de humedad
const int ledTempMenor10Pin = 9; // Pin para el LED indicador de temperatura menor a 10°C
const int ledTempEntre10y25Pin = 10; // Pin para el LED indicador de temperatura entre 10°C y 25°C
const int servoTempPin = 11; // Pin para el servo de temperatura
const int servoLuzPin = 5; // Pin para el servo de luz
void setup() {
lcd.begin(lcdCols, lcdRows); // Iniciar el LCD I2C
lcd.backlight(); // Encender la retroiluminación del LCD
dht.begin(); // Iniciar el sensor DHT11
Serial.begin(115200);
Serial.println(F("DHT22 Lectura!")); // Mensaje de inicio para el monitor serial
servoTemp.attach(servoTempPin); // Conectar el servo de temperatura al pin correspondiente
servoLuz.attach(servoLuzPin); // Conectar el servo de luz al pin correspondiente
pinMode(Habitacion1_PIN, OUTPUT);
pinMode(Habitacion2_PIN, OUTPUT);
pinMode(ledTempPin, OUTPUT); // Configurar el pin del LED indicador de temperatura como salida
pinMode(ledHumedadPin, OUTPUT); // Configurar el pin del LED indicador de humedad como salida
pinMode(ledTempMenor10Pin, OUTPUT); // Configurar el pin del LED indicador de temperatura menor a 10°C
pinMode(ledTempEntre10y25Pin, OUTPUT); // Configurar el pin del LED indicador de temperatura entre 10°C y 25°C
pinMode(LDR1_PIN, INPUT);
pinMode(LDR2_PIN, INPUT);
// Mostrar mensajes de inicio al encender el circuito
lcd.setCursor(0, 0);
lcd.print("Hola!");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Lectura DHT22");
delay(1000);
lcd.clear();
}
void loop() {
delay(500); // Esperar 2 segundos entre lecturas
lcd.setCursor(0, 1);
lcd.print("Lectura DHT22");
float temperatura = dht.readTemperature(); // Leer la temperatura en grados Celsius
float humedad = dht.readHumidity(); // Leer la humedad relativa
int ldrValue1 = digitalRead(LDR1_PIN);
int ldrValue2 = digitalRead(LDR2_PIN);
unsigned long tiempoActual = millis();
//LDR_1 Habitación 1
LUX = digitalRead(LDR1_PIN);
Serial.println(LUX);
if(LUX == HIGH){
digitalWrite(Habitacion1_PIN, HIGH);
lcd.setCursor(0, 1); // Establecer la posición del cursor en la fila 2, columna 1
lcd.print("Habitacion 1 ON "); // Mostrar mensaje de habitación 1 encendida
}
if(LUX == LOW){
digitalWrite(Habitacion1_PIN, LOW);
lcd.setCursor(0, 1); // Establecer la posición del cursor en la fila 2, columna 1
lcd.print("Habitacion 1 OFF "); // Borrar el mensaje de habitación encendida
}
//LDR_2 Habitación 2
LUX = digitalRead(LDR2_PIN);
Serial.println(LUX);
if(LUX == HIGH){
digitalWrite(Habitacion2_PIN, HIGH);
lcd.setCursor(0, 1); // Establecer la posición del cursor en la fila 2, columna 1
lcd.print("Habitacion 2 ON "); // Mostrar mensaje de habitación 1 encendida
}
if(LUX == LOW){
digitalWrite(Habitacion2_PIN, LOW);
lcd.setCursor(0, 1); // Establecer la posición del cursor en la fila 2, columna 1
lcd.print("Habitacion 2 OFF "); // Borrar el mensaje de habitación encendida
}
// Mostrar datos de temperatura y humedad después de mostrar los mensajes de habitación
lcd.setCursor(0, 0); // Establecer la posición del cursor en la fila 1, columna 1
lcd.print("Temp: "); // Mostrar etiqueta de temperatura
lcd.print(temperatura); // Mostrar temperatura
lcd.print(" C"); // Mostrar unidad de temperatura
lcd.setCursor(0, 1); // Establecer la posición del cursor en la fila 2, columna 1
lcd.print("Humedad: "); // Mostrar etiqueta de humedad
lcd.print(humedad); // Mostrar humedad
lcd.print(" %"); // Mostrar unidad de humedad
// Mostrar lecturas en el monitor serial
Serial.print(F("Temperatura: "));
Serial.print(temperatura);
Serial.print(F("°C, Humedad: "));
Serial.print(humedad);
Serial.println(F("%"));
// Controlar el LED indicador de temperatura
if (temperatura > 25) {
digitalWrite(ledTempPin, HIGH);
digitalWrite(ledTempMenor10Pin, LOW);
digitalWrite(ledTempEntre10y25Pin, LOW);
} else if (temperatura < 10) {
digitalWrite(ledTempPin, LOW);
digitalWrite(ledTempMenor10Pin, HIGH);
digitalWrite(ledTempEntre10y25Pin, LOW);
} else {
digitalWrite(ledTempPin, LOW);
digitalWrite(ledTempMenor10Pin, LOW);
digitalWrite(ledTempEntre10y25Pin, HIGH);
}
// Encender o parpadear el LED amarillo según la humedad
if (humedad >= 40 && humedad <= 50) {
digitalWrite(ledHumedadPin, HIGH);
} else if (humedad > 50) {
digitalWrite(ledHumedadPin, HIGH);
delay(500);
digitalWrite(ledHumedadPin, LOW);
delay(500);
} else if (humedad < 40) {
digitalWrite(ledHumedadPin, HIGH);
delay(500);
digitalWrite(ledHumedadPin, LOW);
delay(500);
}
// Control del servo de temperatura
if (temperatura > 25) {
servoTemp.write(180); // Abrir el servo si la temperatura es mayor a 25°C
} else {
servoTemp.write(0); // Cerrar el servo si la temperatura es menor o igual a 25°C
}
// Control del servo de luz
if (ldrValue1 < 500) {
servoLuz.write(180); // Abrir el servo si hay poca luz (valor del LDR < 500)
} else {
servoLuz.write(0); // Cerrar el servo si hay mucha luz (valor del LDR >= 500)
}
// Esperar un momento antes de la siguiente lectura
delay(500);
}