// Librerías
#include <DHT.h> // Librería para sensor DHT
#include <LiquidCrystal.h> // Librería para pantalla LCD
#include <WiFi.h> // Librería para conectarse a Wi-Fi
#include <HTTPClient.h> // Librería para hacer solicitudes HTTP
// Pines y configuraciones
#define DHTPIN 4 // Pin donde está conectado el sensor DHT
#define DHTTYPE DHT11 // Tipo de sensor (DHT11 o DHT22)
#define Humedadsuelo 34 // Pin para sensor de humedad del suelo
#define LDR_PIN 35 // Pin para el fotorresistor (LDR)
#define Pin_rele 26 // Pin donde está conectado el relé
#define TRIG_PIN 13 // Pin TRIG del sensor ultrasónico
#define ECHO_PIN 12 // Pin ECHO del sensor ultrasónico
#define BUZZER_PIN 33 // Pin para un posible buzzer de alarma
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Configuración de pines para la pantalla LCD
// Umbrales
float minhumedadsuelo = 21.0; // Umbral de humedad mínima del suelo (en porcentaje)
float maxTemp = 30.0; // Umbral de temperatura máxima (en grados Celsius)
float luzLDR = 3000; // Umbral para la luz solar (LDR)
float minagua = 2.0; // Nivel mínimo de agua en cm
float maxagua = 11.0; // Distancia máxima para depósito vacío (en cm)
bool aguabaja = false; // Estado del sensor de nivel de agua
// Variables para el Wi-Fi y Twilio
const char* ssid = "VTR-6936146";
const char* password = "v6fXpdkmxjzd";
const String TWILIO_SID = "ACa58eba05f1dfee79ba1048c8162618e1";
const String TWILIO_AUTH_TOKEN = "1937d197ccdc921c37dfc639b84404e0";
const String FROM_PHONE = "+14155238886"; // Número Twilio
const String TO_PHONE = "+56941877264"; // Número del usuario
void setup() {
Serial.begin(115200);
// Inicialización de sensores
dht.begin();
pinMode(Humedadsuelo, INPUT);
pinMode(LDR_PIN, INPUT);
pinMode(Pin_rele, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Inicialización de la pantalla LCD
lcd.begin(16, 2);
lcd.print("Iniciando...");
// Conexión a Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Conectando a Wi-Fi...");
}
Serial.println("Wi-Fi conectado");
lcd.clear();
lcd.print("Sistema listo");
}
void loop() {
// Paso 1: Monitorear condiciones ambientales
float temperatura = dht.readTemperature();
float humedad = dht.readHumidity();
// Mostrar datos en LCD
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperatura);
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(humedad);
// Paso 2: Detección de humedad del suelo
int soilMoistureValue = analogRead(Humedadsuelo);
float soilMoisturePercent = map(soilMoistureValue, 0, 4095, 0, 100);
Serial.print("Humedad del suelo: ");
Serial.println(soilMoisturePercent);
// Paso 3: Evaluación de condiciones para el riego
if (temperatura > maxTemp && soilMoisturePercent < minhumedadsuelo) {
// Condiciones para activar el riego
digitalWrite(Pin_rele, HIGH); // Enciende la bomba
lcd.clear();
lcd.print("Riego activado!");
delay(5000); // Simula riego por 5 segundos
digitalWrite(Pin_rele, LOW); // Apaga la bomba
lcd.clear();
lcd.print("Riego completado");
} else {
// Las condiciones NO son adecuadas para el riego
lcd.clear();
lcd.print("Condiciones NO OK");
delay(5000); // Espera antes de la próxima verificación
}
// Paso 4: Verificar nivel de agua con ultrasónico
float distance = getUltrasonicDistance();
float waterLevel = maxagua - distance; // Calculamos el nivel de agua
if (waterLevel < minagua && !aguabaja) { // Si el nivel de agua es bajo
aguabaja = true;
sendTwilioMessage("Nivel bajo de agua! Requiere recarga.");
tone(BUZZER_PIN, 1000, 2000); // Activa alarma si lo deseas
lcd.clear();
lcd.print("Poca agua!");
}
// Esperar antes de la próxima iteración
delay(10000);
}
// Función para obtener la distancia del sensor ultrasónico
float getUltrasonicDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2; // Convertir el tiempo a distancia en cm
return distance;
}
// Función para enviar mensaje con Twilio
void sendTwilioMessage(String message) {
if(WiFi.status() == WL_CONNECTED) {
HTTPClient http;
String url = "https://api.twilio.com/2010-04-01/Accounts/" + TWILIO_SID + "/Messages.json";
String data = "To=" + TO_PHONE + "&From=" + FROM_PHONE + "&Body=" + message;
http.begin(url);
http.setAuthorization(TWILIO_SID.c_str(), TWILIO_AUTH_TOKEN.c_str());
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
int httpResponseCode = http.POST(data);
if (httpResponseCode > 0) {
Serial.println("Mensaje enviado con éxito");
} else {
Serial.println("Error al enviar el mensaje");
}
http.end();
}
}