// Programa ARDUINO MUIT Actividad 1
// Jose Luis Miguens Mata
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definición Pines Analógicos
#define PIN_LDR A0 // Definición del pin analógico 0 como entrada del LDR
#define PIN_BUTTON A1 // Definición del pin analógico 1 como entrada del pulsador
// Definición Pines Digitales
#define PIN_DHT 2 // Definición del pin digital 2 como entrada del sensor de temperatura y humedad DHT22
#define DHTTYPE DHT22
#define PIN_TRIG 3 // Definición del pin digital 3 como pin de salida de pulsos del sensor de distancia
#define PIN_ECHO 4 // Definición del pin digital 4 como entrada del eco de los pulsos del sensor de distancia
#define PIN_BUZZER 10 // Definición del pin digital 10 como salida del buzzer
#define PIN_LED_RGB_B 11 // Definición del pin digital 11 como pin de salida del led RGB (Azul)
#define PIN_LED_RGB_G 12 // Definición del pin digital 12 como pin de salida del led RGB (Verde)
#define PIN_LED_RGB_R 13 // Definición del pin digital 13 como pin de salida del led RGB (Rojo)
// Variables globales
int count = 0;
int mode = 0;
bool flag = false;
uint32_t button_timer = 0;
// Símbolos LCD
byte temp[8] = {B00100, B01010, B01010, B01110, B01110, B11111, B11111, B01110};
byte hum[8] = {B00100, B00100, B01010, B01010, B10001, B10001, B10001, B01110};
byte light[8] = {B00100, B01010, B10001, B01010, B00100, B00000, B00100, B00000};
byte distance[8] = {B00000, B00100, B01110, B11111, B00100, B00100, B00100, B00000};
// Características sensor LDR
const float GAMMA = 0.7;
const float RL10 = 50;
// Inicialización sensor DHT
DHT dht(PIN_DHT, DHTTYPE);
// Inicialización LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(115200);
pinMode(PIN_LDR, INPUT);
pinMode(PIN_BUTTON, INPUT_PULLUP);
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
pinMode(PIN_BUZZER, OUTPUT);
pinMode(PIN_LED_RGB_B, OUTPUT);
pinMode(PIN_LED_RGB_G, OUTPUT);
pinMode(PIN_LED_RGB_R, OUTPUT);
dht.begin();
lcd.init();
lcd.backlight();
lcd.createChar(3, temp);
lcd.createChar(4, hum);
lcd.createChar(5, light);
lcd.createChar(6, distance);
}
void loop() {
int analogValue = analogRead(PIN_LDR);
float voltage = analogValue / 1024.0 * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
bool btnState = !digitalRead(PIN_BUTTON);
if (btnState && !flag && millis() - button_timer > 100) {
flag = true;
button_timer = millis();
count++;
mode = count % 5;
lcd.clear();
}
if (!btnState && flag && millis() - button_timer > 100) {
flag = false;
button_timer = millis();
}
// Actualizar según el modo actual
switch (mode) {
case 1: { // Modo temperatura
float temperature = dht.readTemperature();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Temp(");
lcd.write(3);
lcd.print("):");
lcd.setCursor(0, 1);
lcd.print(temperature, 1);
lcd.print(" C ");
led_color(255, 0, 0); // Rojo para modo temperatura
break;
}
case 2: { // Modo humedad
float humidity = dht.readHumidity();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Hum(");
lcd.write(4);
lcd.print("):");
lcd.setCursor(0, 1);
lcd.print(humidity, 1);
lcd.print(" % ");
led_color(0, 255, 255); // Cian para modo humedad
break;
}
case 3: { // Modo luz
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Luz(");
lcd.write(5);
lcd.print("):");
lcd.setCursor(0, 1);
lcd.print(lux, 1);
lcd.print(" lux ");
led_color(0, 255, 0); // Verde para modo luz
break;
}
case 4: { // Modo distancia
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
int duration = pulseIn(PIN_ECHO, HIGH);
int distance = duration * 0.034 / 2;
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Dist(");
lcd.write(6);
lcd.print("):");
lcd.setCursor(0, 1);
lcd.print(distance, 1);
lcd.print(" cm ");
led_color(0, 0, 255); // Azul para modo distancia
// Activar buzzer si hay presencia de gente
if (distance < 30) { // Umbral de 30 cm para detectar presencia
digitalWrite(PIN_BUZZER, HIGH);
} else {
digitalWrite(PIN_BUZZER, LOW);
}
break;
}
case 0: { // Modo apagado
lcd.clear();
lcd.noBacklight();
led_color(0, 0, 0); // Apagar el LED RGB
digitalWrite(PIN_BUZZER, LOW); // Apagar el buzzer
break;
}
}
delay(100);
}
void led_color(int red_value, int green_value, int blue_value) {
analogWrite(PIN_LED_RGB_R, red_value);
analogWrite(PIN_LED_RGB_G, green_value);
analogWrite(PIN_LED_RGB_B, blue_value);
}