#En primer lugar se importan las diferentes librerías que se van a utilizar en este proyecto
import network #Librería de MicroPython titulada "network" la cual está disponible en: https://docs.micropython.org/en/latest/library/network.html
import time #Librería de MicroPython titulada "time" la cual está disponible en: https://docs.micropython.org/en/latest/library/time.html
from machine import Pin, PWM #Librería de MicroPython titulada "machine" la cual está disponible en: https://docs.micropython.org/en/latest/library/machine.html
#El módulo de machine contiene las funciones específicas del hardware utilizado, en este caso la ESP32 y permite controlarla con facilidad
import dht #Librería con la información del sensor de temperatura y humedad
import ujson #Librería que permite convertir entre objetos Python y el formato de datos json
from umqtt.simple import MQTTClient #Importa librerías para comunicación MQTT
#Aquí se establecen los parámetros para la comunicación MQTT
MQTT_CLIENT_ID = "micropython-weather-demo" #ID del cliente
MQTT_BROKER = "broker.mqttdashboard.com" #Dirección del broker
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_TOPIC = "wokwi-weather" #Tópico en el que se publican los mensajes por MQTT
#Definición de variables:
sensor = dht.DHT22(Pin(15)) #Indica en que pin de la tarjeta se recibe la señal medida por el sensor
servo = PWM (Pin(18), freq=50) #Se indica el Pin:18 en el cual se cablea la señal de modulación de anchura de pulsos y la frecuencia de trabajo, que es de 50 Hz
#En esta serie de comandos se realiza la conexión wifi de la tarjeta. Indica un mensaje de conectando wifi
#Seguido de puntos suspensivos .... que se muestran mientras la conexión no esté establecida. Una vez la conexión wifi se establece, se muestra el mensaje "Connected!"
print("Connecting to 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(" Connected!")
#En esta línea de comandos se comunica nuestro cliente de MQTT con el broker, en base a los parámetros establecidos previamente
print("Connecting to MQTT server... ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.connect()
print("Connected!")
#Se le pide al usuario introducir una Tª unbral a partir de la cual arranque el motor y se guarda en la variable umbral
umbral=float(input("Ingrese Temperatura umbral de arranque motor... "))
#Finalmente, se leen los valores de temperatura y humedad del sensor
#En caso de que se vea cambio en las condiciones se muestra el mensaje "updated" y se publican los datos en el broker, en el tópico indicado:
prev_weather = ""
while True:
print("Measuring weather conditions... ", end="")
sensor.measure()
message = ujson.dumps({
"temp": sensor.temperature(),
"humidity": sensor.humidity(),
})
#Arranque del motor por encima de la temperatura umbral ingresada
if sensor.temperature()>=umbral:
#A continuación se va cambiando el duty cycle para dar diferentes posiciones al servo. Para ello se emplea una resolución de 16 bits
#El duty cycle, pasado a 16 bits, para mover el servo entre 0 y 180 grados debe ir variando entre 0.5 ms (1638) y 2.5 ms (8192)
# La velocidad de movimiento la podemos modificar con la función time.sleep, que define la velocidad con la que cambiamos el duty cycle, en este caso se hace cada 0.1 ms para que se mueva de forma más veloz.
for i in range(1638, 8192):
servo.duty_u16(i)
time.sleep(0.0001)
if message != prev_weather: #Caso de que sí cambien las condiciones meteorológicas leídas por el sensor
print("Updated!")
print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message))
client.publish(MQTT_TOPIC, message) #Publicación del mensaje en el tópico indicado del broker
prev_weather = message
else: #Caso de que no cambien las condiciones meteorológicas leídas por el sensor
print("No change")
if sensor.temperature()>=umbral:
print("Arranque de motor por alta temperatura")
if sensor.temperature()<umbral:
print("Motor parado")
time.sleep(1)