from hcsr04 import HCSR04
import machine
from machine import Pin
import time
import network
from umqtt.simple import MQTTClient
#Variables Nombre y Contraseña de la red a conectar
ssid = 'Wokwi-GUEST'
wifipass = ''
#Define el server MQTT y el puerto para MQTT(1883)
mqtt_server = 'io.adafruit.com'
port = 1883
#Usuario y contraseña otorgados por Adafruit para la conexion
user = 'msviet'
password = 'aio_vYQF03ig4FkCufH45AqUAH2UwILY'
#
client_id = 'TanqueDeAgua2510'
topic_LlenadoAut = 'msviet/feeds/llenado-automatico'
topic_NivelDeAgua = 'msviet/feeds/nivel-de-agua'
#Define el llenado automatico en False por defecto
LlenadoAut = False
#Seteamos la conexion a una Red Wifi e ingresamos los parametros ssid y wifipass
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect(ssid, wifipass)
#Verifica que la conexion sea exitosa.
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.5)
print("Connected.")
#Imprime informacion acerca de la red e IPs
print(sta_if.ifconfig())
#Funcion Callback que sera llamada cada vez que se produzca un publish en
#un topico Subscripto
def callback_LlenadoAut(topic, msg):
global LlenadoAut
#Decodifica los valores recibidos en utf-8 y los guarda variables
dato = msg.decode('utf-8')
topico = topic.decode('utf-8')
print("Cambio en: "+topico+":"+dato)
#Verifica el estado del topico LlenadoAut
if topico == topic_LlenadoAut and "ON" in dato:
LlenadoAut = True
print("verdadero")
else:
LlenadoAut = False
print("Falso")
#Conexion con el server MQTT
try:
conexionMQTT = MQTTClient(client_id, mqtt_server, user=user, password=password,port=int(port))
conexionMQTT.set_callback(callback_LlenadoAut)
conexionMQTT.connect()
conexionMQTT.subscribe(topic_LlenadoAut)
except OSError as e:
#Reinicia el sistema si falla la conexion
print("Fallo la Conexion con el Broker, Reiniciando....")
time.sleep(5)
machine.reset()
sensor = HCSR04(trigger_pin=3, echo_pin=2)
RelayActivo = Pin(4,Pin.OUT)
RelayActivo.value(0)
while True:
try:
#Checkea mensajes nuevos publicados por el Broker
conexionMQTT.check_msg()
time.sleep(4)
distancia = sensor.distance_cm()
conexionMQTT.publish(topic_NivelDeAgua, str(distancia))
#Verifica el encendido de el llenado automatico
if LlenadoAut:
#Verifica que la capacidad del Tanque de Agua sea igual o menor al 30%
if distancia <= 120:
#Setea el Relay en Normal Abierto para encender la Bomba de Agua
RelayActivo.value(1)
#print('Cambio True')
else:
#Verifica que la capacidad del Tanque de Agua sea igual o mayor al 90%
if distancia >= 360:
#Setea el Relay en Normal Cerrado apagando la Bomba de Agua
RelayActivo.value(0)
#print('Cambio False')
time.sleep(0.5)
except OSError as e:
print("Error...", e)
time.sleep(5)
machine.reset()