from machine import Pin, PWM, ADC 
import utime 
 
# Definisi pin 
servo = PWM(Pin(16)) # Servo pada GP16 
pot = ADC(Pin(28)) # Potensiometer pada GP28 
led_red = Pin(1, Pin.OUT) # LED Merah pada GP1 
led_green = Pin(2, Pin.OUT) # LED Hijau pada GP2 
led_blue = Pin(3, Pin.OUT) # LED Biru pada GP3 
 
# Konfigurasi servo (frekuensi 50Hz) 
servo.freq(50) 
 
# Fungsi map seperti di Arduino 
def map_value(value, in_min, in_max, out_min, out_max): 
    return int((value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min) 
 
# Variabel untuk kontrol kedipan LED 
last_blink = utime.ticks_ms() 
led_state = True # Mulai dalam keadaan menyala
while True: 
    # Waktu sekarang 
    now = utime.ticks_ms() 
    # Membaca nilai potensiometer (0 - 65535) 
    pot_value = pot.read_u16() 
    # Konversi ke sudut servo (0° - 180°) 
    angle = map_value(pot_value, 0, 65535, 0, 180) 
    # Konversi sudut ke duty cycle (1500 - 7500) → sesuai servo PWM 
    duty = map_value(angle, 0, 180, 1500, 7500) 
    servo.duty_u16(duty) 
    # Print untuk debugging 
    print(f"Pot Value: {pot_value}, Angle: {angle}, Duty: {duty}") 
    # Jika sudah lewat 2000 ms (2 detik), ubah status LED RGB 
    if utime.ticks_diff(now, last_blink) >= 2000: 
        led_state = not led_state 
        last_blink = now # reset waktu blink 
    # Nyalakan salah satu warna LED berdasarkan sudut 
    if 0 <= angle <= 60: 
        led_red.value(led_state) 
        led_green.value(0) 
        led_blue.value(led_state) 
    elif 60 < angle <= 90: 
        led_red.value(led_state) 
        led_green.value(0) 
        led_blue.value(0) 
    elif 90 < angle <= 120: 
        led_red.value(0) 
        led_green.value(0) 
        led_blue.value(0) 
    else: 
        led_red.value(0) 
        led_green.value(0)
        led_blue.value(led_state) 
    utime.sleep_ms(50) # Delay pendek untuk kestabilan pembacaan