from machine import Pin, PWM, ADC # Importa las clases para manejar los pines, PWM, y ADC
from time import sleep_ms # Importa la función sleep_ms para crear pausas en milisegundos
# Configuración del servomotor
servo_pin = PWM(Pin(18)) # El servomotor está conectado al pin 18
servo_pin.freq(50) # Frecuencia de 50Hz para controlar el servo
# Configuración de los LEDs como PWM para variar el brillo
led_rojo = PWM(Pin(17)) # LED rojo conectado al pin 17
led_verde = PWM(Pin(5)) # LED verde conectado al pin 5
led_rojo.freq(1000) # Frecuencia PWM para el LED rojo
led_verde.freq(1000) # Frecuencia PWM para el LED verde
# Configuración del potenciómetro
potenciometro = ADC(Pin(27)) # Potenciómetro conectado al pin 27 (entrada analógica)
potenciometro.atten(ADC.ATTN_11DB) # Configuración de atenuación para rango de voltaje (0-3.6V)
# Configuración del buzzer
buzzer = PWM(Pin(19)) # Buzzer conectado al pin 19
# Función para mover el servomotor al ángulo deseado
def servo(degrees):
if degrees > 180:
degrees = 180
if degrees < 0:
degrees = 0
maxDuty = 9000
minDuty = 1000
newDuty = minDuty + (maxDuty - minDuty) * (degrees / 180)
servo_pin.duty_u16(int(newDuty))
# Función para emitir un sonido con el buzzer
def emitir_sonido(frecuencia, duracion):
buzzer.freq(frecuencia) # Configura la frecuencia del sonido
buzzer.duty_u16(1000) # Activa el buzzer con un duty cycle adecuado
sleep_ms(duracion) # Duración del sonido
buzzer.duty_u16(0) # Apaga el buzzer
# Variables de control para el movimiento del servo
angulo_servo = 0
incremento_servo = 1
# Bucle principal no bloqueante
while True:
# Control del servo no bloqueante
servo(angulo_servo)
angulo_servo += incremento_servo
if angulo_servo >= 180 or angulo_servo <= 0:
incremento_servo = -incremento_servo # Cambia la dirección del servo
emitir_sonido(1000, 100) # Emite un sonido de 1000Hz durante 0.1 segundos
# Control del brillo de los LEDs en tiempo real
valor_pot = potenciometro.read() # Lee el valor del potenciómetro (0-4095)
duty_cycle = int((valor_pot / 4095) * 65535) # Mapea el valor a un rango de 0 a 65535 para el duty cycle de PWM
led_rojo.duty_u16(duty_cycle) # Ajusta el brillo del LED rojo
led_verde.duty_u16(duty_cycle) # Ajusta el brillo del LED verde
# Pequeñas pausas para no bloquear y permitir la multitarea cooperativa
sleep_ms(20) # Pequeña pausa de 20 ms para mantener el control responsivo