IoTLabs

Nghiên cứu, Sáng tạo và Thử nghiệm

Series: Lập trình Raspberry Pi – Bài 6: GPIO cơ bản — LED + Button + Debounce (làm “đúng chuẩn” từ đầu)

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)

  1. Đổi thành: giữ nút thì LED sáng, thả nút LED tắt.
  2. Bấm nhanh 2 lần → bật “blink mode” (LED nháy liên tục).
  3. Tạo gpio-basic.service bằng systemd để script chạy nền (áp dụng Bài 3).