from machine import Pin, ADC, I2C
from pico_i2c_lcd import I2cLcd
from time import sleep
import math

# Configuración del servomotor y potenciómetro
from machine import PWM

servo = PWM(Pin(15))  # Conectar el servomotor al pin GP15
servo.freq(50)  # Frecuencia de 50 Hz para control de servos
servo1 = PWM(Pin(14))  # Conectar el servomotor al pin GP15
servo1.freq(50)  # Frecuencia de 50 Hz para control de servos
servo2 = PWM(Pin(13))  # Conectar el servomotor al pin GP15
servo2.freq(50)  # Frecuencia de 50 Hz para control de servos

pot = ADC(Pin(26))  # Potenciómetro conectado al pin GP26 (ADC)

# Configuración del LCD (con I2C)
I2C_ADDR = 0x27  # Dirección I2C del LCD (comúnmente 0x27 o 0x3F)
i2c = I2C(0, sda=Pin(0), scl=Pin(1), freq=400000)
lcd = I2cLcd(i2c, I2C_ADDR, 2, 16)

# Función para mover el servomotor en función de la posición mapeada
def mover_servo(valor1,valor2,valor3):
    # Mapeo de grados (0-180) a rango de pulso (500 a 2500 us)
    pulso = int(1800 + (angulo / 180) * 6060)
    pulso2 = int(1800 + (angulo2 / 180) * 6060)
    pulso3 = int(1800 + (angulo3 / 180) * 6060)
    servo.duty_u16(int(pulso))  # Convertir el pulso a 16 bits
    servo1.duty_u16(int(pulso2))  # Convertir el pulso a 16 bits
    servo2.duty_u16(int(pulso3))  # Convertir el pulso a 16 bits

    return pulso

# Función para leer y mapear el valor del potenciómetro
def leer_angulo(valor):
    # Mapea el valor leído (0-65535) a un ángulo (0-180)
    angulo = int(valor / 10 * 180)
    return angulo



numero = int(input("Escriba un número entre 0-10: "))
while  numero < 0 or numero > 10 :
    print("¡Ha escrito un número no disponible! Inténtelo de nuevo")
    numero = int(input("Escriba un número positivo: "))

print("AZUL: ",numero)
azul=numero
numero = int(input("Escriba un número entre 0-10: "))
while  numero < 0 or numero > 10 :
    print("¡Ha escrito un número no disponible! Inténtelo de nuevo")
    numero = int(input("Escriba un número positivo: "))

print("ROJO: ",numero)
rojo=numero
numero = int(input("Escriba un número entre 0-10: "))
while  numero < 0 or numero > 10 :
    print("¡Ha escrito un número no disponible! Inténtelo de nuevo")
    numero = int(input("Escriba un número positivo: "))

print("AMARILLO: ",numero)
amarillo=numero
numero = float(input("Escriba un número entre 0-10: "))
while  numero < 0.1 or numero > 5 :
    print("¡Ha escrito un número no disponible! Inténtelo de nuevo")
    numero = float(input("Escriba un número positivo: "))
    
print("PESO KG: ",numero)
peso=numero

print(azul,rojo,amarillo,peso)
# Bucle principal
while True:
    angulo = leer_angulo(azul)  # Leer el ángulo del potenciómetro
    angulo2 = leer_angulo(rojo)  # Leer el ángulo del potenciómetro
    angulo3 = leer_angulo(amarillo)  # Leer el ángulo del potenciómetro

    mover_servo(angulo,angulo2,angulo3)  # Mover el servomotor al ángulo calculado
    
    print (angulo,angulo2,angulo3)
    pot_value = pot.read_u16()  # Leer valor del potenciómetro (0-65535)
    

    # Mostrar el ángulo en el LCD
    lcd.clear()
    lcd.putstr("Angulo: {:3d} grados".format(angulo))
    
    sleep(0.1)  # Pequeña pausa antes de la siguiente lectura
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT