"""
Para funcionar:
1. Abrir la página https://www.hivemq.com/demos/websocket-client/
2. Hacer clic en "Connect"
3. En Subscriptions, hacer clic en "Add New Topic Subscription"
4. En el campo Topic, colocar "dispositivos/esp32" y presionar "Subscribe".
Hacer lo mismo con el otro tópico "dispositivos/computadora".
Se debe estar suscrito a dos tópicos.
5. Comenzar la simulación del circuito con el botón verde en Wokwi
6. Esperar a visualizar el mensaje "Esperando conexión de la aplicación" en
la terminal
7. Una vez aparece en la terminal volver a la otra página y escribir en
Topic de Publish el texto "dispositivos/esp32"
8. Escribir exactamente este mensaje en Message "Iniciando conexión MQTT"
9. Deberían comenzar a llegar los mensajes MQTT al broker.
Si se cambian los valores de los sensores debería poder notarse al recibir.
10. Si se envía un Message "Finalizando conexión MQTT" entonces finalizará
la conexión con el circuito.
"""
import network
import time
from machine import Pin, ADC
import dht
from umqtt.simple import MQTTClient
import urequests
last_time = 0
timer_delay = 1000
send_data = False
contador = 20
POTENCIOMETRO_PIN = 34
SENSOR_TEMPERATURA = 32
BOTON = Pin(33, Pin.IN)
LED_PIN = 2
led = Pin(LED_PIN, Pin.OUT)
# MQTT Server Parameters
MQTT_CLIENT_ID = "esp32-cliente"
MQTT_BROKER = "broker.mqttdashboard.com"
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_ESP32 = "dispositivos/esp32"
MQTT_COMPUTADORA = "dispositivos/computadora"
sensor = dht.DHT22(Pin(32))
KEEPALIVE_INTERVAL = 2
def on_message(topic, msg):
global send_data
message = msg.decode('utf-8')
print("Mensaje recibido en el tópico")
if message == "Iniciando conexión MQTT":
send_data = True
led.on()
elif message == "Finalizando conexión MQTT":
send_data = False
led.off()
elif message == "Computadora desconectada":
send_data = False
led.off()
def connect_to_wifi():
print("Conectando al WiFi", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('Wokwi-GUEST', '')
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print(" Conectado al WiFi")
def connect_to_mqtt():
print("Conectando al servidor MQTT.. ", end="")
mqtt_client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD, keepalive=KEEPALIVE_INTERVAL)
mqtt_client.set_callback(on_message)
mqtt_client.set_last_will(MQTT_ESP32, 'ESP32 desconectado', retain=True, qos=2)
mqtt_client.connect()
mqtt_client.subscribe(MQTT_ESP32)
print("Conectado al servidor MQTT")
return mqtt_client
def process_messages():
mqtt_client.check_msg()
print(mqtt_client.ping())
while mqtt_client.check_msg():
# Procesar todos los mensajes pendientes
pass
def main_loop():
global contador
print("BUCLE")
print(send_data)
if send_data:
if contador == 120:
print("Solicitando valores a la API..")
server_path = "https://api.open-meteo.com/v1/forecast?latitude=30.0333&longitude=31.2333&past_days=10&hourly=temperature_2m,relativehumidity_2m,windspeed_10m"
response = urequests.get(server_path)
respuesta = response.text
respuesta_encoded = respuesta.encode('utf-8')
mqtt_client.publish(MQTT_COMPUTADORA, respuesta_encoded)
contador = 0
print("Tomando temperatura y humedad del sensor.. ", end="")
sensor.measure()
t = str(sensor.temperature())
h = str(sensor.humidity())
print("Temperatura ")
print(t)
print("Humedad ")
print(h)
print("Tomando valor del potenciómetro..")
pot_value = str(ADC(Pin(POTENCIOMETRO_PIN)).read())
print(pot_value)
if BOTON.value() == 1:
boton_estado = "1"
else:
boton_estado = "0"
print("Enviando al broker MQTT..")
payload = "Humedad: {} %\nTemperatura: {} °C\nValor potenciómetro: {}\nEstado botón: {}".format(h, t, pot_value, boton_estado)
encoded_payload = payload.encode('utf-8')
mqtt_client.publish(MQTT_COMPUTADORA, encoded_payload)
print("Enviado")
print(payload)
time.sleep(1)
contador = contador + 1
# Intentar conectar al WiFi y MQTT indefinidamente
while True:
try:
connect_to_wifi()
mqtt_client = connect_to_mqtt()
while True:
process_messages()
# Procesar mensajes antes de ejecutar el bucle principal
if not send_data:
print("Esperando conexión de la aplicación..")
time.sleep(1) # Evitar un bucle infinito sin pausas
else:
main_loop()
except Exception as e:
print("Error:", e)
led.off()
send_data=False
print("Intentando reconectar al servidor MQTT en 5 segundos...")
time.sleep(5) # Esperar antes de intentar la reconexión