from machine import Pin, ADC, PWM, time_pulse_us
import time
# ===== INIT =====
leds = [Pin(i, Pin.OUT) for i in range(5)]
pot = ADC(27)
buzzer = PWM(Pin(15))
buzzer.duty_u16(0)
ir = Pin(16, Pin.IN)
# ===== STATE =====
mode = 1
last_code = 0
last_ir_time = 0
last_led_time = 0
index = 0
direction = 1
p_index = 0
m3_state = 0
PATTERN = (0, 2, 4, 1, 3)
# ===== HELPER =====
def all_off():
for l in leds: l.value(0)
def all_on():
for l in leds: l.value(1)
def beep():
buzzer.freq(900)
buzzer.duty_u16(12000)
time.sleep_ms(20)
buzzer.duty_u16(0)
# 🔥 tambahan penting
def clean_switch():
for l in leds:
l.value(0)
# tanpa delay sama sekali
# ===== POT CONFIG =====
MIN_MS = 130
MAX_MS = 500
def get_delay_ms():
v = pot.read_u16()
if v < 2000: return None
return MIN_MS + int((MAX_MS - MIN_MS) * (1.0 - v / 65535))
# ===== IR =====
def read_ir():
if ir.value() == 1: return None
while ir.value() == 0: pass
while ir.value() == 1: pass
data = 0
for _ in range(32):
while ir.value() == 0: pass
data = (data << 1) | (1 if time_pulse_us(ir, 1) > 1000 else 0)
return data
# ===== START =====
all_on()
time.sleep_ms(300)
all_off()
# ===== LOOP =====
while True:
now = time.ticks_ms()
# --- IR ---
code = read_ir()
if code and (code != last_code or time.ticks_diff(now, last_ir_time) > 300):
last_code = code
last_ir_time = now
if code == 0xff807f:
mode = 1
index = 0
direction = 1
all_off()
elif code == 0xff40bf:
mode = 2
p_index = 0
all_off()
elif code == 0xffc03f:
mode = 3
m3_state = 0
all_off()
last_led_time = 0
beep()
# --- POT ---
delay_ms = get_delay_ms()
if delay_ms is None:
continue
if time.ticks_diff(now, last_led_time) < delay_ms:
continue
last_led_time = now
# --- MODE 1 ---
if mode == 1:
clean_switch()
leds[index].value(1)
index += direction
if index >= 4: direction = -1
elif index <= 0: direction = 1
# --- MODE 2 ---
elif mode == 2:
clean_switch()
leds[PATTERN[p_index]].value(1)
p_index = (p_index + 1) % 5
# --- MODE 3 ---
elif mode == 3:
m3_state ^= 1
if m3_state:
all_on()
else:
all_off()