import machine
import time
# --- 1. ĐỊNH NGHĨA CHÂN (PIN DEFINITIONS) ---
LED_PIN = 4
RGB_R_PIN = 13
RGB_G_PIN = 12
RGB_B_PIN = 14
BTN_PIN = 27
# --- 2. KHỞI TẠO ĐỐI TƯỢNG (INITIALIZATION) ---
# Nút nhấn (Dùng ngắt ngoài, Pull-up nội)
btn = machine.Pin(BTN_PIN, machine.Pin.IN, machine.Pin.PULL_UP)
# Cấu hình PWM cho các LED ngay từ đầu (Tần số 1kHz, chu kỳ ban đầu 0 - tắt)
led_pwm = machine.PWM(machine.Pin(LED_PIN), freq=1000, duty=0)
rgb_r = machine.PWM(machine.Pin(RGB_R_PIN), freq=1000, duty=0)
rgb_g = machine.PWM(machine.Pin(RGB_G_PIN), freq=1000, duty=0)
rgb_b = machine.PWM(machine.Pin(RGB_B_PIN), freq=1000, duty=0)
# Khởi tạo Hardware Timer
timer = machine.Timer(0)
# --- 3. BIẾN TOÀN CỤC (GLOBAL VARIABLES) ---
current_mode = 1
last_interrupt_time = 0
mode_changed = True # Cờ báo hiệu cần thiết lập lại trạng thái khi chuyển mode
# --- 4. CÁC HÀM XỬ LÝ (FUNCTIONS) ---
def stop_all_leds():
"""Tắt Timer và reset tất cả PWM về 0"""
timer.deinit()
led_pwm.duty(0)
rgb_r.duty(0)
rgb_g.duty(0)
rgb_b.duty(0)
def set_rgb_color(r, g, b):
"""Thiết lập màu cho LED RGB qua PWM (0-1023)"""
rgb_r.duty(r)
rgb_g.duty(g)
rgb_b.duty(b)
def timer_callback(t):
"""Hàm Callback cho Timer (Dùng trong Mode 1)"""
if current_mode == 1:
# Thay đổi trạng thái LED (Bật max PWM hoặc Tắt)
current_duty = led_pwm.duty()
led_pwm.duty(1023 if current_duty == 0 else 0)
def button_isr(pin):
"""Hàm Phục vụ Ngắt (Interrupt Service Routine) khi nhấn nút"""
global current_mode, last_interrupt_time, mode_changed
# Lấy thời gian hiện tại để tính toán Debounce
current_time = time.ticks_ms()
# Software Debounce: Chỉ nhận nút nhấn nếu cách lần nhấn trước > 250ms
if time.ticks_diff(current_time, last_interrupt_time) > 250:
current_mode += 1
if current_mode > 3:
current_mode = 1 # Quay vòng lại Mode 1
mode_changed = True
last_interrupt_time = current_time
# Gắn ngắt (Interrupt) vào nút nhấn, kích hoạt ở sườn xuống (Falling Edge)
btn.irq(trigger=machine.Pin.IRQ_FALLING, handler=button_isr)
# --- 5. VÒNG LẶP CHÍNH (MAIN LOOP) ---
while True:
# Xử lý khi có sự kiện chuyển đổi Mode
if mode_changed:
stop_all_leds()
mode_changed = False
if current_mode == 1:
print("Current Mode: Timer LED Blink")
# Kích hoạt timer ngắt mỗi 1000ms (1 giây)
timer.init(period=1000, mode=machine.Timer.PERIODIC, callback=timer_callback)
elif current_mode == 2:
print("Current Mode: PWM Brightness Control")
elif current_mode == 3:
print("Current Mode: RGB Color Cycle")
# Thực thi tác vụ dựa trên Mode hiện tại
if current_mode == 2:
# Mode 2: LED sáng dần (Fade In) rồi tối dần (Fade Out)
for duty in range(0, 1024, 16):
if mode_changed: break # Thoát ngay lập tức nếu nút bị nhấn
led_pwm.duty(duty)
time.sleep_ms(20)
for duty in range(1023, -1, -16):
if mode_changed: break
led_pwm.duty(duty)
time.sleep_ms(20)
elif current_mode == 3:
# Mode 3: Chuyển đổi tự động qua lại các màu trên RGB LED
# Danh sách màu: Đỏ, Xanh lá, Xanh dương, Vàng, Cyan, Tím
colors = [(1023, 0, 0), (0, 1023, 0), (0, 0, 1023),
(1023, 1023, 0), (0, 1023, 1023), (1023, 0, 1023)]
for r, g, b in colors:
if mode_changed: break
set_rgb_color(r, g, b)
# Thay vì dùng sleep(1) làm treo hệ thống, chia nhỏ sleep để check ngắt mượt hơn
for _ in range(50):
if mode_changed: break
time.sleep_ms(20)
else:
# Mode 1: Main loop không cần làm gì cả vì Timer Callback đã lo việc nháy LED
time.sleep_ms(100)