from machine import Pin, I2C, PWM
import dht
import ujson
import time
import ssd1306
# Definición de pines
emergencia = Pin(2, Pin.IN, Pin.PULL_DOWN)
RiegoDesactivado = Pin(13, Pin.OUT)
RiegoActivado = Pin(12, Pin.OUT)
warmLed = Pin(14, Pin.OUT)
# Bombas de agua
bomba1 = Pin(16, Pin.OUT)
bomba2 = Pin(17, Pin.OUT)
# Sensor ultrasónico
trig = Pin(32, Pin.OUT) # Pin para el pulso ultrasónico
echo = Pin(33, Pin.IN) # Pin que recibe el eco
# Interruptor para modo manual/automático
modo = Pin(19, Pin.IN, Pin.PULL_DOWN)
# Botones de bomba manual
boton_bomba1 = Pin(5, Pin.IN, Pin.PULL_DOWN)
boton_bomba2 = Pin(4, Pin.IN, Pin.PULL_DOWN)
# OLED
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# Sensor DHT22
sensor = dht.DHT22(Pin(15))
# Servo en el pin 23
servo = PWM(Pin(23))
servo.freq(50)
# Salida de modo automático y servo
modo_automatico_salida = Pin(26, Pin.OUT)
salida_servo = Pin(25, Pin.OUT)
# Valores de calibración del sensor ultrasónico (ajustar según mediciones reales)
nivel_lleno = 10 # Distancia en cm cuando el tanque está lleno
nivel_vacio = 40 # Distancia en cm cuando el tanque está vacío
def medir_nivel_ultrasonico():
"""Mide el nivel del agua con el sensor ultrasónico calibrado."""
trig.off()
time.sleep_us(2)
trig.on()
time.sleep_us(10)
trig.off()
while echo.value() == 0:
start_time = time.ticks_us()
while echo.value() == 1:
end_time = time.ticks_us()
duracion = time.ticks_diff(end_time, start_time)
distancia_cm = (duracion * 0.0343) / 2 # Conversión de tiempo a distancia
# Limitar valores dentro del rango calibrado
distancia_cm = min(max(distancia_cm, nivel_lleno), nivel_vacio)
# Convertir distancia en porcentaje de llenado
nivel_agua = 100 - ((distancia_cm - nivel_lleno) / (nivel_vacio - nivel_lleno) * 100)
return max(0, min(nivel_agua, 100))
def mover_servo(angulo):
duty = int((angulo / 180) * 2000 + 500)
servo.duty_u16(duty)
salida_servo.value(1 if angulo == 180 else 0)
while True:
sensor.measure()
temperatura = sensor.temperature()
humedad = sensor.humidity()
nivel_agua = medir_nivel_ultrasonico()
estado_modo = modo.value()
if emergencia.value():
print("🛑 EMERGENCIA ACTIVADA: ACTIVANDO RIEGO")
RiegoActivado.on()
RiegoDesactivado.off()
warmLed.on()
bomba1.on()
bomba2.on()
mover_servo(180)
continue
if estado_modo == 0:
modo_automatico_salida.on()
else:
modo_automatico_salida.on()
time.sleep(0.001)
modo_automatico_salida.off()
time.sleep(0.005)
if temperatura < 15:
RiegoActivado.off()
RiegoDesactivado.on()
else:
RiegoActivado.on()
RiegoDesactivado.off()
print(f"Nivel del agua: {nivel_agua:.2f}%")
oled.fill(0)
oled.text(f"Modo: {'Manual' if estado_modo == 1 else 'Automático'}", 10, 10)
oled.text(f"Temp: {temperatura}C", 10, 25)
oled.text(f"Humedad: {humedad}%", 10, 40)
oled.text(f"Nivel: {nivel_agua:.2f}%", 10, 55)
oled.show()
time.sleep(3)