# ======================================================
# IOT MASTER TEMPLATE (MICROPYTHON + GIẢI THÍCH)
# ======================================================
from machine import Pin, PWM
import time
import dht
led = Pin(2, Pin.OUT)
button = Pin(4, Pin.IN, Pin.PULL_UP)
pir = Pin(5, Pin.IN)
sensor = dht.DHT22(Pin(16))
# ======================================================
# KỸ THUẬT 1: NON-BLOCKING
# TÁC DỤNG:
# - Không dùng sleep dài
# - Cho phép nhiều tác vụ chạy cùng lúc
# ======================================================
last_blink = time.ticks_ms()
def blink():
global last_blink
if time.ticks_diff(time.ticks_ms(), last_blink) > 1000:
last_blink = time.ticks_ms()
led.value(not led.value())
# ======================================================
# KỸ THUẬT 2: DEBOUNCE
# TÁC DỤNG:
# - Tránh nhấn 1 lần mà nhận nhiều lần
# ======================================================
last_button = 1
last_debounce = time.ticks_ms()
def read_button():
global last_button, last_debounce
current = button.value()
if current != last_button:
last_debounce = time.ticks_ms()
if time.ticks_diff(time.ticks_ms(), last_debounce) > 50:
if current == 0:
last_button = current
return True
last_button = current
return False
# ======================================================
# KỸ THUẬT 3: PIR RETRIGGER
# TÁC DỤNG:
# - Giữ trạng thái ON thêm vài giây
# ======================================================
last_motion = time.ticks_ms()
def handle_pir():
global last_motion
if pir.value() == 1:
led.value(1)
last_motion = time.ticks_ms()
else:
if time.ticks_diff(time.ticks_ms(), last_motion) > 5000:
led.value(0)
# ======================================================
# KỸ THUẬT 4: PWM
# TÁC DỤNG:
# - Điều chỉnh độ sáng / tốc độ
# ======================================================
buzzer = PWM(Pin(15))
buzzer.freq(1000)
def beep():
buzzer.duty_u16(20000)
time.sleep(0.2)
buzzer.duty_u16(0)
# ======================================================
# KỸ THUẬT 5: DHT SENSOR
# TÁC DỤNG:
# - Đọc nhiệt độ / độ ẩm
# ======================================================
def read_dht():
sensor.measure()
t = sensor.temperature()
h = sensor.humidity()
print("Temp:", t)
print("Hum:", h)
# ======================================================
# KỸ THUẬT 6: STATE MACHINE
# TÁC DỤNG:
# - Quản lý trạng thái hệ thống (đèn giao thông)
# ======================================================
state = 0
state_time = time.ticks_ms()
def traffic():
global state, state_time
now = time.ticks_ms()
if state == 0: # xanh
if time.ticks_diff(now, state_time) > 3000:
state = 1
state_time = now
elif state == 1: # vàng
if time.ticks_diff(now, state_time) > 2000:
state = 2
state_time = now
elif state == 2: # đỏ
if time.ticks_diff(now, state_time) > 5000:
state = 0
state_time = now
# ======================================================
# LOOP
# ======================================================
while True:
blink() # non-blocking
handle_pir() # PIR
if read_button():
beep()
if time.ticks_ms() % 2000 < 50:
read_dht()
traffic()