// =================================================
// ADAPTADO A ESP32 (38 pines)
// Sistema de riego automatico
// Librerias necesarias (Gestor de librerias del IDE):
// - LiquidCrystal I2C (Frank de Brabander)
// - Adafruit LED Backpack Library
// - Adafruit GFX Library (dependencia de la anterior)
// Board: "ESP32 Dev Module" en el IDE de Arduino
// =================================================
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "Adafruit_LEDBackpack.h"
// Variables
int SUELO = 0;
int PORCEN = 0;
// Valores para calibrar el sensor (validos porque fijamos el ADC a 10 bits)
int VALOR_SECO = 850;
int VALOR_MOJADO = 350;
// =================================================
// PINES (reasignados a GPIO validos del ESP32)
// =================================================
const int pinSensorHumedad = 34; // GPIO34 = entrada analogica (ADC1, solo entrada)
const int motorIN1 = 26; // antes pin 6
const int motorIN2 = 27; // antes pin 7
const int pinSDA = 21; // I2C por defecto del ESP32
const int pinSCL = 22;
// Pantalla LCD (misma direccion que ya usabas: 39 decimal = 0x27)
LiquidCrystal_I2C lcd_1(0x27, 16, 2);
// Display de 7 segmentos
Adafruit_7segment led_display1 = Adafruit_7segment();
void setup()
{
Serial.begin(115200);
// I2C explicito (SDA, SCL)
Wire.begin(pinSDA, pinSCL);
// El ESP32 tiene ADC de 12 bits (0-4095); lo fijamos a 10 bits
// para no tener que recalcular VALOR_SECO / VALOR_MOJADO
analogReadResolution(10);
// Iniciar pantalla LCD
lcd_1.init();
lcd_1.backlight();
// Configurar entradas y salidas
pinMode(pinSensorHumedad, INPUT);
pinMode(motorIN1, OUTPUT);
pinMode(motorIN2, OUTPUT);
// Iniciar display de 7 segmentos
led_display1.begin(0x70); // 112 decimal = 0x70
// Mensaje inicial
lcd_1.setCursor(3, 0);
lcd_1.print("SISTEMA DE ");
lcd_1.setCursor(0, 1);
lcd_1.print("RIEGO AUTOMATICO");
delay(5000);
// Limpiar LCD
lcd_1.clear();
}
void loop()
{
// Leer el sensor de humedad
SUELO = analogRead(pinSensorHumedad);
// Convertir la lectura a porcentaje
PORCEN = map(SUELO, VALOR_SECO, VALOR_MOJADO, 0, 100);
// Evitar valores menores de 0 o mayores de 100
PORCEN = constrain(PORCEN, 0, 100);
// Mostrar porcentaje en LCD
lcd_1.setCursor(0, 0);
lcd_1.print("HUMEDAD: ");
lcd_1.print(PORCEN);
lcd_1.print("% ");
// Ubicacion del mensaje
lcd_1.setCursor(0, 1);
// Evaluar la humedad
if (PORCEN > 70)
{
// Tierra mojada
lcd_1.print("TIERRA MOJADA ");
// Apagar motor
digitalWrite(motorIN1, LOW);
digitalWrite(motorIN2, LOW);
}
else if (PORCEN > 35)
{
// Tierra humeda
lcd_1.print("TIERRA HUMEDA ");
// Apagar motor
digitalWrite(motorIN1, LOW);
digitalWrite(motorIN2, LOW);
}
else
{
// Tierra seca
lcd_1.print("T SECA REGAR! ");
// Activar motor
digitalWrite(motorIN1, LOW);
digitalWrite(motorIN2, HIGH);
}
delay(1000);
// Limpiar display de 7 segmentos
led_display1.clear();
led_display1.writeDisplay();
}