"""
MicroPython IoT Weather Station Example for Wokwi.com
To view the data:
1. Go to http://www.hivemq.com/demos/websocket-client/
2. Click "Connect"
3. Under Subscriptions, click "Add New Topic Subscription"
4. In the Topic field, type "wokwi-weather" then click "Subscribe"
Now click on the DHT22 sensor in the simulation,
change the temperature/humidity, and you should see
the message appear on the MQTT Broker, in the "Messages" pane.
Copyright (C) 2022, Uri Shaked
https://wokwi.com/arduino/projects/322577683855704658
"""
# Este comando realiza la importación de la librería de MicroPython titulada "network"
#la cual está disponible en: https://docs.micropython.org/en/latest/library/network.html
import network
# Este comando realiza la importación de la librería de MicroPython titulada "time"
#la cual está disponible en: https://docs.micropython.org/en/latest/library/time.html
import time
# Este comando importa la clase Pin y la clase PWM del módulo machine,
# es un modulo de MicroPython que sirve para interactuar con funciones
# de hardware de los microcontroladores.
# La clase Pin sirve con los pines GPIO
# (entrada/salida de uso general) del microcontrolador.
# La clase de PWM (Pulse Width Modulation o Modulación por ancho de Pulso) es ampliamente
# Utilizada para varias aplicaciones, un ejemplo seria la simulacion de las salida analogica
# De luces o de motores para controlar el brillo o la velocidad
from machine import Pin,PWM
# El módulo "dht" nos servira para poder medir la lectura de los sensores de humedad y temperatura
import dht
# "ujson" nos servira para decodificar y codificar datos JSON que son JavaScript Object Notation
import ujson
# En esta linea se utiliza la biblioteca cliente MicroPython MQTT (Message
# Queuing Telemetry Transport), siendo especificos la clase MQTTClient del módulo umqtt.simple.
# esta clase es parte de la biblioteca MicroPython MQTT (umqtt) ayuda a conectarse con el breker
from umqtt.simple import MQTTClient
# Se define una frecuencia de salida 50Hz por las caracteristicas del servomotor
freq =50
# Se establece el pin 13 del motor para PWM con una frecuencia de salida 50Hz
Servo = PWM(Pin(13), freq)
#MQTT Server Parameters
# Se procede a configurar la identificacion de cliente MQTT con "micropython-weather-demo"
MQTT_CLIENT_ID = "micropython-weather-demo"
# Se define el parametro del BROKER con "broker.mqttdashboard.com"
MQTT_BROKER = "broker.mqttdashboard.com"
# En ambas lineas no se ve definidas ni el usuario ni la contraseña
MQTT_USER = ""
MQTT_PASSWORD = ""
# En esta parte se esta procediendo a definir el TOPIC MQTP con "wokwi-weather"
MQTT_TOPIC = "wokwi-weather"
# Se define la varialbe sensor con los parametros obtenidos en el sensor de humedad DHT22 el cual recojera los datos del pin 15.
sensor = dht.DHT22(Pin(15))
# Mensaje de impresion de conectividad al wifi, en focado a una continuacion de caracteres al final.
print("Connecting to WiFi", end="")
# Se asigna a la variale sta_if el estado como objeto la interfaz de la estacion wifi, iniciando el modo de estacion wifi con network.WLAN(network.STA_IF)
sta_if = network.WLAN(network.STA_IF)
# En esta linea se procede a poner en verdadeero la funcion de activar de la interfaz wifi.
sta_if.active(True)
# En esta linea se da parametros para conectarse a una red wifi con el nombre de 'Wokwi-GUEST'
sta_if.connect('Wokwi-GUEST', '')
# la denominacion "while not" es un ciclo que terminara si la coneccion wifi fue un exito.
# La condición "sta_if.isconnected()" es una comprobacion de que el aun no se esta conectando
# Cada iteración imprime un punto sin pasar a una nueva línea como indicacion visual de que el dispositivo está intentando conectarse.
while not sta_if.isconnected():
# En cada ciclo se imprime un punto sin pasar a una nueva línea como señal de que se intenta conectar.
print(".", end="")
# Se toma un tiempo de pausa para comenzar un nuevo ciclo
time.sleep(0.1)
# Una vez concluida el siclo de comprobacion y que se haya consolidado la coneccion se imprime el mensaje conectado.
print(" Connected!")
# Se imprime el mensaje de "Connecting to MQTT server... "
print("Connecting to MQTT server... ", end="")
# En este codigo se crea una instancia de la clase MQTTClient, que fue definida en las lineas 49 - 56
# Los parámetros del contructor son:
# ID del cliente que identifica al cliente MQTT al conectarse
# el broker en direccion al que conecta.
# el nombre del usuario para la autenticacion
# la contraseña de verificacion
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
# Se inicia una coneccion con la instancia anteriormente creada se la coneccion es valida
# pasara a la siguiente instruccion.
client.connect()
# Se imprime un mensaje para mostrar que la coneccion tuvo exito.
print("Connected!")
# Se crea una variable de caracteres con nun mensaje vasio, esto con el fin de usarlo
# mas adelante para guargar una variable de caracteres comparativa.
prev_weather = ""
# Se inicia un while True que sera la base del progrma para la verificacion e impresion
# de las variables humedad y temperatura.
while True:
# Se define un mensaje que mostrara el mensaje de "Measuring weather conditions... "
# este mensaje sera el pibote para motrar dos estados del programa:
# cuando el programa tenda nuevos parametros de temperatura y cundo el programa no tenga cambios.
print("Measuring weather conditions... ", end="")
# Funcion que indica la medicion del sensor
sensor.measure()
# En la variable message de indica gurardar los valores de temperatura y humedad obtenidos por
# la medicion del sensor y con la función ujson.dumps se da formato de cadena de caracteres.
message = ujson.dumps({
"temp": sensor.temperature(),
"humidity": sensor.humidity(),
})
# Inicio de funcion condicionante if que tiene prueba logica la no igualdad entre las varialbes de caracteres
# message y prev_weather se estas no son iguales se cumple las siguientes intrucciones
if message != prev_weather:
# Al ser afirmativo se improme el mensaje de "Updated!" como señal de actualizacion de los datos.
print("Updated!")
# Se imprime el mensaje de "Reporting to MQTT topic {}: {}" donde se indica que los datos de message estan sieno llevados al topic MQTP.
print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message))
# Se publica el MQTP_TOPIC con la variable message
client.publish(MQTT_TOPIC, message)
# Se realiza una operacion donde se guarda la cadena de caracteres de message en la variable prev_weather
prev_weather = message
# En caso contrario a no haber cambios se imprime el mensage de "No change"se enpera un tiempo y se vuelve a inicual el blucle white True.
else:
print("No change")
time.sleep(0.0001)
# Se inicia un if dentro del bucle del programa inical que compare la temperatura del sensor con la temperatura ambiente
# en mi caso la temperatura de La Paz-Bolivia 14° en caso de que sea mayor a la temperatura se procede
# con la operación while true de movimiento del servomotor.
if sensor.temperature() > 14:
# Se inicia con el bucle while True que se enfoca en dos for que hacen la reducción o el
# incremento del servomotor por un ciclo rompiendo con break este en su primer ciclo.
while True:
for i in range(180, 0, -1):
Servo.duty(i)
time.sleep(0.00491)
for i in range(0, 180, 1):
Servo.duty(i)
time.sleep(0.00491)
break
# En caso de que la temperatura del sensor sea menor a la temperatura ambiente solo se
# procederá a llevar el servo a posición 0. Y se romperá el while True.
else:
while True:
Servo.duty(0)
break