import machine
import micropython
import network
import time
from lcd_i2c import LCD
from machine import ADC, Pin, PWM, I2C
from umqtt.simple import MQTTClient
#Entrada analogica
slider = ADC(13)
#variables
modoadistancia = False
AnguloPublicado = 0
#Datos WIFI
ssid = 'Wokwi-GUEST'
wifipassword = ''
#Datos del broker
mqtt_server = 'io.adafruit.com'
port = 1883
usern = 'gonzaxxs'
passw= 'aio_PZon45rEXgCChfwJ4deDz4WvYAFq'
client_id = 'MiPrimerServo'
topic_AnguloActual = 'gonzaxxs/groups/default/AnguloActual'
topic_NuevoAngulo = 'gonzaxxs/groups/default/NuevoAngulo'
topic_ModoDistancia = 'gonzaxxs/groups/default/ModoADistancia'
#Conexion a WIFI
sta_if = network.WLAN(network.STA_IF) #conexion a AP
sta_if.active(True)
sta_if.connect(ssid, wifipassword)
print("Conectando")
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print("Conectado")
#print(sta_if.ifconfig())
#Mensajes del broker
def callback_servo(topic, msg):
global modoadistancia, AnguloPublicado
dato = msg.decode('utf-8')
topicrec = topic.decode('utf-8')
if topicrec == topic_ModoDistancia and "ON" in dato:
modoadistancia = True
else:
modoadistancia = False
if topicrec == topic_NuevoAngulo:
AnguloPublicado = int(msg)
#Intentamos conectarnos al broker
try:
conexionMQTT = MQTTClient(client_id, mqtt_server,user=usern,password=passw,port=int(port))
conexionMQTT.set_callback(callback_servo)
conexionMQTT.connect()
conexionMQTT.subscribe(topic_ModoDistancia)
conexionMQTT.subscribe(topic_NuevoAngulo)
print("Conectado con Broker MQTT")
except OSError as e:
print("Fallo la conexion al Broker, reiniciando...")
time.sleep(5)
machine.reset()
#Display LCD
I2C_ADDR = 0x27 # DEC 39, HEX 0x27
i2c = I2C(0, scl=Pin(22), sda=Pin(23), freq=800000)
lcd = LCD(addr=I2C_ADDR, cols=20, rows=4, i2c=i2c)
#Salidas
ledRojo = Pin(14, Pin.OUT)
servo = Pin(4, Pin.OUT)
pwm = PWM(servo)
pwm.freq(50)
#Funciones
def iniciarLCD():
lcd.begin()
lcd.print("Welcome")
lcd.set_cursor(col=1, row=1)
lcd.print("To the machine")
#Vamos a convertir los valores del slider a los del servo
def convertir(valor):
return int(((100/4095)*valor) + 25)
def convertiraAngulo(valor):
return int(((180/100)*valor) - 45)
def actualizarLCD(angulo):
lcd.print("Angulo: " + str(angulo) + " grados")
#Iniciamos el LCD
iniciarLCD()
while True:
try:
#Tenemos que verificar si hay mensajes nuevos publicados por el broker
conexionMQTT.check_msg()
time.sleep(2)
if modoadistancia:
ledRojo.value(0)
valorDelServo = int(((100/180)*AnguloPublicado) + 25)
pwm.duty(ciclodeactividad)
actualizarLCD(AnguloPublicado)
else:
ledRojo.value(1)
val = slider.read() # Rango del slider: 0 - 4095
valorDelServo = convertir(val)
angulo = convertiraAngulo(valorDelServo)
print("Slider: " + str(val) + " Servo: " + str(valorDelServo) + " Angulo: " + str(angulo))
pwm.duty(valorDelServo) # Rango del servo: 25 (0) - 125 (180)
actualizarLCD(angulo)
conexionMQTT.publish(topic_AnguloActual, "Angulo del servo: " + str(angulo))
except OSError as e:
print("Error ",e)
time.sleep(5)
machine.reset()