//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
#define PIR 7 //Definición del PIR en pin digital 7
#define ledPin 10 //Definición del LED en pin digital 10
// 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
};
// Persona //https://maxpromer.github.io/LCD-Character-Creator/
byte persona[8] = {
B01110, B01010, B01110, B00100, B01110, B10101, B01010, B01010
};
// Inicializo variables
int count = 0;
int mode = 0;
bool flag = false;
uint32_t btnTimer = 0;
int pirState = LOW; // Inicializo la variable del sensor de presencia y asumo que no detecta nada
int val = 0; // variable for reading the pin status
//Rutina SETUP
void setup() {
Serial.begin(11500);
// Declaro 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);
pinMode(PIR, INPUT);
pinMode(ledPin, 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);
lcd.createChar(5, persona);
// 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() {
// Cálculo de la iluminación con el sensor LDR
int analogValue = analogRead(LDR_PIN);
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
// Leo la medición del sensor de presencia PIR
val = digitalRead(PIR); // Leo el valor de entrada
// Comprobación de estado del botón
bool btnState = !digitalRead(BUTTON_B);
if (btnState && !flag && millis() - btnTimer > 100) {
flag = true;
btnTimer = millis();
// Cuenta de número de pulsación
count+=1;
// Cálculo del modo en función del número de pulsación
mode = count % 4; // Módulo de 4 porque hay 4 modos posibles [0-3]
Serial.print("Interfaz: ");
Serial.println(mode);
}
// Esta condición se cumple si el botón está presionado (btnState es false),
// el flag es true y han pasado más de 100 milisegundos desde la última vez que se comprobó el estado del botón
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");
lcd.setCursor(0,1);
lcd.print(" ");
// 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.setCursor(0,2);
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 (val == HIGH) { // Compruebo si el valor es HIGH
digitalWrite(ledPin, HIGH); // Enciendo el LED si detecto presencia
if (pirState == LOW) {
Serial.println("Presencia detectada!");
lcd.setCursor(0,1);
lcd.write(5);
lcd.setCursor(2,1);
lcd.print(" Si ");
pirState = HIGH;
}
} else {
digitalWrite(ledPin, LOW); // Apago el LED en caso de no detectar nada
if (pirState == HIGH) {
Serial.println("Ya no hay presencia!");
lcd.setCursor(0,1);
lcd.write(5);
lcd.setCursor(2,1);
lcd.print(" No ");
pirState = LOW;
}
}
}
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
}
// Función para la lectura del sensor PIR de presencia, devuelve True en caso de
// detectar presencia
bool readMotionSensor() {
int sensorVal = digitalRead(PIR);
return sensorVal == HIGH;
}
void clearDisplay() { //Limpiar pantalla
lcd.setCursor(0, 0);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(" ");
}
//Calculo de PID