from machine import Pin, PWM
from umqtt.simple import MQTTClient
from hcsr04 import HCSR04
import time
import machine
import micropython
import network
#red WIFI y contraseña
ssid = 'Wokwi-GUEST'
wifipassword = ''
#datos de broker server y puerto
mqtt_server= 'io.adafruit.com'
port= 1883
user= 'facu_paz'
password= 'aio_YxRt74WZYDSxcw3ImJpBsD7z0oQl'
#ID y topicos
client_id= 'MiSensor1'
topic_SENSOR= 'facu_paz/feeds/distancias'
topic_LEDs= 'facu_paz/feeds/Salida'
sensor_ACTIVO=False
ledRojo1=Pin(18, Pin.OUT)
ledAmarillo=Pin(17, Pin.OUT)
ledVerde=Pin(7, Pin.OUT)
#modo station (conexion a access point)
sta_if = network.WLAN (network.STA_IF)
sta_if.active (True)
#conexion al wifi
sta_if.connect (ssid, wifipassword)
print ("Conectando")
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print ("Conectado a WIFI!")
#ver IP
print(sta_if.ifconfig())
#publicacion en topico suscripto
def callback_salida (topic, msg):
dato= msg.decode('utf-8')
topicrec=topic.decode('utf-8')
print ("Mensaje en topico "+topicrec+":"+dato)
if topicrec==Salida and "ON" in dato:
sensor_ACTIVO=True
ledVerde.value(True)
if topirec==Salida and "OFF" in dato:
sensor_ACTIVO=False
ledVerde.value(False)
ledRojo.value(False)
ledAmarillo.value(False)
#intentar conectarse al MQTT
try:
conexionMQTT = MQTTClient(client_id, mqtt_server,user=user,password=password,port=int(port))
conexionMQTT.set_callback(callback_salida)
conexionMQTT.connect()
conexionMQTT.subscribe(topic_Salida)
print("Conectado con Broker MQTT")
except OSError as e:
#Si fallo la conexion, reiniciamos todo
print("Fallo la conexion al Broker, reiniciando...")
time.sleep(5)
machine.reset()
#Armamos un loop infinito que chequea por mensajes nuevos
#y verifica distancias
while True:
sensor = HCSR04(trigger_pin=33, echo_pin=32)
distance = sensor.distance_cm()
conexionMQTT.publish(topic_distancias,str(distance))
print ('distancia: ', distance, 'cm')
if distance<51 and distance>30:
ledVerde.value(True)
ledRojo.value(False)
ledAmarillo.value(False)
while distance<=30 and distance>15:
ledVerde.value(False)
ledRojo.value(False)
ledAmarillo.value(True)
if distance<=15:
ledVerde.value(False)
ledRojo.value(True)
ledAmarillo.value(False)
while True:
#Si se produce una excepcion, por ejemplo se corta el wifi
#o perdemos la conexion MQTT, simplemente vamos a reiniciar
#el micro para que comience la secuencia nuevamente, asi que
#usamos un bloque Try+Except
try:
#Tenemos que verificar si hay mensajes nuevos publicados por el broker
conexionMQTT.check_msg()
time.sleep_ms(500)
except OSError as e:
print("Error ",e)
time.sleep(5)
machine.reset()