import micropython
import network
from umqtt.simple import MQTTClient
import dht
import machine
from machine import Pin, PWM
import time
# Indicamos la red WiFi y la clave
ssid = 'Wokwi-GUEST'
wifipassword = ''
# Indicamos datos MQTT Broker (server y puerto)
mqtt_server = 'io.adafruit.com'
port = 1883
user = 'FabioLeivaFens' # De Adafruit
password = 'aio_BbSU46lairhdOp2oJsYH2Ebs3G83' # LLave en Adafruit
# Indicamos ID (Único) y los dos tópicos
client_id = 'MiSistemaDeRiego'
Topic_Humidity = 'FabioLeivaFens/feeds/Sensor_DHT22'
Topic_Bomb = 'FabioLeivaFens/feeds/Estado_De_Bomba'
Topic_Alarm = 'FabioLeivaFens/feeds/Control_De_Alarma'
# Inicializamos el estado de la bomba
Bomba_Activa = False
Estado_Bomba = Pin(16, Pin.OUT)
Estado_Bomba.value(Bomba_Activa)
# Variables para temporizador
bomb_start_time = 0
bomb_max_duration_ms = 25000 # en milisegundos
# Definimos modo Station (conectarse a un Access Point Remoto)
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
# Conectamos al WIFI
sta_if.connect(ssid, wifipassword)
print("Conectando")
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print("Conectado a Wifi!")
EstadoWIFI = Pin(32, Pin.OUT)
EstadoWIFI.value(sta_if.isconnected())
# Vemos cuales son las IP
print(sta_if.ifconfig())
# Definimos una función callback para cada vez que se ejecuta un tópico
def callback_Bomba(topic, msg):
global Estado_Bomba, Bomba_Activa, bomb_start_time
dato = msg.decode('utf-8')
topicrec = topic.decode('utf-8')
# Los argumentos topic y msg vienen codificados en UTF-8, se deben convertir en strings
print("Mensaje en tópico " + topicrec + ":" + dato)
if topicrec == Topic_Bomb and "OFF" in dato:
Bomba_Activa = False
else:
Bomba_Activa = True
bomb_start_time = time.ticks_ms() # registramos el tiempo de inicio
Estado_Bomba.value(Bomba_Activa)
# Conexión al broker MQTT
try:
conexionMQTT = MQTTClient(client_id, mqtt_server, user=user, password=password, port=int(port))
conexionMQTT.set_callback(callback_Bomba) # Llamado a la función callback para recibir el broker mensajes
conexionMQTT.connect()
conexionMQTT.subscribe(Topic_Bomb) # Suscripción al tópico luego del connect
print("Conectado con Broker MQTT")
except OSError as e:
# Por si falla la conexión, reinicio
print("Falló la conexión al Broker, reiniciando...")
time.sleep(5)
machine.reset()
SensorDHT = dht.DHT22(Pin(14))
Alarma = PWM(Pin(21), freq=1200, duty_u16=32768)
Alarma.duty(0)
EstadoAlarma = Pin(22, Pin.OUT)
Sonando = False
Instante = 1
incremento_humedad = 0 # Variable para incrementar la humedad
print("Comenzando control de la humedad del suelo, se regará por un porcentaje inferior al %60")
while True:
try:
conexionMQTT.check_msg()
time.sleep_ms(500)
SensorDHT.measure()
humedad = SensorDHT.humidity() + incremento_humedad
print("=> Humedad del suelo: " + str(humedad) + ", en el instante: " + str(Instante))
conexionMQTT.publish(Topic_Humidity, str(humedad))
Instante += 1
if humedad < 60 and not Bomba_Activa:
Sonando = True
Alarma.duty(512)
conexionMQTT.publish(Topic_Alarm, str(1))
else:
Sonando = False
Alarma.duty(0)
conexionMQTT.publish(Topic_Alarm, str(0))
EstadoAlarma.value(Sonando)
# Verificamos si la bomba ha estado activa por más del tiempo deseado
if Bomba_Activa and (time.ticks_diff(time.ticks_ms(), bomb_start_time) > bomb_max_duration_ms):
print("La bomba ha estado activa por más de lo esperado, desactivándola...")
Bomba_Activa = False
Estado_Bomba.value(Bomba_Activa)
conexionMQTT.publish(Topic_Bomb, "OFF")
# Incrementamos la humedad si la bomba está activa
if Bomba_Activa:
incremento_humedad += 1 # Ajusta el valor según sea necesario
time.sleep(5)
except OSError as e:
print("Falló al leer el sensor o publicar datos, reiniciando...")
time.sleep(5)
machine.reset()