#include <DHT.h>
#include <LiquidCrystal_I2C.h>
// ===== LCD I2C =====
LiquidCrystal_I2C lcd(0x27, 16, 2);
// ===== DHT22 =====
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// ===== SENSORES DIGITALES =====
#define HC_TRIG 3
#define HC_ECHO 4
#define PIR_PIN 5
#define BTN1_PIN 6
#define BTN2_PIN 7
#define BTN3_PIN 8
#define ENC_CLK 9
#define ENC_DT 10
#define ENC_SW 11
#define BUZZER_PIN 12
// ===== SENSORES ANALÓGICOS =====
#define GAS_PIN A0
#define LDR_PIN A1
// ===== VARIABLES =====
float temp = 0;
float humid = 0;
long distancia = 0;
int pir = 0;
int btn1 = 0, btn2 = 0, btn3 = 0;
int gas = 0;
int luz = 0;
int encoderPos = 0;
int encoderPosAnterior = 0;
int estadoCLKAnterior = 0;
int pantallaActual = 0;
unsigned long tiempoAnterior = 0;
void setup() {
Serial.begin(9600);
// Inicializar LCD
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("LABORATORIO 7");
lcd.setCursor(0, 1);
lcd.print("Actividad 2");
delay(2000);
// Inicializar DHT
dht.begin();
// Configurar pines
pinMode(HC_TRIG, OUTPUT);
pinMode(HC_ECHO, INPUT);
pinMode(PIR_PIN, INPUT);
pinMode(BTN1_PIN, INPUT_PULLUP);
pinMode(BTN2_PIN, INPUT_PULLUP);
pinMode(BTN3_PIN, INPUT_PULLUP);
pinMode(ENC_CLK, INPUT);
pinMode(ENC_DT, INPUT);
pinMode(ENC_SW, INPUT_PULLUP);
pinMode(BUZZER_PIN, OUTPUT);
estadoCLKAnterior = digitalRead(ENC_CLK);
encoderPosAnterior = encoderPos;
lcd.clear();
Serial.println("Sistema iniciado correctamente");
}
// Función para leer distancia
long leerDistancia() {
digitalWrite(HC_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(HC_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(HC_TRIG, LOW);
long duracion = pulseIn(HC_ECHO, HIGH, 30000);
if (duracion == 0) return -1;
return duracion * 0.034 / 2;
}
// Función para controlar el buzzer
void activarBuzzer(int frecuencia, int duracion) {
tone(BUZZER_PIN, frecuencia);
delay(duracion);
noTone(BUZZER_PIN);
}
// Función para leer encoder
void leerEncoder() {
int estadoCLK = digitalRead(ENC_CLK);
if (estadoCLK != estadoCLKAnterior) {
int estadoDT = digitalRead(ENC_DT);
if (estadoCLK == estadoDT) {
encoderPos++;
} else {
encoderPos--;
}
// Detectar cambio y activar buzzer
if (encoderPos != encoderPosAnterior) {
activarBuzzer(800, 100);
encoderPosAnterior = encoderPos;
Serial.print("Encoder cambio a: ");
Serial.println(encoderPos);
}
}
estadoCLKAnterior = estadoCLK;
}
// Función para leer sensores
void leerSensores() {
// DHT22
temp = dht.readTemperature();
humid = dht.readHumidity();
// HC-SR04
distancia = leerDistancia();
// PIR
pir = digitalRead(PIR_PIN);
// Botones
btn1 = !digitalRead(BTN1_PIN);
btn2 = !digitalRead(BTN2_PIN);
btn3 = !digitalRead(BTN3_PIN);
// Analógicos
gas = analogRead(GAS_PIN);
luz = analogRead(LDR_PIN);
// Encoder
leerEncoder();
}
// Pantalla 1: Temperatura y humedad
void pantalla1() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temp, 1);
lcd.print("C H:");
lcd.print(humid, 0);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("Gas:");
lcd.print(gas);
lcd.print(" Luz:");
lcd.print(luz);
}
// Pantalla 2: Distancia y PIR
void pantalla2() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dist:");
lcd.print(distancia);
lcd.print("cm");
lcd.setCursor(0, 1);
lcd.print("PIR:");
lcd.print(pir ? "SI " : "NO ");
lcd.print("B1:");
lcd.print(btn1 ? "P" : "-");
}
// Pantalla 3: Botones y Encoder
void pantalla3() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("B1:");
lcd.print(btn1 ? "P" : "-");
lcd.print(" B2:");
lcd.print(btn2 ? "P" : "-");
lcd.print(" B3:");
lcd.print(btn3 ? "P" : "-");
lcd.setCursor(0, 1);
lcd.print("Encoder:");
lcd.print(encoderPos);
}
void loop() {
leerSensores();
// Mostrar en Serial
Serial.print("T:");
Serial.print(temp, 1);
Serial.print("C H:");
Serial.print(humid, 0);
Serial.print("% D:");
Serial.print(distancia);
Serial.print("cm PIR:");
Serial.print(pir);
Serial.print(" B1:");
Serial.print(btn1);
Serial.print(" B2:");
Serial.print(btn2);
Serial.print(" B3:");
Serial.print(btn3);
Serial.print(" Gas:");
Serial.print(gas);
Serial.print(" Luz:");
Serial.print(luz);
Serial.print(" Enc:");
Serial.println(encoderPos);
// Cambiar pantalla cada 3 segundos
if (millis() - tiempoAnterior > 3000) {
tiempoAnterior = millis();
switch(pantallaActual) {
case 0: pantalla1(); break;
case 1: pantalla2(); break;
case 2: pantalla3(); break;
}
pantallaActual = (pantallaActual + 1) % 3;
}
delay(100);
}