/*
EQUIPOS E INSTRUMENTACIÓN ELECTRÓNICA
Nombre: Juan José Martínez Cámara
DNI: 77393908N
*/
// DECLARAMOS BIBLIOTECAS A UTILIZAR
#include <dht.h> // Biblioteca Sensor de Temperatura + Humedad
#include <Wire.h> // Biblioteca de comunicación I2C
#include <LiquidCrystal_I2C.h> // Biblioteca de pantalla LCD con I2C
//#include <Servo.h>
LiquidCrystal_I2C lcd(0x27,16,2); // Iniciar pantalla LCD, 16 caractares por línea y 2 líneas.
#define LDR_PIN A0 // Pin analógico A0 para LDR
dht DHT; // Crear Objeto para sensor DHT 11
#define DHT11PIN 3 // Definir pin digital para DHT11
#define PIN_TRIG 5 // Definir pin digital para sensor de proximidad
#define PIN_ECHO 6 // Definir pin digital para sensor de proximidad
#define BUTTON_B A2 // Definir pin analogico A2 como entrada del boton B
#define red_led 13 // Definir RGB rojo en pin digital 13
#define green_led 12 // Definir RGB verde en pin digital 12
#define blue_led 11 // Definir RGB azul en pin digital 11
#define pinLedLDR 7 // Definir pin digital para alarma de sensor LDR
// DEFINICION DE VARIABLES PARA LDR, BOTON Y LCD
int val = 0; // inicializamos variable para valor de entrada
const float GAMMA = 0.7; // Valor de la constante gamma para el cálculo de iluminación
const float RL10 = 50; // Valor de resistencia de referencia
int count = 0; // Contador para modo de funcionamiento
int mode = 0; // Modo de funcionamiento actual
bool flag = false; // Estado de boton
uint32_t btnTimer = 0; // Temporizador de presion
long duration; // Bariable para la duracion
int distance; // Variable para la distancia
//Servo myServo; // Objeto de control de servo
// SIMBOLOS PARA PANTALLA LCD
// Simbolo LCD Humedad
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
};
// Simbolo LCD Estrella
byte lum[8] = {
B00000, B00100, B01110, B11111, B01110, B00100, B00000, B00000
};
// Simbolo LCD Flecha derecha
byte arrowRight[8] = {
B00000, B00100, B00110, B11111, B00110, B00100, B00000, B00000
};
void setup()
{
Serial.begin(9600); // Iniciar comunicacion serial
pinMode(LDR_PIN,INPUT); // Pin de LDR como entrada
pinMode(PIN_TRIG,OUTPUT); // Sensor de proximidad TRIGGER como salida
pinMode(PIN_ECHO,INPUT); // Sensor de proximidad ECHO como salida
pinMode(BUTTON_B, INPUT_PULLUP); // Boton de 4 modos con resistencia pull-up
pinMode(red_led, OUTPUT); // LED RGB - rojo como salida
pinMode(green_led, OUTPUT); // LED RGB - verde como salida
pinMode(blue_led, OUTPUT); // LED RGB - azul como salida
pinMode(pinLedLDR,OUTPUT); // Pin de salida para iluminación LED LDR
// myServo.attach(8); //pin servo
lcd.init(); // Inicializamos LCD
// Identificamos los simbolos
lcd.backlight(); // encendemos pantalla LCD
lcd.createChar(1,hum); // asociamos los simbolos creados
lcd.createChar(2,temp);
lcd.createChar(3,lum);
lcd.createChar(4,arrowRight);
}
void loop()
{
// CALCULO DE VARIABLES
// sensor de temperatura y humedad
int chk = DHT.read(DHT11PIN);
// calculo de iluminación
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
// Enciende LDR en función de la iluminacion
if(lux > 500){
digitalWrite(pinLedLDR, HIGH);
}else{
digitalWrite(pinLedLDR,LOW);
}
// Medición de presencia y distancia
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(5);
digitalWrite(PIN_TRIG, LOW);
// lee el estado del boton
bool btnState = !digitalRead(BUTTON_B);
// verifica si esta presionado
if (btnState && !flag && millis() - btnTimer > 100) {
flag = true;
btnTimer = millis();
Serial.println("press");
count+=1;
mode = count % 4;
Serial.println(count);
}
// Reinicia el estado del boton
if (!btnState && flag && millis() - btnTimer > 100) {
flag = false;
btnTimer = millis();
}
Serial.print(mode);
if(mode == 1){ // SENSOR DE TEMPERATURA Y HUMEDAD
// MODO 0 azul
led_color(LOW,LOW,HIGH);
///////////////////////////////////////////////// SENSOR DE HUMEDAD
lcd.clear();
lcd.setCursor(3,0);
lcd.write(1);
lcd.print(" ");
lcd.print((float)DHT.humidity, 2);
lcd.print(" %");
/////////////////////////////////////////////////SENSOR DE TEMPERATURA
lcd.setCursor(3,1);
lcd.write(2);
lcd.print(" ");
lcd.print((float)DHT.temperature, 2);
lcd.print(" C");
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
if(mode == 2){
// MODO 1 verde
led_color(LOW,HIGH,LOW);
///////////////////////////////////////////////// SENSOR DE ILUMINACION
lcd.clear();
lcd.setCursor(3,0);
lcd.write(3);
lcd.print(" ");
lcd.print(lux, 1);
lcd.print(" lx");
///////////////////////////////////////////////// SENSOR DE DISTANCIA
// Medición de presencia
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(5);
digitalWrite(PIN_TRIG, LOW);
// Leer los resultados:
int duration = pulseIn(PIN_ECHO, HIGH);
lcd.setCursor(3,1);
lcd.write(4);
lcd.print(" ");
lcd.print((duration/58),1);
lcd.print(" cm");
}
if(mode == 3){ //Modo apagado de pantalla
// MODO 2 rojo
led_color(HIGH,LOW,LOW);
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
}
if(mode == 0){ //Modo apagado de pantalla
// MODO 3 blanco
led_color(HIGH,HIGH,HIGH);
lcd.setCursor(0,0);
lcd.print("JUANJO - ACT 1");
lcd.setCursor(0,1);
lcd.print("SENSOR CONFORT");
}
delay(500);
}
//Función para asignar color al Led RGB
void led_color(int red_value, int green_value,int blue_value)
{
digitalWrite(red_led,red_value);
digitalWrite(green_led,green_value);
digitalWrite(blue_led,blue_value);
}