#Librerias importadas
from machine import Pin, I2C, PWM, time_pulse_us
import dht
import time
import ssd1306
# Definición de pines
bomba1 = Pin(13, Pin.OUT)
bomba2 = Pin(17, Pin.OUT)
valvula = Pin(14, Pin.OUT)
ventilador = Pin(25, Pin.OUT)
TRIG = Pin(33, Pin.OUT)
ECHO = Pin(32, Pin.IN)
sensor_nivel = Pin(18, Pin.IN, Pin.PULL_DOWN)
# Inicializacion de la pantalla OLED
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# Sensor de temperatura y humedad
sensor = dht.DHT22(Pin(15))
# Configuracion del Servo motor
servo = PWM(Pin(23))
servo.freq(50)
# Definicion de pines para el Teclado
filas = [2, 4, 5, 19]
columnas = [12, 27, 26, 25]
pines_Filas = [Pin(pin, mode=Pin.OUT) for pin in filas]
pines_Columnas = [Pin(pin, mode=Pin.IN, pull=Pin.PULL_DOWN) for pin in columnas]
teclas = [['1', '2', '3', 'A'], ['4', '5', '6', 'B'], ['7', '8', '9', 'C'], ['*', '0', '#', 'D']]
# Estado de dispositivos
estado_dispositivos = {"1": 0, "2": 0, "3": 0, "4": 0, "5": 0, "riego": 0}
estado_modo = None
bomba_seleccionada = None
dispositivos_nombres = {
"1": "Bomba 1",
"2": "Bomba 2",
"3": "Ventilador",
"4": "Servo",
"5": "Válvula",
"riego": "Riego"
}
# Funcion par medir el nivel del tanque con el sensor ultrasonico
def medir_distancia():
TRIG.off()
time.sleep_us(2)
TRIG.on()
time.sleep_us(10)
TRIG.off()
duracion = time_pulse_us(ECHO, 1)
distancia_cm = (duracion * 0.0343) / 2
nivel_porcentaje = max(0, min(100, ((400 - distancia_cm) / (400 - 2)) * 100))
return nivel_porcentaje
#Funcion para mover el servo
def mover_servo(angulo):
duty = int((angulo / 180) * 2000 + 500) # calculo del ciclo de trabajo, rango limites de posicion del servo
servo.duty_u16(duty) # funcion envia la señal PWM
ventilador.value(1 if angulo == 180 else 0)
#Funcion para escanear teclas
def escanear_tecla():
tecla_presionada = None
for fila_index in range(4):
pines_Filas[fila_index].on()
time.sleep_us(10)
for col_index in range(4):
if pines_Columnas[col_index].value():
tecla_presionada = teclas[fila_index][col_index]
pines_Filas[fila_index].off()
time.sleep_us(10)
return tecla_presionada
#Funcion para ingresar clave
def ingresar_clave():
clave_ingresada = ""
while len(clave_ingresada) < 3:
tecla = escanear_tecla()
if tecla:
clave_ingresada += tecla
time.sleep(0.5)
return clave_ingresada == "123"
# Función para controlar el llenado del tanque
def control_llenado_tanque():
nivel_porcentaje = medir_distancia() # Medir nivel actual del tanque
if sensor_nivel.value() == 1: # Si el sensor digital de nivel está activado
print("⚠️ Sensor digital ACTIVADO. Parando llenado.")
valvula.off()
elif nivel_porcentaje < 50: # Si el nivel está por debajo del 50%
print("🚰 Nivel bajo, válvula de llenado ACTIVA.")
valvula.on()
elif nivel_porcentaje >= 80: # Si el nivel alcanza el 80%
valvula.off()
else:
print("ℹ️ La válvula permanece en su estado actual.")
# Inicio del sistema
print("🔧 INGRESAR USUARIO")
while not ingresar_clave():
print("🚫 USUARIO INCORRECTO, intente de nuevo")
time.sleep(1)
print("✅ USUARIO CORRECTO, selecciona modo: [A] Automático | [B] Manual")
while estado_modo not in ["A", "B"]:
estado_modo = escanear_tecla()
if estado_modo == "A": # Selección de bomba solo al iniciar el sistema en automático
print("Selecciona la bomba: [1] Bomba 1 | [2] Bomba 2")
while bomba_seleccionada not in ["1", "2"]:
tecla = escanear_tecla()
if tecla in ["1", "2"]:
bomba_seleccionada = tecla
print(f"✅ SISTEMA EN AUTOMATICO con Bomba {bomba_seleccionada} seleccionada")
#visualizacion OLED
oled.fill(0)
oled.text("Automático", 10, 10)
oled.show()
while True:
tecla = escanear_tecla()
sensor.measure()
temperatura = sensor.temperature()
humedad = sensor.humidity()
nivel_porcentaje = medir_distancia()
control_llenado_tanque() # Llamar la función para controlar el llenado del tanque
time.sleep(1)
if tecla == "*": # Salir de cualquier modo
estado_dispositivos = {k: 0 for k in estado_dispositivos}
bomba1.off()
bomba2.off()
ventilador.off()
mover_servo(0)
valvula.off()
print("🚫 EMERGENCIA ACTIVA")
oled.fill(0)
oled.text("🚨emergencia activa", 10, 10)
oled.text("Eqipos apagados", 10, 25)
oled.show()
# Bloquear reinicio hasta ingresar clave
print("🔐 INGRESA USUARIO para reiniciar el sistema")
while not ingresar_clave():
print("🚫 USUARIOINCORRECTO, intenta nuevamente")
time.sleep(1)
print("✅ USUARIO CORRECTO, sistema reiniciado")
if tecla == "#": # Salir de cualquier modo
estado_dispositivos = {k: 0 for k in estado_dispositivos}
bomba1.off()
bomba2.off()
ventilador.off()
mover_servo(0)
valvula.off()
print("🚫 EQUIPOS APAGADOS")
print("⚡ Saliendo del modo actual. Selecciona modo: [A] Automático | [B] Manual")
estado_modo = None
while estado_modo not in ["A", "B"]:
estado_modo = escanear_tecla()
print(f"🔧 Modo seleccionado: {'Automático' if estado_modo == 'A' else 'Manual'}")
if estado_modo == "A": # Selección de bomba solo cuando cambias de manual a automático
bomba_seleccionada = None # Asegurar que el usuario elija una bomba antes de iniciar el sistema
print("Selecciona la bomba: [1] Bomba 1 | [2] Bomba 2")
while bomba_seleccionada not in ["1", "2"]:
tecla = escanear_tecla()
if tecla in ["1", "2"]:
bomba_seleccionada = tecla
print(f"✅ SISTEMA EN AUTOMATICO con Bomba {bomba_seleccionada} seleccionada")
sensor.measure()
temperatura = sensor.temperature()
humedad = sensor.humidity()
nivel_porcentaje = medir_distancia()
if estado_modo == "B": # Modo Manual
if tecla:
if tecla in estado_dispositivos:
estado_dispositivos[tecla] = 1 - estado_dispositivos[tecla]
estado = "ENCENDIDO" if estado_dispositivos[tecla] else "APAGADO"
print(f"🔘 {dispositivos_nombres[tecla]} {estado}")
elif tecla == "6": # Activar/desactivar riego
estado_dispositivos["riego"] = 1 - estado_dispositivos["riego"]
bomba1.value(estado_dispositivos["riego"])
estado_riego = "Activado" if estado_dispositivos["riego"] else "Desactivado"
print(f"💦 Riego {estado_riego}")
oled.fill(0)
oled.text(f"Modo: {'Automático' if estado_modo == 'A' else 'Manual'}", 10, 10)
oled.text(f"Temp: {temperatura:.1f}°C", 10, 25)
oled.text(f"Humedad: {humedad:.1f}%", 10, 40)
oled.text(f"Nivel tanque: {nivel_porcentaje:.1f}%", 10, 55)
oled.show()
if estado_modo == "A": # Modo Automático
if nivel_porcentaje < 15:
print("⚠️ BAJO Nivel EN TK ALMACENAMIENTO. Bloqueando activación de bombas.")
bomba1.off()
bomba2.off()
# Mostrar alerta en OLED
oled.fill(0)
oled.text("🚨 Bloqueo activado!", 10, 10)
oled.text("Nivel bajo", 10, 25)
oled.show()
else:
bomba_activada = bomba1 if bomba_seleccionada == "1" else bomba2
print(f"🌡️ Temp: {temperatura}°C")
print(f"💧 Humedad: {humedad}% ")
print(f"🛢️ Nivel del tanque: {nivel_porcentaje:.1f}%")
if temperatura >= 40:
bomba_activada.on()
mover_servo(180)
ventilador.on()
print("COMPUERTA ABIERTA y VENTILADOR ACTIVADO")
if temperatura >= 20 and humedad <= 40:
bomba_activada.on()
print("RIEGO ACTIVADO")
if temperatura <= 15 and humedad >= 60:
bomba_activada.off()
print("RIEGO DESACTIVADO")
if temperatura <= 15 and humedad <= 40:
bomba_activada.on()
time.sleep(0.1)
print("RIEGO ACTIVADO por HUMEDAD durante 1 seg")
bomba_activada.off()
time.sleep(0.2)
Riego Activado
Peligro
Alta temperatura
Bomba 1 o 2
Encendida
Riego Desactivado
Ventilador de
refrigeración
Válvula de Llenado
Activada