#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// Configuración del LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // Dirección I2C, ajusta si es diferente
// Configuración del DHT22
#define DHTPIN 17 // Pin GPIO para el DHT22
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Configuración del sensor ultrasónico
#define TRIG_PIN 5
#define ECHO_PIN 18
// Pines del codificador digital
const int bcdPins[] = {13, 12, 14, 27}; // Pines de entrada BCD
void setup() {
Serial.begin(115200);
// Inicialización del LCD
lcd.init();
lcd.backlight();
// Inicialización del DHT22
dht.begin();
// Configuración de pines del sensor ultrasónico
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Configuración de pines del codificador digital
for (int i = 0; i < 4; i++) {
pinMode(bcdPins[i], INPUT);
}
// Mensaje inicial
lcd.setCursor(0, 0);
lcd.print("Iniciando...");
delay(2000);
lcd.clear();
}
void loop() {
int bcdValue = readBCD(); // Leer el valor del codificador digital
// Seleccionar acción según el valor del codificador
switch (bcdValue) {
case 1:
showHumidity(); // Mostrar humedad
break;
case 2:
showTemperature(); // Mostrar temperatura
break;
case 3:
showDistance(); // Mostrar distancia
break;
default:
// Valor inválido, limpiar pantalla
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Seleccion invalida");
Serial.println("Seleccion invalida");
break;
}
delay(500); // Espera para evitar lecturas erráticas
}
int readBCD() {
int bcdValue = 0;
for (int i = 0; i < 4; i++) {
if (digitalRead(bcdPins[i]) == HIGH) {
bcdValue |= (1 << i); // Formar el valor BCD a partir de los pines
}
}
return bcdValue;
}
void showTemperature() {
float temperature = dht.readTemperature();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temperatura:");
lcd.setCursor(0, 1);
if (isnan(temperature)) {
lcd.print("Error!");
} else {
lcd.print(temperature);
lcd.print(" C");
}
Serial.print("Temperatura: ");
Serial.println(temperature);
}
void showHumidity() {
float humidity = dht.readHumidity();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Humedad:");
lcd.setCursor(0, 1);
if (isnan(humidity)) {
lcd.print("Error!");
} else {
lcd.print(humidity);
lcd.print(" %");
}
Serial.print("Humedad: ");
Serial.println(humidity);
}
void showDistance() {
// Enviar pulso de activación
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Leer la duración del eco
long duration = pulseIn(ECHO_PIN, HIGH);
// Convertir la duración a distancia
float distance = duration * 0.034 / 2;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Distancia:");
lcd.setCursor(0, 1);
lcd.print(distance);
lcd.print(" cm");
Serial.print("Distancia: ");
Serial.println(distance);
}