#include <DHT.h>
#define TRIG_PIN 5
#define ECHO_PIN 18
// LEDs
#define LED_VERDE 21
#define LED_AMARILLO 22
#define LED_ROJO 4
// Buzzer
#define BUZZER_PIN 26
// Potenciómetro (ruido)
#define SOUND_PIN 34
// DHT22
#define DHT_PIN 15
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);
float confortDist = 1.0;
float confortRuido = 1.0;
float confortTemp = 1.0;
float ICP = 1.0;
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_VERDE, OUTPUT);
pinMode(LED_AMARILLO, OUTPUT);
pinMode(LED_ROJO, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
Serial.begin(115200);
dht.begin();
}
void loop() {
evaluarDistancia();
evaluarRuido();
evaluarTemperatura();
calcularICP();
manejarAlertas();
delay(500);
}
void evaluarDistancia() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2;
if (distance > 100) {
confortDist = 1.0;
} else if (distance > 50) {
confortDist = 0.8;
} else {
confortDist = 0.4;
}
Serial.print("Distancia: ");
Serial.println(distance);
}
void evaluarRuido() {
int soundValue = analogRead(SOUND_PIN);
if (soundValue < 1500) {
confortRuido = 1.0;
} else if (soundValue < 3000) {
confortRuido = 0.7;
} else {
confortRuido = 0.3;
}
Serial.print("Ruido: ");
Serial.println(soundValue);
}
void evaluarTemperatura() {
float temperatura = dht.readTemperature();
if (isnan(temperatura)) {
Serial.println("Error leyendo DHT22");
return;
}
// CONFORT TEMPERATURA
if (temperatura >= 20 && temperatura <= 26) {
confortTemp = 1.0;
} else if (temperatura >= 18 && temperatura <= 30) {
confortTemp = 0.7;
} else {
confortTemp = 0.3;
}
Serial.print("Temperatura: ");
Serial.println(temperatura);
}
void calcularICP() {
ICP = (confortDist + confortRuido + confortTemp) / 3.0;
Serial.print("ICP: ");
Serial.println(ICP);
Serial.println("----------------");
}
void manejarAlertas() {
digitalWrite(LED_VERDE, LOW);
digitalWrite(LED_AMARILLO, LOW);
digitalWrite(LED_ROJO, LOW);
noTone(BUZZER_PIN);
// =========================
// ESTADO ÓPTIMO
// =========================
if (ICP >= 0.9) {
digitalWrite(LED_VERDE, HIGH);
}
// =========================
// ESTADO MODERADO
// =========================
else if (ICP >= 0.7) {
digitalWrite(LED_AMARILLO, HIGH);
// Aquí luego activaremos:
// ventilador
// DFPlayer ruido blanco
}
// =========================
// ALERTA CRÍTICA
// =========================
else {
digitalWrite(LED_ROJO, HIGH);
// Buzzer corto
tone(BUZZER_PIN, 1000);
delay(300);
noTone(BUZZER_PIN);
// pausa para evitar spam
delay(700);
}
}