//By La Vale y La Jocelyn
//
//
#include <Wire.h>
#include <Servo.h>
#include <DHT.h> //Librerias importadas
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#define DHTPIN 5
#define DHTTYPE DHT22 // Tipo de sensor
#define soilMoisturePin 5 // Pin analógico donde está conectado el sensor de humedad en el suelo
#define pumpPin 8 // Pin digital conectado a la bomba de agua
#define LDR_PIN 1 // Pin analógico donde está conectado el sensor de luz
#define ledPin 9 // Pin digital conectado a las luces LED
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(DHTPIN, DHTTYPE); // Sensor de temperatura y humedad DHT22
const int buzzerPin = 4; // Buzzer o Bocina
const int ledGreenPin = 2; // LED Verde
const int ledOrangePin = 3; // LED Naranja
const int ledVioletPin = A0; // LED Ultravioleta
const int potPin = A1; // Potenciómetro
const int trigPin = A2; // Pin del sensor ultrasónico - Trigger
const int echoPin = A3; // Pin del sensor ultrasónico - Echo
int potValue = 0; // Variable para almacenar el valor del potenciómetro
int ledIntensity = 0; // Variable para almacenar la intensidad del LED
long duration; // Variable para almacenar el tiempo de viaje de la onda ultrasónica
float distance; // Variable para almacenar la distancia medida por el sensor ultrasónico
// Variables para almacenar valores
float temperature; // Variable para almacenar la temperatura
float humidity; // Variable para almacenar la humedad
int riegoHour; // Variable para almacenar la hora de riego
int riegoMinute; // Variable para almacenar el minuto de riego
const byte ROW_NUM = 4; // Cuatro filas
const byte COLUMN_NUM = 4; // Cuatro columnas
// Definición del teclado numérico
char keys[ROW_NUM][COLUMN_NUM] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte pin_rows[ROW_NUM] = {13, 12, 11, 10}; // Pines de las filas
byte pin_column[COLUMN_NUM] = {9, 8, 7, 6}; // Pines de las columnas
Keypad keypad(makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM); // Inicializar el teclado
void setup() {
pinMode(pumpPin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(LDR_PIN, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(ledOrangePin, OUTPUT);
pinMode(ledGreenPin, OUTPUT);
lcd.begin(16, 2); // Inicializar el LCD
lcd.print("Invernadero"); // Mostrar un mensaje de bienvenida
Serial.begin(9600);
dht.begin();
pinMode(potPin, INPUT);
pinMode(ledVioletPin, OUTPUT);
}
void loop() {
// Mostrar la etiqueta de temperatura en el LCD
delay(30);
// Lectura de temperatura y humedad
float temperature = dht.readTemperature(); // Lectura de la temperatura en grados Celsius
float humidity = dht.readHumidity(); // Lectura de la humedad relativa
char key = keypad.getKey();
if (key == 'A') {
lcd.clear();
lcd.setCursor(0, 0); // Regresar el cursor a la primera línea del LCD
lcd.print("Temp: "); // Mostrar la etiqueta de temperatura en el LCD
lcd.print(temperature); // Mostrar la temperatura actual en el LCD
lcd.print(" C");
lcd.setCursor(0, 1); // Posicionar el cursor para mostrar la humedad en el LCD
lcd.print("Hum: "); // Mostrar la etiqueta de humedad en el LCD
lcd.print(humidity); // Mostrar la humedad actual en el LCD
lcd.print(" %");
}
// Control de temperatura y humedad
// Aquí puedes implementar el control automático de temperatura y humedad
// utilizando actuadores para calefacción, ventilación o riego.
// Lectura de la humedad del suelo
if (key == 'B') {
if (humidity < 40) {
lcd.clear();
digitalWrite(pumpPin, HIGH); // Activar la bomba de agua si la humedad es baja
lcd.setCursor(0, 2);
lcd.print("Riego activado "); // Mostrar mensaje en el LCD
digitalWrite(ledGreenPin, HIGH);
delay(500);
digitalWrite(ledGreenPin, LOW);
} else {
digitalWrite(pumpPin, LOW); // Desactivar la bomba de agua si la humedad es suficiente
lcd.setCursor(0, 2);
lcd.print("Riego desactivado"); // Mostrar mensaje en el LCD
digitalWrite(ledOrangePin, HIGH);
delay(500);
digitalWrite(ledOrangePin, LOW);
}
}
// Control de riego automático
// Aquí puedes implementar el control automático de riego en función de la humedad del suelo
// y ajustar los tiempos y frecuencias de riego según tus necesidades.
// Lectura de la luz ambiental
if(key == 'C'){
lcd.clear();
int lightSensorValue = analogRead(LDR_PIN);
if (digitalRead(LDR_PIN) == LOW) {
lcd.setCursor(0, 3);
lcd.print("Light!");
digitalWrite(ledVioletPin, LOW);
} else {
lcd.setCursor(0, 3);
lcd.print("Dark!");
digitalWrite(ledVioletPin, HIGH);
}
}
if(key == 'D'){
lcd.clear();
// Lectura de la distancia con el sensor ultrasónico
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration * 0.034) / 2.0;
// Control de nivel del depósito de agua
// Mostrar mensajes en el LCD según el nivel de agua
lcd.setCursor(0, 3);
lcd.print(" "); // Limpiar la línea del LCD
if (distance > 40) {
lcd.clear();
lcd.setCursor(0, 3);
lcd.print("Nivel: Vacio");
tone(buzzerPin, 999,1000);
} else if (distance <= 30 && distance > 20) {
lcd.setCursor(0, 3);
lcd.print("Nivel: Mitad");
} else if (distance <= 10) {
lcd.setCursor(0, 3);
lcd.print("Nivel: Lleno");
}
}
delay(50); // segundos antes de la siguiente lectura
// Leer el valor del potenciómetro (rango entre 0 y 1023)
potValue = analogRead(potPin);
// Convertir el valor del potenciómetro (rango entre 0 y 1023) a la intensidad del LED (rango entre 0 y 255)
ledIntensity = map(potValue, 0, 1023, 0, 255);
// Establecer la intensidad del LED usando la función analogWrite()
analogWrite(ledVioletPin, ledIntensity);
}