from machine import Pin, I2C, PWM, time_pulse_us
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 de nivel digital (Seguridad de llenado)
sensor_nivel = Pin(18, Pin.IN)
# Válvula de llenado del tanque
valvula = Pin(27, Pin.OUT)
# Interruptor para modo manual/automático
modo = Pin(19, Pin.IN, Pin.PULL_DOWN)
# Botones para activar manualmente las bombas
boton_bomba1 = Pin(5, Pin.IN, Pin.PULL_DOWN)
boton_bomba2 = Pin(4, Pin.IN, Pin.PULL_DOWN)
# Asignación de pines para OLED
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# Configuración del sensor DHT22
sensor = dht.DHT22(Pin(15))
# Configuración del servo en el pin 23
servo = PWM(Pin(23))
servo.freq(50)
# Definir salida para modo automático en el pin 26
modo_automatico_salida = Pin(26, Pin.OUT)
# Definir el pin 25 para el ventilador de refrigeración
ventilador = Pin(25, Pin.OUT)
# Configuración del sensor ultrasónico HC-SR04
TRIG = Pin(32, Pin.OUT)
ECHO = Pin(33, Pin.IN)
def mover_servo(angulo):
"""Convierte el ángulo en el duty cycle correcto para el servo y controla el ventilador."""
duty = int((angulo / 180) * 2000 + 500)
servo.duty_u16(duty)
if angulo == 180:
ventilador.on() # 🔥 Encender ventilador cuando el servo esté en 180°
print("🌀 Ventilador activado (Servo 180°)")
elif angulo == 0:
ventilador.off() # ❄️ Apagar ventilador cuando el servo regrese a 0°
print("❄️ Ventilador apagado (Servo 0°)")
while True:
sensor.measure()
temperatura = sensor.temperature()
humedad = sensor.humidity()
estado_modo = modo.value()
if emergencia.value() == 1:
print("🛑 EMERGENCIA ACTIVADA: APAGANDO TODO")
RiegoActivado.off()
RiegoDesactivado.on()
warmLed.off()
bomba1.off()
bomba2.off()
valvula.off()
ventilador.off()
modo_automatico_salida.off() # Apagar salida 26 en emergencia
mover_servo(0)
oled.fill(0)
oled.text("🚨 EMERGENCIA ACTIVADA", 10, 25)
oled.text("🔴 SISTEMA APAGADO", 10, 40)
oled.show()
continue
# 🟢 Control de salida en el pin 26
if estado_modo == 0: # 🔄 MODO AUTOMÁTICO
modo_automatico_salida.on()
print("⚙️ Salida 26 ACTIVADA en modo automático")
else: # 🖐️ MODO MANUAL (Parpadeo)
print("🔧 Salida 26 en modo manual (parpadeo)")
modo_automatico_salida.on()
time.sleep(0.001)
modo_automatico_salida.off()
time.sleep(0.005)
# 🌡️ Control del riego según temperatura
if temperatura < 15:
RiegoActivado.off()
RiegoDesactivado.on()
print("🌿 Riego desactivado por baja temperatura")
else:
RiegoActivado.on()
RiegoDesactivado.off()
print("💦 RIEGO ACTIVADO")
if temperatura > 35:
warmLed.on()
mover_servo(180) # 🔄 Activamos el ventilador de refrigeración
elif temperatura > 40:
print("🚨 TEMPERATURA EXTREMADAMENTE ALTA")
else:
warmLed.off()
mover_servo(0)
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)
if RiegoActivado.value() == 1:
oled.text("💦 RIEGO ACTIVADO", 10, 40)
oled.show()
time.sleep(3)