# Programa para experimentar el uso del JoyStick KN-023 y 5 leds
# Módulos a trabajar
from machine import Pin, I2C
import ssd1306
from machine import Pin, ADC, PWM
import utime
from time import sleep
# -------PANTALLA  OLED ---------
# ESP32 Pin assignment 
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
oled.text('Hola, SPick !', 11, 25)      
oled.show()
utime.sleep_ms(3000)
oled.fill(0)
oled.show()
# -------PANTALLA  JOYSTICK Y LEDS ---------
# Definición de pines del ESP32 para las señales de entrada
sw = ADC(Pin(34))  # Pulsador digital
vrx = ADC(Pin(35))  # Señal analógica en x
vry = ADC(Pin(33))  # Señal analógica en y
# Definición de pines del ESP32 
red_pin = 2  # Cambia esto al pin GPIO que uses para el rojo
green_pin = 4  # Cambia esto al pin GPIO que uses para el verde
blue_pin = 5  # Cambia esto al pin GPIO que uses para el azul
# Configuración de PWM para controlar la mezcla de los colores
red_pwm = PWM(Pin(red_pin), freq=1000)
green_pwm = PWM(Pin(green_pin), freq=1000)
blue_pwm = PWM(Pin(blue_pin), freq=1000)
def set_rgb(red, green, blue):
  """Establece los colores del LED RGB."""
  red_pwm.duty(red)
  green_pwm.duty(green)
  blue_pwm.duty(blue)
# Ejemplo de uso: encender el LED en diferentes colores
  # Rojo
  set_rgb(1023, 0, 0)
  utime.sleep_ms(2000)
  # Verde
  set_rgb(0, 1023, 0)
  utime.sleep_ms(2000)
  # Azul
  set_rgb(0, 0, 1023)
  utime.sleep_ms(2000)
  # Amarillo
  set_rgb(1023, 1023, 0)
  utime.sleep_ms(2000)
  # Morado
  set_rgb(1023, 0, 1023)
  utime.sleep_ms(2000)
  # Cian
  set_rgb(0, 1023, 1023)
  utime.sleep_ms(2000)
  # Blanco
  set_rgb(1023, 1023, 1023)
  utime.sleep_ms(2000)
  # Apagado
  set_rgb(0, 0, 0)
  utime.sleep_ms(2000)
# Atenuación del voltaje de la ESP32 a 3.3V
vrx.atten(ADC.ATTN_11DB);
vry.atten(ADC.ATTN_11DB);
# Resolución a 1024
vrx.width(ADC.WIDTH_10BIT)
vry.width(ADC.WIDTH_10BIT)
# Ciclo de operación
while True:
    valorx = vrx.read() # Lee el valor en x de 0 a 1023
    valory = vry.read() # Lee el valor en y de 0 a 1023
    valorsw = sw.read() # Lee el valor del pulsador digital 
    if valory >= 1000:
        print("Disminuye Cantidad: ")
        print("RGB: Amarillo")
        
        oled.text("Disminuye", 35, 15) 
        oled.text("Cantidad", 31, 35) 
        oled.show()
        red.value(255) 
        green.value(255)
        blue.value(0)
        utime.sleep_ms(200)
        oled.fill(0)
        oled.show()
        red.value(0) 
        green.value(0)
        blue.value(0)
    if valory <= 23:
        print("Aumenta Cantidad: ")
        oled.text("Aumenta", 35, 15) 
        oled.text("Cantidad", 31, 35) 
        oled.show()
        red.value(0) 
        green.value(0)
        blue.value(255)
        utime.sleep_ms(200)
        red.value(0) 
        green.value(0)
        blue.value(0)
        oled.fill(0)
        oled.show()
    if valorx <= 23:
        print("Solicita Reabasto: ")
        oled.text("Solicita", 35, 15) 
        oled.text("Reabasto", 31, 35)           
        oled.show()
        LedArribaMorado.value(1)
        utime.sleep_ms(200)
        LedArribaMorado.value(0)
        oled.fill(0)
        oled.show()
    if valorx >= 1000:
        print("Surtido Nulo: ")
        oled.text("Surtido Nulo", 15, 25)   
        oled.show()
        LedAbajoRojo.value(1)
        utime.sleep_ms(200)
        LedAbajoRojo.value(0)
        oled.fill(0)
        oled.show()
    if valorsw == 0:
        print("Surtido Completo: ")
        oled.text("Surtido", 35, 15)   
        oled.text("Completo", 31, 35)   
        oled.show()
        red.value(0) 
        green.value(1)
        blue.value(0)
        utime.sleep_ms(500)
        oled.fill(0)
        oled.show()
        red.value(0) 
        green.value(0)
        blue.value(0)
        utime.sleep_ms(50)