# Nhập các thư viện cần thiết
from machine import Pin
import time
# --- Định nghĩa các chân GPIO ---
# Sử dụng đối tượng Pin để khởi tạo
button = Pin(13, Pin.IN)
relay = Pin(16, Pin.OUT)
# --- Khởi tạo trạng thái ban đầu ---
is_light_on = False
# Giả định relay là active-low, nên set value(1) (mức HIGH) để tắt
relay.value(1)
print("Hệ thống đã sẵn sàng. Đèn đang tắt.")
# --- Biến dùng cho việc chống dội phím (debounce) ---
last_debounce_time = 0
debounce_delay_ms = 50 # Thời gian chờ 50ms
# Biến lưu trạng thái nút nhấn của lần lặp trước
last_button_state = 0
# Vòng lặp chính của chương trình
while True:
# Đọc trạng thái hiện tại của nút nhấn (1 là nhấn, 0 là không nhấn)
current_button_state = button.value()
# Phát hiện sườn lên (rising edge) - thời điểm nút VỪA được nhấn
if current_button_state == 1 and last_button_state == 0:
# Chống dội phím: kiểm tra xem đã đủ thời gian trôi qua chưa
# time.ticks_diff() là cách an toàn để xử lý việc bộ đếm thời gian bị tràn
if time.ticks_diff(time.ticks_ms(), last_debounce_time) > debounce_delay_ms:
# Đảo ngược trạng thái đèn
is_light_on = not is_light_on
# Điều khiển relay dựa trên trạng thái mới
if is_light_on:
print("BẬT ĐÈN")
relay.value(0) # Active-low: value(0) (mức LOW) để bật
else:
print("TẮT ĐÈN")
relay.value(1) # Active-low: value(1) (mức HIGH) để tắt
# Cập nhật lại thời gian sau khi nhấn thành công
last_debounce_time = time.ticks_ms()
# Cập nhật trạng thái nút nhấn cho lần lặp sau
last_button_state = current_button_state
# Tạm dừng một chút để CPU nghỉ
time.sleep_ms(10)