# =======================================
# Control de riego automático extendido
# Raspberry Pi Pico - MicroPython + OLED
# Autor: CAHV (2025-08-16)
# =======================================
from machine import Pin, ADC, I2C
from time import sleep, ticks_ms
from ssd1306 import SSD1306_I2C
# --- Pines ---
sensor = ADC(Pin(26)) # GP26 = ADC0
relay = Pin(15, Pin.OUT) # GP15 controla relay
# --- OLED I2C ---
# Conecta OLED: VCC=3.3V, GND=GND, SDA=GP4, SCL=GP5
WIDTH = 128
HEIGHT = 64
i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000)
print("Dispositivos I2C detectados:", [hex(addr) for addr in i2c.scan()])
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c, addr=0x3C)
oled.fill(0)
oled.text("OLED lista!", 0, 0)
oled.show()
# --- Calibración del sensor ---
DRY_REF = 60000 # suelo seco
WET_REF = 30000 # suelo húmedo
# --- Umbrales de control ---
ON_THRESHOLD = 35 # Enciende bomba si humedad% < 35
HYSTERESIS = 7 # Apaga cuando suba por encima de 42
MIN_ON_TIME = 5000 # 5 segundos mínimo encendido
# --- Estado interno ---
pump_on = False
last_on_time = 0
print("Sistema de riego automático listo...")
def raw_to_percent(raw):
"""Convierte lectura cruda (0–65535) a % humedad según calibración."""
raw = max(min(raw, DRY_REF), WET_REF)
pct = int((DRY_REF - raw) * 100 / (DRY_REF - WET_REF))
return max(0, min(100, pct))
def set_pump(state):
"""Enciende/apaga la bomba vía relay."""
global pump_on, last_on_time
if state and not pump_on:
relay.value(1)
pump_on = True
last_on_time = ticks_ms()
print("Bomba ENCENDIDA")
elif not state and pump_on:
relay.value(0)
pump_on = False
print("Bomba APAGADA")
def actualizar_oled(humedad, pump_on):
"""Muestra datos en pantalla OLED"""
oled.fill(0) # limpiar pantalla
oled.text("Riego Automatico", 0, 0)
oled.text(f"Humedad: {humedad:3d}%", 0, 20)
estado = "BOMBA: ON " if pump_on else "BOMBA: OFF"
oled.text(estado, 0, 40)
oled.show()
while True:
raw = sensor.read_u16()
humedad = raw_to_percent(raw)
off_threshold = ON_THRESHOLD + HYSTERESIS
print(f"RAW={raw} HUM%={humedad} Pump={pump_on}")
if not pump_on:
if humedad < ON_THRESHOLD:
set_pump(True)
else:
elapsed = ticks_ms() - last_on_time
if humedad > off_threshold and elapsed >= MIN_ON_TIME:
set_pump(False)
# Actualizar OLED
actualizar_oled(humedad, pump_on)
sleep(1)