Series: Lập trình Raspberry Pi & Ứng dụng thực tế Phần 2 — Lập trình GPIO & phần cứng Bài 6: GPIO cơ bản — LED + Button + Debounce (làm “đúng chuẩn” từ đầu)
1) Mục tiêu bài học
Sau bài này bạn sẽ:
- Điều khiển LED bằng GPIO.
- Đọc nút nhấn (button) có pull-up/pull-down đúng cách.
- Xử lý debounce để tránh “nhấn 1 lần mà nhận nhiều lần”.
- Có code chạy được trên Raspberry Pi OS.
2) Chuẩn bị phần cứng
- Raspberry Pi (Zero 2 W / Pi 4 / Pi 5 đều ok)
- LED 5mm + điện trở 220Ω–330Ω
- Nút nhấn (tact switch)
- Breadboard + dây dupont
Wiring gợi ý (an toàn, dễ nhớ)
- LED
- GPIO17 (Pin 11) → điện trở → Anode LED (+)
- Cathode LED (−) → GND
- Button
- Một chân nút → GPIO27 (Pin 13)
- Chân còn lại → GND
- Dùng pull-up nội (khuyến nghị) để khỏi cần điện trở kéo.
Lưu ý: GPIO của Raspberry Pi là 3.3V. Không đưa 5V trực tiếp vào GPIO.
3) Cài thư viện (Python)
sudo apt update
sudo apt -y install python3 python3-pip
pip3 install gpiozero
Kiểm tra nhanh:
python3 -c "import gpiozero; print('gpiozero ok')"
4) Code 1 — Blink LED (chạy được ngay)
Tạo file:
mkdir -p ~/apps/gpio-basic
cd ~/apps/gpio-basic
nano led_blink.py
Dán code:
from gpiozero import LED
from time import sleep
led = LED(17) # GPIO17 (Pin 11)
while True:
led.on()
sleep(0.5)
led.off()
sleep(0.5)
Chạy:
python3 led_blink.py
5) Code 2 — Button toggle LED + Debounce (chuẩn thực chiến)
Tạo file:
nano button_toggle.py
Dán code:
from gpiozero import LED, Button
from signal import pause
led = LED(17) # GPIO17
btn = Button(27, pull_up=True, bounce_time=0.05) # GPIO27, debounce 50ms
def on_press():
led.toggle()
print(f"button pressed -> led is {'ON' if led.is_lit else 'OFF'}")
btn.when_pressed = on_press
print("Ready. Press button to toggle LED.")
pause()
Chạy:
python3 button_toggle.py
Giải thích nhanh:
- pull_up=True: bình thường GPIO = 1, nhấn nút kéo xuống GND → 0 (ổn định, dễ wiring)
- bounce_time=0.05: lọc rung phím ~50ms (đa số nút nhấn ok)
6) Debug nhanh (lỗi hay gặp)
- LED không sáng:
- cắm ngược cực LED
- quên điện trở hoặc điện trở quá lớn
- sai GPIO (17 ≠ pin vật lý 11 nếu bạn nhầm mode)
- Button nhấn không nhận:
- chưa nối đúng GND
- nhầm GPIO27 với pin vật lý khác
- Nhấn 1 lần mà log nhiều lần:
- thiếu debounce → tăng bounce_time lên 0.1
7) Nâng cấp mini (bài tập)
- Đổi thành: giữ nút thì LED sáng, thả nút LED tắt.
- Bấm nhanh 2 lần → bật “blink mode” (LED nháy liên tục).
- Tạo gpio-basic.service bằng systemd để script chạy nền (áp dụng Bài 3).


