"""
MicroPython IoT
Ejemplo de envío y recepción de datos mediante MQTT
La tarjeta tiene dos LED y dos botones, asignados uno a cada LED.
Al accionar el botón de cada LED se envía por MQTT un mensaje
indicando el nuevo estado
Además, se recibe el estado por MQTT, por lo que
todas las placas con este programa realizarán la
misma acción en los LEDs de la tarjeta.
Mensajes:
Para ver los datos recibidos:
1. Ir a http://www.hivemq.com/demos/websocket-client/
2. Pulsar "Connect"
3. En el botón Subscriptions, pulsar "Add New Topic Subscription"
4. In el campo Topic, teclear "wokwi-TEC_DEMO" y luego "Subscribe"
Este script está disponible en:
https://wokwi.com/projects/384093743523314689
"""
import network
from time import sleep
from machine import Pin
from umqtt.simple import MQTTClient
LED_ROJO = Pin(23, Pin.OUT)
LED_VERDE = Pin(22, Pin.OUT)
BOTON_ROJO = Pin (21, Pin.IN, Pin.PULL_UP)
BOTON_VERDE = Pin (19, Pin.IN, Pin.PULL_UP)
# Definimos dos variables para guardar el estado de los LED
# Inicializamos los LED apagandolos
ESTADO_ROJO = 0
LED_ROJO.off()
ESTADO_VERDE = 0
LED_VERDE.off()
# Parámetros de la red WiFi a usar
"""
# Este es el código para la tarjeta
# SSID Parameters
# Poner aquí el SSID y password de la red WiFi
SSID = 'SSID_ESTACION'
password='password'
"""
# Este es le SSID y Password para usar en Wokwi
# Cambiar si se usa en otra red
SSID='Wokwi-GUEST'
password=''
# MQTT Server Parameters
MQTT_CLIENT_ID = "TEC_Board_02"
MQTT_BROKER = "broker.mqttdashboard.com"
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_TOPIC = "wokwi-TEC_DEMO"
# Paso 1: Conexión a la red WiFi
# Enciende el LED rojo 1s, y lo mantiene encendido
# mientras realiza la conexión a la WiFi
LED_ROJO.on()
LED_VERDE.on()
ESTADO_ROJO = 1
ESTADO_VERDE = 1
sleep(1)
print("Conectandose a la WiFi")
red = network.WLAN(network.STA_IF)
red.active(True)
red.connect(SSID, password)
while not red.isconnected():
print(".", end="")
sleep(0.1)
print(" Conectado!")
# Realiza un parpadeo del LED rojo de 1s tras conectarse
# a la WiFi, y luego lo deja apagado
LED_ROJO.off()
sleep(1)
LED_ROJO.on()
sleep(1)
LED_ROJO.off()
sleep(1)
ESTADO_ROJO = 0
# Paso 2: Conexión al servidor MQTT
# Enciende el LED verde 1s, y lo mantiene encendido
# mientras realiza la conexión al servidor MQTT
print("Conectandose al servidor MQTT ... ")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.connect()
print("Conectado!")
# Realiza un parpadeo del LED verde de 1s al conectarse
# al servidor MQTT, y luego lo deja apagado
LED_VERDE.off()
sleep(1)
LED_VERDE.on()
sleep(1)
LED_VERDE.off()
sleep(1)
ESTADO_VERDE = 0
# Comprobamos por la consola el estado de los LED
print("El estado actual del boton ROJO es:", ESTADO_ROJO)
print("El estado actual del boton VERDE es:", ESTADO_VERDE)
# Definimos la función callback para tratar los mensajes entrantes
# Primero lo convertimos a un string para facilitar el manejo
# Segun el mensaje recibido se ajusta el estado del LED
def leer(topic, mensaje):
print("Recibido mensaje en el topic", topic, "con el mensaje", mensaje)
mensaje_str = mensaje.decode("utf-8")
if (mensaje_str=='LED_ROJO_ON'):
print("Recibido LED_ROJO_ON")
LED_ROJO.on()
return
if (mensaje_str=='LED_VERDE_ON'):
print("Recibido LED_VERDE_ON")
LED_VERDE.on()
return
if (mensaje_str=='LED_ROJO_OFF'):
print("Recibido LED_ROJO_OFF")
LED_ROJO.off()
return
if (mensaje_str=='LED_VERDE_OFF'):
print("Recibido LED_VERDE_OFF")
LED_VERDE.off()
return
# Definimos el callback
client.set_callback(leer)
# Se suscribe al topic
client.subscribe(MQTT_TOPIC)
while True:
print("Esperando mensaje")
# Comprueba si han llegado mensajes
# pero si no los hay continua
# Evitamos usar client.wait_msg()
# ya que se quedaría esperando por un mensaje
# en este punto
client.check_msg()
# Metemos un pequeño retardo para evitar que
# el pulsador envie demasiados mensajes
# de cambio de estado del LED
sleep(0.5)
if not(BOTON_ROJO.value()):
print("Se ha pulsado el boton del LED rojo")
if (ESTADO_ROJO==0):
print("Se ha encendido el LED rojo")
mensaje='LED_ROJO_ON'
ESTADO_ROJO=1
else:
print("Se ha apagado el LED rojo")
ESTADO_ROJO=0
mensaje='LED_ROJO_OFF'
# Envía el mensaje de encender el LED rojo
print("El estado actual del boton rojo es:", ESTADO_ROJO)
client.publish(MQTT_TOPIC, mensaje)
if not(BOTON_VERDE.value()):
print("Se ha pulsado el boton del LED verde")
if (ESTADO_VERDE==0):
print("Se ha encendido el LED verde")
mensaje='LED_VERDE_ON'
ESTADO_VERDE=1
else:
print("Se ha apagado el LED verde")
ESTADO_VERDE=0
mensaje='LED_VERDE_OFF'
# Envía el mensaje de encender el LED verde
print("El estado actual del boton verde es:", ESTADO_VERDE)
client.publish(MQTT_TOPIC, mensaje)
print("Boton rojo:", BOTON_ROJO.value())
print("Boton verde:", BOTON_VERDE.value())
sleep(0.2)