from machine import Pin, I2C
import dht
import ujson
import time
import ssd1306
# Definición de pines
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) # Bomba de respaldo
# Sensor de nivel digital
sensor_nivel = Pin(18, Pin.IN)
# Variable para almacenar el último estado del nivel
lastNivel = None
# Función para encender solo un LED
def turnOnLed(led):
RiegoDesactivado.off()
RiegoActivado.off()
warmLed.off()
led.on()
# Asignación de pines para OLED
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
oled.text("RiegoActivado", 10, 10)
oled.show()
sensor = dht.DHT22(Pin(15))
lastMessage = None
while True:
sensor.measure()
temperatura = sensor.temperature()
humedad = sensor.humidity()
nivel = sensor_nivel.value() # Sensor digital: 0 (bajo), 1 (alto)
message = ujson.dumps({
"temp": temperatura,
"humidity": humedad,
"nivel": nivel
})
if lastMessage != temperatura:
lastMessage = temperatura
print(message)
if temperatura > 41:
turnOnLed(warmLed)
print("PELIGRO EN EL INVERNADERO")
elif 15 < temperatura < 40:
turnOnLed(RiegoActivado)
print("RIEGO ACTIVADO")
# Si el nivel de agua es bajo, activa solo **una** bomba
if nivel == 0:
if bomba1.value() == 0: # Si la bomba 1 está apagada, encenderla
bomba1.on()
print("BOMBA 1 ACTIVADA")
time.sleep(5)
# Comprobar si la bomba 1 sigue funcionando
if bomba1.value() == 0: # Si la bomba 1 falló, activar la bomba 2
bomba2.on()
print("BOMBA 2 ACTIVADA COMO RESPALDO")
else:
print("BOMBA 1 YA ESTÁ ENCENDIDA")
else:
bomba1.off()
bomba2.off()
print("BOMBAS DESACTIVADAS")
else:
turnOnLed(RiegoDesactivado)
print("RIEGO DESACTIVADO")
bomba1.off()
bomba2.off()
# 🔹 Mensaje solo si el nivel cambió 🔹
if nivel != lastNivel:
lastNivel = nivel
if nivel == 0:
print("⚠️ NIVEL BAJO: Se necesita agua")
else:
print("✅ NIVEL NORMAL: No se requiere agua")
time.sleep(1)