#Ejercicio Parcial Tecnicas Digitales 2 - Godoy, Ignacio Ariel.

#Librerias.
from machine import Pin, ADC, PWM
from time import sleep
from utime import ticks_ms

#Pines.
servo_1 = PWM(Pin(0), freq=50) #Pin PWM p/ control de servo.
servo_2 = PWM(Pin(1), freq = 50) #Pin PWM p/ control de servo.
servo_3 = PWM(Pin(2), freq = 50) #Pin PWM p/ control de servo.
conversor = ADC (0) #Pin ADC p/ control de balanza.


#Variables.
cantidad_azul = 0 #Variable p/ cargar la cantidad de color azul. 
cantidad_rojo = 0 #Variable p/ cargar la cantidad de color rojo.
cantidad_amarillo = 0 #Variable p/ cargar la cantidad de color amarillo.
cantidad_mezcla = 0 #Variable p/ cargar la cantidad de mezcla.
valor_balanza = 0 #Valor p/control de balanza.
aux = 0

#Funciones.
def tomar_usuario(): #Funcion que se encarga de tomar los datos de color y peso.
    global cantidad_amarillo, cantidad_azul, cantidad_rojo, cantidad_mezcla
    while True:
        cantidad_azul = int(input("Cantidad de tinte azul = "))
        if cantidad_azul < 0 or cantidad_azul > 10:
            print("El valor debe ser estar entre 0 y 10.")
        else:
            break
    while True:
        cantidad_rojo = int(input("Cantidad de tinte rojo = "))
        if cantidad_rojo < 0 or cantidad_rojo > 10:
            print("El valor debe ser estar entre 0 y 10.")
        else:
            break
    while True:
        cantidad_amarillo = int(input("Cantidad de tinte amarillo = "))
        if cantidad_amarillo < 0 or cantidad_amarillo > 10:
            print("El valor debe ser estar entre 0 y 10.")
        else:
            break
    while True:
        cantidad_mezcla = int(input("Cantidad de mezcla = "))
        if cantidad_mezcla < 0.1 or cantidad_mezcla > 5:
            print("El valor debe ser estar entre 0,1 kg y 5 kg.")
        else:
            break
    print("Carga con exito")

def control_llaves(c_azul, c_rojo, c_amarillo):
    c_azul = (c_azul * 100) / 10 #Conversion del valor del color azul.
    c_rojo = (c_rojo * 100) / 10 #Conversion del valor del color rojo.
    c_amarillo = (c_amarillo * 100) / 10 #Conversion del valor del color amarillo.
    #Apertura de los servo.
    servo_1.duty_u16(int(((c_azul * 6064) / 100)+1800))
    servo_2.duty_u16(int(((c_rojo * 6064) / 100)+1800))
    servo_3.duty_u16(int(((c_amarillo * 6064) / 100)+1800))

def balanza (c_mezcla):
    global valor_balanza
    global aux
    c_mezcla = float((c_mezcla * 2.5) / 5)
    valor_balanza = float(conversor.read_u16()*2.5/65535)
    if c_mezcla <= valor_balanza:
        aux = 1

#Interrupciones.

#Main
while True:
    tomar_usuario() #Funcion que se encarga de tomar los datos de color y peso.
    control_llaves(cantidad_azul,cantidad_rojo,cantidad_amarillo) #Funcion que mueve los servo en funcion de los datos del usuario.
    while True:
        balanza(cantidad_mezcla) #Funcion para controlar el peso de la balanza.
        if aux == 1:
            servo_1.duty_u16(1800)
            servo_2.duty_u16(1800)
            servo_3.duty_u16(1800)
            print("LLaves cerradas")
            break
        sleep(0.1)
    sleep(0.1)
   
BOOTSELLED1239USBRaspberryPiPico©2020RP2-8020/21P64M15.00TTT