#include <Keypad.h>
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 0 // Pin al que está conectado el sensor DHT
#define DHTTYPE DHT22 // Tipo de sensor DHT (DHT11 o DHT22)
const byte ROWS = 4; // Número de filas del teclado matricial
const byte COLS = 4; // Número de columnas del teclado matricial
// Definir los pines del teclado matricial
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {18,19,13,12}; // Conectar los pines de las filas
byte colPins[COLS] = {38,39,16,14}; // Conectar los pines de las columnas
// Inicializar el teclado matricial
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
DHT dht(DHTPIN, DHTTYPE);
// Definir pines para los LEDs
const int tempLedPin = 2; // LED para la temperatura
const int lowerTempLedPin = 4; // LED para valores de temperatura inferiores al de referencia
const int humLedPin = 36; // LED para la humedad
const int lowerHumLedPin = 34; // LED para valores de humedad inferiores al de referencia
// Definir valores de referencia iniciales
int tempRef = 25; // Temperatura de referencia inicial
int humRef = 50; // Humedad de referencia inicial
bool settingTemp = false; // Variable para indicar si se está configurando la temperatura
bool settingHum = false; // Variable para indicar si se está configurando la humedad
// Variables para almacenar los nuevos valores ingresados
String newTempStr = "";
String newHumStr = "";
// Configuración del display LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Dirección I2C del display: 0x27, 16 columnas y 2 filas
void setup()
{
Serial.begin(9600);
pinMode(tempLedPin, OUTPUT);
pinMode(humLedPin, OUTPUT);
pinMode(lowerTempLedPin, OUTPUT);
pinMode(lowerHumLedPin, OUTPUT);
// Inicializar el display LCD
lcd.init();
lcd.backlight(); // Encender retroiluminación
lcd.setCursor(0, 0);
lcd.print("Temp:");
lcd.setCursor(0, 1);
lcd.print("Hum:");
}
void loop()
{
// Leer temperatura y humedad
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Verificar si la lectura del sensor fue exitosa
if (isnan(humidity) || isnan(temperature))
{
Serial.println("Error al leer el sensor DHT11");
return;
}
// Mostrar temperatura y humedad en el display LCD
lcd.setCursor(3, 0);
lcd.print(int(temperature));
lcd.print(" C"); // Convertir temperatura a entero
lcd.setCursor(3, 1);
lcd.print(int(humidity));
lcd.print("%"); // Convertir humedad a entero
lcd.setCursor(11, 0);
lcd.print(tempRef);
lcd.print(" C"); // Convertir temperatura a entero
lcd.setCursor(11, 1);
lcd.print(humRef);
lcd.print("%"); // Convertir humedad a entero
// Calcular la variación de temperatura y humedad
float tempVariation = abs(temperature - tempRef);
float humVariation = abs(humidity - humRef);
// Calcular el 5% de los valores de referencia
float tempThreshold = tempRef * 0.05;
float humThreshold = humRef * 0.05;
// Encender o apagar los LEDs si la variación es mayor al 5%
if (tempVariation > tempThreshold)
{
if (temperature < tempRef)
{
digitalWrite(lowerTempLedPin, HIGH); // Encender LED de temperatura baja
digitalWrite(tempLedPin, LOW); // Apagar LED de temperatura alta
}
else if (temperature > tempRef)
{
digitalWrite(lowerTempLedPin, LOW); // Apagar LED de temperatura baja
digitalWrite(tempLedPin, HIGH); // Encender LED de temperatura alta
}
}
else
{
digitalWrite(lowerTempLedPin, LOW); // Apagar LED de temperatura baja
digitalWrite(tempLedPin, LOW); // Apagar LED de temperatura alta
}
if (humVariation > humThreshold)
{
if (humidity < humRef)
{
digitalWrite(lowerHumLedPin, HIGH); // Encender LED de humedad baja
digitalWrite(humLedPin, LOW); // Apagar LED de humedad alta
}
else if (humidity > humRef)
{
digitalWrite(lowerHumLedPin, LOW); // Apagar LED de humedad baja
digitalWrite(humLedPin, HIGH); // Encender LED de humedad alta
}
}
else
{
digitalWrite(lowerHumLedPin, LOW); // Apagar LED de humedad baja
digitalWrite(humLedPin, LOW); // Apagar LED de humedad alta
}
// Leer teclado matricial
char key = keypad.getKey();
// Enviar todas las teclas presionadas al puerto serie
if (key != NO_KEY)
{
Serial.print("Tecla presionada: ");
Serial.println(key);
}
// Actualizar los valores de referencia de temperatura y humedad
if (key == 'A')
{
settingTemp = true;
settingHum = false;
newTempStr = ""; // Borrar el valor actual
}
else if (key == 'B')
{
settingTemp = false;
settingHum = true;
newHumStr = ""; // Borrar el valor actual
}
else if (key == '#')
{
tempRef = 25;
humRef = 50;
Serial.println("Valores de referencia restablecidos: Temp=25°C, Hum=50%");
}
else if (key == '*')
{
settingTemp = false;
settingHum = false;
}
else if (settingTemp && isDigit(key))
{
newTempStr += key; // Agregar el dígito al valor actual
Serial.print("Nuevo valor de temperatura: ");
Serial.println(newTempStr);
}
else if (settingHum && isDigit(key))
{
newHumStr += key; // Agregar el dígito al valor actual
Serial.print("Nuevo valor de humedad: ");
Serial.println(newHumStr);
}
// Convertir los valores de temperatura y humedad ingresados a enteros
if (settingTemp && !newTempStr.equals(""))
{
tempRef = newTempStr.toInt();
Serial.print("Nuevo valor de temperatura aceptado: ");
Serial.println(tempRef);
}
if (settingHum && !newHumStr.equals(""))
{
humRef = newHumStr.toInt();
Serial.print("Nuevo valor de humedad aceptado: ");
Serial.println(humRef);
}
// Resto del código...
}