'''
Código para hacer girar un servo en su
rango de trabajo (0º~180º) dependiendo del valor de temperatura del sensor
Fuente: https://peppe8o.com/sg90-servo-motor-with-raspberry-pi-pico-and-micropython/
'''
# Con esta librería se alistan los pines de entrada y de salida de la tarjeta
from machine import Pin, PWM
# Esta librería se utiliza para conectarse al módulo Wifi
import network
# Esta librería modulo de tiempo
import time
# Librería para utilizar el sensor de temperatura y humedad DHT22
import dht
# Esta librería permite convertir objetos Python a datos tipo JSON
import ujson
# MQTT es un protocolo de mensajería basado en estándares para la comunicación de
# un dispositivo con otro
from umqtt.simple import MQTTClient
# Se establece el pin 18 del motor para PWM con una frecuencia de salida 50Hz
servo_pin = PWM(Pin(18))
servo_pin.freq(50)
# Se establece la variable que guardará la información del sensor que está
# conectado al pin 15
sensor = dht.DHT22(Pin(15))
#A partir del ángulo que se quiere se calcula el output necesario
#para que el servo se mueva correctamente
def servo(degrees):
'''
Función para pasar el ángulo de giro deseado al servo como PWM equivalente
Fuente: https://peppe8o.com/sg90-servo-motor-with-raspberry-pi-pico-and-micropython/
'''
#Checkear si el ángulo buscado está dentro del rango de trabajo
if degrees > 180: degrees=180
if degrees < 0: degrees=0
#Valores min y max del duty cycle
maxDuty=9000
minDuty=1000
#Fórmula para pasar de grados a PWM/duty cycle
#Duty Cycle = minimo + rango * proporción de ángulo
newDuty=minDuty+(maxDuty-minDuty)*(degrees/180)
#Pasar el valor de duty al servo
servo_pin.duty_u16(int(newDuty))
# Se establecen los parámetros de mensajería
MQTT_CLIENT_ID = "micropython-weather-demo"
MQTT_BROKER = "broker.mqttdashboard.com"
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_TOPIC = "wokwi-weather"
# Se establece la variable que guardará la información del sensor que está
# conectado al pin 15
sensor = dht.DHT22(Pin(15))
#De la línea 36 a la 43 se establece la configuración para la conección a Wifi
print("Connecting to WiFi", end="")
# Se crea una instancia de los objetos usando sta_if
sta_if = network.WLAN(network.STA_IF)
# Se activa la interfaz de conección
sta_if.active(True)
# Se inicia la conección a la red
sta_if.connect('Wokwi-GUEST', '')
# Mientras que la conección no se ha establecido se imprimen puntos suspencivos
# en la pantalla del serial esperando de a 0.1s hasta que se conecte
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print(" Connected!")
# Se imprime en consola el mensaje que se está conectado al servidor MQTT
print("Connecting to MQTT server... ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
# Se conecta al servidor los los parámetros de las líneas 29 a la 33
client.connect()
print("Connected!")
# Se crea la variable que guardará la información del sensor
prev_weather = ""
# Se establece un ciclo infinito para que constantemente se estén revisando los
# cambio que tenga el sensor
while True:
print("Measuring weather conditions... ", end="")
# Función que inicia la medición
sensor.measure()
# En la variable message se guardan los valores de temperatura y humedad leídos por
# el sensor y con la función ujson.dumps se retorna un objeto JSON tipo string con los datos
message = ujson.dumps({
"temp": sensor.temperature(),
"humidity": sensor.humidity(),
})
# Se evalua si el valor de message es diferente que el de prev_weather
if message != prev_weather:
# Se imprime por consola que se han actualizado los valores
print("Updated!")
# Se muestra en consola los nuevos datos del sensor
print("Reporting to MQTT topic {}: {}".format(MQTT_TOPIC, message))
# Se sube al servidor los nuevos datos
client.publish(MQTT_TOPIC, message)
# Y se establece el nuevo valor de prev_weather con los nuevos datos del sensor
prev_weather = message
# Si los valores no son iguales
else:
# Se muestra que no hubo cambios
print("No change")
# Y esperamos un segundo para la siguiente lectura del sensor
time.sleep(1)
# Se establece como temepratura ambiente 28ºC
# Cada vez que la temperatura sea mayor a 28 el motor funcionará
if sensor.temperature() > 28:
# El valor del grado cambia de 0 a 180 de a una unidad
for degree in range(0,180,1):
# Mueve el servo al ángulo establecido
servo(degree)
# Espera 0.01s
time.sleep(0.01)
# El valor del grado cambia de 180 a 0 de a menos una unidad
for degree in range(180, 0, -1):
servo(degree)
time.sleep(0.01)
# Sí el valor de la temperatura ambiente es menor a 28 el motor se mantiene en posición
# con ángulo 0
else:
servo(0)