//Programa ARDUINO MUIT 2024
//Ivan Arakistain
#include <LiquidCrystal_I2C.h> //Librería para el manejo de la pantalla LCD
#include <dht.h> //Librería para el manejo del sensor DHT22
#define LDR_PIN A0 //Definición del pin analógico 0 como entrada de la LDR
#define DHTPIN 3 //Definición del pin digital 3 como entrada del sensor de temperatura y humedad DHT22
#define PIN_TRIG 5 //Definición del pin digital 5 como pin de salida de pulsos del sensor de distancia
#define PIN_ECHO 6 //Definición del pin digital 6 como entrada del eco de los pulsos del sensor de distancia
#define BUTTON_B A2 //Definición del pin analógico 2 como entrada del pulsador
#define red_led 13 //Definición RGB rojo en pin digital 13
#define green_led 12 //Definición RGB verde en pin digital 12
#define blue_led 11 //Definición RGB azul en pin digital 11
#define buzzerPin 4 //Definición Buzzer en pin digital 4
// Características del sensor LDR
const float GAMMA = 0.7;
const float RL10 = 50;
// Inicializo el DHT
dht DHT;
// Defino el tamaño de la pantalla LCD y los Símbolos
LiquidCrystal_I2C lcd(0x27,16,2);
// Simbolo LCD Humedad //https://wokwi.com/projects/355666401414041601
byte hum[8] = {
B00100, B00100, B01010, B01010, B10001, B10001, B10001, B01110
};
// Simbolo LCD Temperatura
byte temp[8] = {
B00100, B01010, B01010, B01110, B01110, B11111, B11111, B01110
};
// Flecha derecha
byte arrowRight[8] = {
B00000, B00100, B00110, B11111, B00110, B00100, B00000, B00000
};
//Campana alarma
byte bell[8] = {
B00100, B01110, B01110, B01110, B11111, B00000, B00100, B00000
};
// Candado cerrado
byte lock[8] = {
B00000, B01110, B10001, B10001, B11111, B11011, B11011, B11111
};
// Candado abierto
byte unlock[8] = {
B00000, B01110, B10000, B10000, B11111, B11011, B11011, B11111
};
// Candado abierto
byte full[8] = {
B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111
};
// Inicializo variables
int count = 0;
int mode = 0;
bool flag = false;
uint32_t btnTimer = 0;
//Rutina SETUP
void setup() {
Serial.begin(11500);
// Inicializo los pines
pinMode(LDR_PIN, INPUT);
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
pinMode(BUTTON_B, INPUT_PULLUP);
pinMode(red_led, OUTPUT);
pinMode(green_led, OUTPUT);
pinMode(blue_led, OUTPUT);
pinMode (buzzerPin, OUTPUT);
// Inicializo la pantalla LCD
lcd.init();
// Defino los símbolos
lcd.createChar(0, lock);
lcd.createChar(1, unlock);
lcd.createChar(2, temp);
lcd.createChar(3, hum);
lcd.createChar(4, bell);
// Melodía de SETUP
tone(buzzerPin, 277, 100);
delay (150);
tone(buzzerPin, 377, 100);
delay (150);
tone(buzzerPin, 477, 100);
delay (150);
tone(buzzerPin, 577, 100);
delay (150);
tone(buzzerPin, 677, 100);
delay (150);
noTone(buzzerPin);
// Display de instrucciones para la simulación
Serial.println("PRESIONE EL BOTÓN PARA COMENZAR");
Serial.println("INTERFAZ 1: TEMPERATURA Y HUMEDAD");
Serial.println("INTERFAZ 2: HOLA Y ADIOS");
}
// Bucle
void loop() {
int analogValue = analogRead(A0);
float voltage = analogValue / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA)); //Cálculo de iluminación
bool btnState = !digitalRead(BUTTON_B);
if (btnState && !flag && millis() - btnTimer > 100) {
flag = true;
btnTimer = millis();
count+=1;
mode = count % 4;
Serial.print("Interfaz: ");
Serial.println(mode);
}
if (!btnState && flag && millis() - btnTimer > 100) {
flag = false;
btnTimer = millis();
}
if(mode == 1 ){ //Modo temperatura y humedad
//led_color(150,100,255);
// Enciendo la luz de la pantalla
lcd.backlight();
lcd.display();
int chk = DHT.read22(DHTPIN); // En el montaje físico es un DHT11, hay que cambiar a .read11
// Mostrar Temperatura
lcd.setCursor(0,0);
lcd.write(2);
lcd.setCursor(2,0);
lcd.print(DHT.temperature,1);
lcd.print(" C");
// Mostrar Humedad
lcd.setCursor(0,1);
lcd.write(3);
lcd.setCursor(2,1);
lcd.print(DHT.humidity,1);
lcd.print(" %");
}
if(mode == 2 ){ //Modo iluminación y presencia
//led_color(0,255,100);
lcd.setCursor(0,0);
lcd.write(4);
lcd.print(lux,1);
lcd.print(" lux");
// Comenzar una nueva medición:
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(5);
digitalWrite(PIN_TRIG, LOW);
// Leer los resultados:
int duration = pulseIn(PIN_ECHO, HIGH);
lcd.setCursor(0,1);
lcd.write(4);
lcd.setCursor(2,1);
lcd.print((duration / 58),1);
lcd.print(" cm");
}
if(mode == 3 ){ //Modo alarma
//led_color(255,100,160);
//lcd.clear();
lcd.setCursor(0, 0);
lcd.write(1);
lcd.setCursor(5,0);
lcd.print(" ");
lcd.setCursor(0,2);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
int value = analogRead(A3);
//Serial.println(value);
delay(100);
lcd.setCursor(2,0);
lcd.print((potToTemp (value)),0);
lcd.print("C");
//colourTransition();
//Zumbador
}
if(mode == 0){ //Modo Encendido de pantalla
//led_color(100,10,100);
lcd.setCursor(0, 0);
lcd.write(1);
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,2);
lcd.print(" ");
lcd.setCursor(1,0);
lcd.print(" ");
lcd.backlight();
}
}
void led_color(int red_value, int green_value,int blue_value) //Función para asignar color al Led RGB
{
analogWrite(red_led,red_value);
analogWrite(green_led,green_value);
analogWrite(blue_led,blue_value);
}
void colourTransition() //Función para crear las transiciones de color del Led RGB
{
led_color(235, 160, 0);
delay(1000);
led_color(245, 100, 0);
delay(1000);
led_color(255, 0, 0);
delay(1000);
}
//Temp Set 10C - 35C //Escalar valores del poteciometro a temperatura
float potToTemp(int value) {
value += 1;
float InputLow = 1;
float InputHigh = 1024;
float OutputLow = 10;
float OutputHigh = 35;
return ((value - InputLow) / (InputHigh - InputLow)) * (OutputHigh - OutputLow) + OutputLow;
//https://wokwi.com/projects/359848287762329601
}
void clearDisplay() { //Limpiar pantalla
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(" ");
}
//Calculo de PID