#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <Ultrasonic.h>
#include <LiquidCrystal_I2C.h>
// Pines para los sensores y actuadores
#define TRIGGER_PIN 15
#define ECHO_PIN 14
#define RELAY_PIN 12
#define LDR_PIN 34 // Cambia el número de pin según tu conexión
// Pines para los sensores de humedad del suelo
#define SOIL_MOISTURE_PIN_1 26
#define SOIL_MOISTURE_PIN_2 27
#define SOIL_MOISTURE_PIN_3 33
// Niveles de agua
#define EMPTY_LEVEL 5 // Ajusta según tu recipiente
#define MEDIUM_LEVEL 10 // Ajusta según tu recipiente
#define FULL_LEVEL 15 // Ajusta según tu recipiente
// Umbral de humedad para encender y apagar la bomba
#define HUMIDITY_THRESHOLD_ON 50
#define HUMIDITY_THRESHOLD_OFF 70
// Tiempo entre actualizaciones (milisegundos)
#define DISPLAY_UPDATE_INTERVAL 2000
#define CONSOLE_PRINT_INTERVAL 5000 // Ajusta este valor según tu preferencia
// Configurar la pantalla LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // Dirección I2C, 16x2 caracteres
// Configurar el sensor DHT
#define DHT_PIN 2
DHT dht(DHT_PIN, DHT22);
// Configurar el sensor ultrasónico HC-SR04
Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);
char displayBuffer[17]; // Buffer para mostrar en la pantalla (16 caracteres + NULL)
bool displayActive = false; // Bandera para controlar la activación de la pantalla
unsigned long lastDisplayChange = 0; // Último cambio de pantalla
String waterLevel; // Variable global para el nivel de agua
float humiditySoil1, humiditySoil2, humiditySoil3; // Variables globales para la humedad del suelo
bool isDaytime; // Variable global para determinar si es de día o de noche
void setup() {
Serial.begin(115200);
// Inicializar los sensores y la pantalla
dht.begin();
lcd.init();
lcd.backlight();
// Inicializar el relé
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW); // Apagar la bomba al inicio
pinMode(LDR_PIN, INPUT); // Configurar el pin del LDR como entrada analógica
// Inicializar los sensores de humedad del suelo
pinMode(SOIL_MOISTURE_PIN_1, INPUT);
pinMode(SOIL_MOISTURE_PIN_2, INPUT);
pinMode(SOIL_MOISTURE_PIN_3, INPUT);
}
void loop() {
// Leer valores de los sensores
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int lightLevel = analogRead(LDR_PIN); // Leer el valor del fotoresistor LDR
long distance = ultrasonic.read();
// Detectar si es de día o de noche
isDaytime = (lightLevel > 600); // Ajusta según tus necesidades
// Calcular nivel de agua
if (distance < EMPTY_LEVEL) {
waterLevel = "Vacío";
digitalWrite(RELAY_PIN, LOW); // No encender la bomba si el nivel de agua es bajo
} else if (distance < MEDIUM_LEVEL) {
waterLevel = "Medio";
} else {
waterLevel = "Lleno";
}
// Leer valores de los sensores de humedad del suelo
humiditySoil1 = analogRead(SOIL_MOISTURE_PIN_1) * 100.0 / 4095.0;
humiditySoil2 = analogRead(SOIL_MOISTURE_PIN_2) * 100.0 / 4095.0;
humiditySoil3 = analogRead(SOIL_MOISTURE_PIN_3) * 100.0 / 4095.0;
// Controlar la bomba de agua basada en la humedad del suelo
if (humidity < HUMIDITY_THRESHOLD_ON && (waterLevel == "Medio" || waterLevel == "Lleno")) {
digitalWrite(RELAY_PIN, HIGH); // Encender la bomba
snprintf(displayBuffer, sizeof(displayBuffer), "Regando");
} else if (humidity > HUMIDITY_THRESHOLD_OFF || waterLevel == "Vacío") {
digitalWrite(RELAY_PIN, LOW); // Apagar la bomba
snprintf(displayBuffer, sizeof(displayBuffer), "No regando");
}
// Cambiar el contenido que se muestra en la pantalla cada 2 segundos
unsigned long currentTime = millis();
if (currentTime - lastDisplayChange >= DISPLAY_UPDATE_INTERVAL) {
lastDisplayChange = currentTime;
displayActive = !displayActive; // Cambiar entre activar y desactivar la pantalla
updateLCD(); // Actualizar la pantalla LCD
}
// Imprimir valores en la consola cada 5 segundos
static unsigned long lastConsolePrint = 0;
if (currentTime - lastConsolePrint >= CONSOLE_PRINT_INTERVAL) {
lastConsolePrint = currentTime;
printToConsole();
}
}
// Función para actualizar el contenido de la pantalla LCD
void updateLCD() {
lcd.clear();
if (displayActive) {
// Mostrar humedad ambiental en la línea superior
lcd.setCursor(0, 0);
lcd.print("H: ");
lcd.print(dht.readHumidity());
lcd.print("%");
// Mostrar temperatura ambiental en la línea inferior
lcd.setCursor(0, 1);
lcd.print("T: ");
lcd.print(dht.readTemperature());
lcd.print("C");
} else {
// Mostrar nivel de agua en la línea superior
lcd.setCursor(0, 0);
lcd.print("Agua: ");
lcd.print(waterLevel);
// Mostrar estado de riego en la línea inferior
lcd.setCursor(0, 1);
lcd.print(displayBuffer);
}
}
// Función para imprimir valores en la consola
void printToConsole() {
Serial.println("=== Variables de Sensores ===");
Serial.print("Humedad ambiental: ");
Serial.print(dht.readHumidity());
Serial.println("%");
Serial.print("Temperatura ambiental: ");
Serial.print(dht.readTemperature());
Serial.println("°C");
Serial.print("Luz: ");
Serial.println(isDaytime ? "Día" : "Noche");
Serial.print("Nivel de agua: ");
Serial.println(waterLevel);
Serial.print("Humedad del suelo 1: ");
Serial.print(humiditySoil1);
Serial.println("%");
Serial.print("Humedad del suelo 2: ");
Serial.print(humiditySoil2);
Serial.println("%");
Serial.print("Humedad del suelo 3: ");
Serial.print(humiditySoil3);
Serial.println("%");
}