/*
PROYECTO GRUPO "A" FELIPE PARMEROLA / VICTOR BOSCO
La consigna para el trabajo final consiste en un sensor tipo fotoresistencia para medir la intensidad de luz ambiente y en base a esa medición, accionar uno de dos reles para subir o bajar una cortina tipo “roller black out” motorizada. Es decir, que se regula la posición de la cortina según el ingreso de luz natural.
La posición de la cortina será medida con un sensor de ultrasonido
Tambien contara con un teclado que permitirá seleccionar el modo de funcionamiento “manual / automatico” y en modo “manual”, se podrá accionar el motor de la cortina con 2 teclas para subir o bajar con limites de distancia proporcionada por el sensor ultrasónico antes mencionado
Por otro lado, el sistema contara con 1 sensor de humedad instalado en el jardín de la casa de modo que cuando la humedad de la tierra baje de cierto valor, accione 2 salidas, una para un rele de bomba de riego y otro para una válvula. Este sistema estará habilitado en horario nocturno solamente
Medición de Iluminación ambiente
Este programa utiliza una LDR (resistor dependiente de la luz) para medir la iluminación ambiente.
La lectura analógica de la LDR se convierte en un valor de lux.
Conexiones:
- Un extremo de la LDR se conecta al pin analógico A0.
- El otro extremo de la LDR se conecta a VCC (5V) del Arduino.
- Un extremo del resistor de 10kΩ se conecta al pin analógico A0.
- El otro extremo del resistor de 10kΩ se conecta a GND del Arduino.
*/
#include <NewPing.h> // Importa la librería NewPing para el sensor ultrasónico HC-SR04. HAY QUE DESCARGAR LA LIBRERIA
#include <Keypad.h> // Importa la librería Keypad para el teclado matricial. HAY QUE DESCARGAR LA LIBRERIA
#include <Wire.h>
const int humedadPin = A1; // Pin analógico para el sensor de humedad
const int bbarelePin = 1; // Pin 1 para el relé de la bomba de riego y la valvula
const int pinLDR = A0; // Define el pin analógico al que está conectada la LDR
const int pinD12 = 12; // Define el pin digital 12
const int pinD13 = 13; // Define el pin digital 13
const byte ROWS = 2; // 2 filas en el teclado
const byte COLS = 2; // 2 columnas en el teclado
char key;
// Define los pines para el sensor ultrasónico
#define triggerPin 8
#define echoPin 9
NewPing sonar(triggerPin, echoPin); // Crea un objeto NewPing asociado al sensor ultrasonico
// Definición de las teclas en el teclado matricial
char keys[ROWS][COLS] = {
{'MANUAL','AUTOMATICO'},
{'SUBIR','BAJAR'}
};
// Definición de pines de las filas y columnas del teclado
byte rowPins[ROWS] = {5, 4}; // Conectar a los pines de fila del teclado
byte colPins[COLS] = {7, 6}; // Conectar a los pines de columna del teclado
// Crear un objeto de tipo Keypad CONSULTAR!!!!
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
// Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //consultar sobre esta sentencia de ChatGPT
int modo = 1; // Variable para el modo (0 para manual, 1 para automático)
void setup() {
Serial.begin(9600); // Inicia la comunicación serial
pinMode(bbarelePin, OUTPUT); //Pin 1 para el relé de la bomba de riego y la valvula
// pinMode(pinLDR, INPUT); // Configura A0 como entrada analógica Estaba en el ejemplo pero no seria necesario. Ver porque????
pinMode(pinD12, OUTPUT); // Configura D12 como salida digital
pinMode(pinD13, OUTPUT); // Configura D13 como salida digital
}
void loop() {
int valorLDR = analogRead(pinLDR); // Lee el valor analógico de la LDR conectada en A0
// Convierte el valor analógico a porcentaje (valor aproximado)
float porcentaje = (valorLDR / 1023.0) * 100;
// Imprime el valor de iluminación en porcentaje en el puerto serie
// Serial.print("Nivel de Iluminacion (%): ");
// Serial.println(porcentaje);
// Espera un breve periodo antes de la siguiente lectura
delay(1000);
// Tomamos el valor del rango entre 50% y 60% como umbral para determinar si la cortina tiene que subir o bajar
// Cuando la lectura sea menor a 50% debera subir la cortina
// Cuando la lectura sea mayor a 60% debera bajar la cortina
// La salida 12 sera definida como digital y accionara el rele de subir cortina
// La salida 13 sera definida como digital y accionara el rele de bajar cortina
if (modo = 1) { // modo = 1 = AUTOMATICO
if (porcentaje > 60) {
// Si el porcentaje es mayor al 60%, activa la salida en D13
digitalWrite(pinD13, HIGH);
digitalWrite(pinD12, LOW); // Asegúrate de que D12 esté apagado
} else if (porcentaje < 50) {
// Si el porcentaje es menor al 50%, activa la salida en D12
digitalWrite(pinD12, HIGH);
digitalWrite(pinD13, LOW); // Asegúrate de que D13 esté apagado
} else {
// En otros casos, asegúrate de que ambas salidas estén apagadas
digitalWrite(pinD12, LOW);
digitalWrite(pinD13, LOW);
}
}
// Mide la distancia con el sensor ultrasónico HC-SR04
unsigned int distancia = sonar.ping_cm();
// Usamos la distancia para tomar decisiones adicionales, por ejemplo, detener la cortina para que no se pase ni para arriba ni para abajo
if (distancia < 10 || distancia > 90 ) {
// Se detiene el movimiento de la cortina si la distancia es menor a 10 cm o si es mayor a 90 cm
// Verificar PRIORIDADES si se escribe una salida en HIGH y LOW al mismo tiempo
digitalWrite(pinD12, LOW);
digitalWrite(pinD13, LOW);
}
//VER Y EDITAR
//key = keypad.getKey();
/*
char key = keypad.getKey();
if (key) {
switch (key) {
case 'Automatico':
// Presionar "Automatico" cambia el modo a automático (modo = 1)
modo = 1;
// Serial.println("Modo Automático"); OPCIONAL
break;
case 'Manual':
// Presionar "Manual" cambia el modo a manual (modo = 0)
modo = 0;
// Serial.println("Modo Manual"); OPCIONAL
break;
case 'Subir':
// Realiza la función "Subir"
if (modo = 0) {
while (keypad.getState() == HOLD) {
digitalWrite(12, HIGH); // Activa la salida 12 SUBIR mientras mantienes presionada la tecla
}
digitalWrite(12, LOW); // Desactiva la salida 12 SUBIR cuando sueltas la tecla
}
break;
case 'Bajar':
// Realiza la función "Bajar"
if (modo = 0) {
while (keypad.getState() == HOLD) {
digitalWrite(13, HIGH); // Activa la salida 13 BAJAR mientras mantienes presionada la tecla
}
digitalWrite(13, LOW); // Desactiva la salida 13 BAJAR cuando sueltas la tecla
}
break;
}
}
}
int humedad = analogRead(humedadPin);
// Define un valor de humedad umbral, por debajo del cual se enciende la bomba de riego
int humedadUmbral = 500;
if (humedad < humedadUmbral) {
// Activa la bomba de riego
digitalWrite(bbarelePin, HIGH);
} else {
// Apaga la bomba de riego
digitalWrite(bbarelePin, LOW);
}
}
*/
}