Lab.Vatli365
← Cấp độ 1 · Điều khiển và tín hiệu số

Bài 1 · Công nghệ · Tin học

LED nhấp nháy
một chân, hai trạng thái, và khái niệm thời gian

Bài mở đầu của cả lộ trình. Chỉ một con LED năm trăm đồng, nhưng nó dạy trọn ba thứ mà mọi dự án về sau đều dùng lại: chân ra số, vòng lặp, và thời gian.

Thời lượng
1 tiết (45 phút)
Chi phí một nhóm
≈ 2 nghìn đồng (chưa tính bo)
Cấp độ
1 / 12
Trạng thái
Đã có phần cứng, đang hoàn thiện
01

Mục tiêu và yêu cầu cần đạt

LED nhấp nháy là thứ nhỏ nhất mà học sinh nhìn thấy được chương trình của mình đang chạy: một đốm sáng bật tắt đúng theo con số vừa gõ.

Sau bài này học sinh làm được

  • Nối LED vào chân GPIO qua điện trở hạn dòng, đúng chiều.
  • Giải thích vì sao phải có điện trở và chọn được giá trị hợp lí.
  • Phân biệt on()/off() là lệnh, còn sleep_ms() là khoảng dừng giữa hai lệnh.
  • Dự đoán nhịp sáng khi đổi con số, rồi kiểm chứng bằng mắt.
Gắn với chương trình
  • Công nghệ 12 — Vi điều khiển: xuất tín hiệu số điều khiển thiết bị.
  • Tin học 10–11 — cấu trúc lặp, biến, thứ tự thực hiện lệnh.

Trích nguyên văn yêu cầu cần đạt từ Phụ lục Thông tư 32/2018 trước khi đưa vào kế hoạch bài dạy.

02

Lí thuyết

Chân GPIO là một công tắc do chương trình gạt

Bật thì ESP32 nối chân 23 vào 3,3 V, tắt thì nối xuống 0 V. Chỉ hai mức, không có mức giữa — nên gọi là tín hiệu số.

Vì sao phải có điện trở

LED không phải điện trở mà là linh kiện có ngưỡng: dưới ~1,8 V gần như không dẫn, vượt ngưỡng thì dòng tăng vọt. Nối thẳng vào 3,3 V, dòng chỉ bị chặn bởi điện trở nội rất nhỏ — vượt xa mức an toàn.

Điện trở 220 Ω gánh phần điện áp thừa. LED đỏ sụt ~1,8 V, còn 3,3 − 1,8 = 1,5 V đặt lên điện trở, cho dòng 1,5 / 220 ≈ 6,8 mA. Chân GPIO chịu được ~12 mA, LED 5 mm sáng rõ từ 5 mA — 220 Ω nằm gọn trong vùng an toàn của cả hai.

Một câu hỏi hay để hỏi cả lớp

Thay bằng 1 kΩ thì dòng còn 1,5 mA — LED sáng nhưng mờ hẳn. Thay bằng 100 Ω thì dòng lên 15 mA — sáng hơn nhưng đã vượt ngưỡng chân GPIO. Cho học sinh tính trước khi cắm, rồi cắm thử để đối chiếu.

Khoảng dừng mới làm nên nhấp nháy

Nếu chỉ "bật rồi tắt", máy chạy nhanh đến mức mắt người thấy LED sáng mờ liên tục. Thứ tạo ra nhấp nháy là khoảng dừng giữa hai lệnh, không phải bản thân lệnh bật tắt. Đây là ý học sinh hay bỏ qua nhất.

03

Linh kiện

Linh kiệnMô tả, lưu ý khi muaSố lượng · giá
ESP32 DevKit V1Bo 30 chân, cổng micro-USB hoặc Type-C1 · 90–150k
LED 5 mmMàu gì cũng được. Đỏ và vàng sáng rõ hơn xanh dương ở cùng dòng điện1 · 500đ
Điện trở 220 ΩVạch màu: đỏ – đỏ – nâu – vàng kim. Xem hộp an toàn bên dưới1 · 200đ
Breadboard và dây cắmLoại 400 lỗ là đủ1 bộ · 30k
04

Lắp mạch và sơ đồ nối dây

Đỏ · nguồn dương Đen · GND Vàng · SCL Xanh dương · SDA Trắng · tín hiệu Xanh lá · 1-Wire
KhốiNối dâyNguồn
LEDGPIO23 → điện trở 220 Ω → chân dài (+) · chân ngắn (−) → GNDLấy từ chính chân GPIO
B1.1 Sơ đồ nối dây
Sơ đồ ESP32 DevKit: chân GPIO23 nối qua điện trở 220 Ω tới chân dài của LED, chân ngắn của LED nối về GND.

Sơ đồ mạch: từ GPIO23 đi qua điện trở 220 Ω rồi vào chân dài của LED; chân ngắn về GND. Chiếu sơ đồ này lên bảng trong lúc cả lớp cắm mạch.

B1.2 Ảnh thực
Ảnh chụp mạch thật: bo ESP32 DevKit cắm cáp USB, hai dây nối sang breadboard có LED vàng và điện trở.

Chính mạch ấy khi đã cắm xong: dây vàng ở chân D23 chạy qua điện trở tới LED, dây còn lại đưa chân kia của LED về GND. Đèn nguồn đỏ trên bo đang sáng vì cáp USB đã cắm — nhưng LED vàng thì chưa, vì chưa nạp chương trình.

Mở sơ đồ này trên Wokwi Mô phỏng ngay trên trình duyệt, chưa cần bo mạch — hợp cho lúc chuẩn bị bài hoặc khi lớp thiếu thiết bị.

Bốn bước lắp

  1. Cắm LED lên breadboard. Chân dài là cực dương (+), chân ngắn là cực âm (−). Nếu hai chân đã bị cắt bằng nhau, nhìn vào vỏ nhựa: phía cực âm có một mặt vát phẳng.
  2. Cắm một đầu điện trở 220 Ω vào cùng hàng với chân dài của LED.
  3. Nối đầu còn lại của điện trở sang GPIO23 bằng dây trắng.
  4. Nối chân ngắn của LED xuống GND bằng dây đen.
Cắm ngược LED thì không có gì xảy ra cả

LED chỉ dẫn điện theo một chiều. Cắm ngược thì mạch coi như hở: LED không sáng, không nóng, không hỏng, và không báo lỗi gì hết. Học sinh sẽ ngồi soi lại chương trình trong mười phút trong khi lỗi nằm ở chỗ khác.

Cách chữa nhanh nhất khi cả nhóm bí: rút LED ra, xoay ngược 180°, cắm lại. Mất năm giây, và loại được ngay một nửa số nguyên nhân.

Đừng bỏ điện trở dù chỉ một lần

Nối thẳng LED vào GPIO vẫn sáng, sáng rất đẹp là đằng khác — nên học sinh rất dễ kết luận rằng con điện trở là thừa. Nhưng chân GPIO khi đó phải chịu dòng vượt mức thiết kế. Kiểu hỏng thường gặp không phải là cháy cả bo mà là chết đúng một chân: bo vẫn nạp được, chương trình vẫn chạy, chỉ mỗi chân đó không điều khiển được gì nữa.

Đó là kiểu hỏng khó chịu nhất vì nó không lộ ra ngay. Vài buổi sau, khi nhóm dùng lại đúng bo đó cho bài khác, cả nhóm sẽ đi tìm lỗi ở chỗ không có lỗi.

05

Mã nguồn

Toàn bộ mã trong bài chạy trên MicroPython 1.28 cho ESP32. Chép vào bo rồi đổi tên thành main.py là chạy mỗi lần cấp nguồn.

Bước 0 — kiểm tra mạch trước đã
# ------------------------------------------------------------
#  Bai 1 - Kiem tra mach truoc khi lam gi khac
#  Chi bat LED va giu nguyen. Sang la mach dung.
# ------------------------------------------------------------
from machine import Pin

led = Pin(23, Pin.OUT)
led.on()

Ba dòng, không có vòng lặp. Nạp vào và LED phải sáng liên tục. Nếu bước này chưa sáng thì đừng viết tiếp dòng nào — lỗi đang nằm ở mạch chứ không nằm ở chương trình.

Chương trình chính — LED nhấp nháy
# ------------------------------------------------------------
#  Bai 1 - LED nhap nhay
#  Phan cung: GPIO23 -> dien tro 220 ohm -> chan dai LED
#             chan ngan LED -> GND
# ------------------------------------------------------------
from machine import Pin
import time

# ===== CẤU HÌNH =====
CHAN_LED = 23             # LED cam o GPIO23
THOI_GIAN_SANG = 1000     # ms - LED sang bao lau
THOI_GIAN_TAT = 1000      # ms - LED tat bao lau
# ====================

led = Pin(CHAN_LED, Pin.OUT)

while True:
    led.on()
    time.sleep_ms(THOI_GIAN_SANG)

    led.off()
    time.sleep_ms(THOI_GIAN_TAT)

Hai dòng THOI_GIAN_SANG và THOI_GIAN_TAT tách riêng ra đầu chương trình là có chủ ý. Học sinh sẽ sửa hai con số này rất nhiều lần trong tiết, và chúng phải ở chỗ dễ tìm, không lẫn trong thân vòng lặp.

Bản mở rộng — đếm số lần nháy
# Them mot bien dem de thay chuong trinh dang chay den vong thu may
from machine import Pin
import time

CHAN_LED = 23
led = Pin(CHAN_LED, Pin.OUT)

lan = 0
while True:
    lan = lan + 1
    led.on()
    time.sleep_ms(1000)
    led.off()
    time.sleep_ms(1000)
    print("Da nhay", lan, "lan")

Cửa sổ dòng lệnh in ra:

Da nhay 1 lan
Da nhay 2 lan
Da nhay 3 lan
Da nhay 4 lan

Bản này chuẩn bị sẵn cho Bài 4 "Đếm số lần nhấn nút": khái niệm biến đếm đã xuất hiện ở đây, trong một hoàn cảnh học sinh đã hiểu rõ.

Em mô tả bằng tiếng Việt, hệ thống dựng thuật toán và chương trình, rồi nạp thẳng xuống ESP32 qua Wi-Fi.

06

Hiệu chuẩn và kiểm thử

Đo lại xem máy có đếm thời gian đúng không

Bài này có một phép kiểm tra rất gọn mà học sinh làm được ngay bằng điện thoại.

  1. Đặt THOI_GIAN_SANG và THOI_GIAN_TAT cùng bằng 1000.
  2. Bấm đồng hồ bấm giờ trên điện thoại, đếm đúng 30 lần nháy.
  3. Chia thời gian đo được cho 30. Kết quả phải rất gần 2 giây.

Sai lệch thường dưới 1%. Phần chênh đến từ thời gian chạy các lệnh khác trong vòng lặp — rất nhỏ so với một giây, nhưng có thật. Đây là lần đầu học sinh gặp ý niệm "chương trình cũng tốn thời gian để chạy", và nó sẽ quay lại ở mọi bài đo.

Danh sách kiểm trước khi coi là xong

  • Bước 0 làm LED sáng liên tục.
  • Chương trình chính cho nhịp nháy đều, sáng và tắt bằng nhau.
  • Đổi THOI_GIAN_SANG thành 200 thì thấy rõ sáng ngắn – tắt dài.
  • Đặt cả hai xuống 20 ms thì LED nhìn như sáng liên tục, và học sinh giải thích được vì sao.
  • Rút dây GND ra thì LED tắt — hiểu rằng mạch phải kín mới có dòng.
07

Kinh nghiệm và cạm bẫy

Con số nhỏ nhất mà mắt còn thấy được

Phần đáng giá nhất của tiết học này không nằm ở lúc LED nháy đúng, mà ở lúc cho học sinh giảm dần thời gian: 1000, rồi 500, 200, 100, 50, 20. Đến khoảng 20–30 ms thì mắt không còn tách được từng lần nháy nữa; LED trông như sáng liên tục nhưng mờ đi.

Hãy để các em tự tìm ra ngưỡng đó thay vì nói trước. Mỗi em một ngưỡng hơi khác nhau, và chính sự khác nhau ấy là cửa vào cho khái niệm hiện tượng lưu ảnh của mắt — thứ đứng sau màn hình, đèn LED chiếu sáng và cả phim ảnh.

Ba lỗi hay gặp trong tiết đầu
  • LED không sáng, chương trình không báo lỗi. Gần như luôn là cắm ngược LED, hoặc dây GND cắm nhầm hàng trên breadboard. Chạy lại Bước 0 để tách bạch mạch và chương trình.
  • LED sáng mờ liên tục thay vì nháy. Thời gian chờ đang quá nhỏ, hoặc học sinh quên hẳn dòng sleep_ms. Đây là lỗi tốt — nó dẫn thẳng vào ý chính của bài.
  • Chương trình chạy một lần rồi thôi. Bốn dòng trong thân vòng lặp bị thụt lề sai nên nằm ngoài while True:. Trong Python, lề không phải để cho đẹp — nó là cú pháp.
Buổi đưa bài này lên bo lần đầu mất gần một tiếng vì cáp

Bài học thì xong nhanh, nhưng khâu nạp chương trình vào bo suýt làm hỏng cả buổi. Bo DevKit cứ báo Invalid head of packet rồi dừng, trong khi cũng trang đó nạp cho bo ESP32-C3 thì trơn tru. Chúng tôi đi tìm lỗi ở máy chủ, ở gói chương trình, ở trình duyệt — sai chỗ hết.

Nguyên nhân thật nằm ở mạch tự khởi động lại của bo. Bo DevKit rẻ tiền dùng mạch hai transistor để tự đưa chip vào chế độ nạp, và mạch đó hay yếu. Bo C3 thì cắm thẳng USB vào chip nên không có khâu này để mà hỏng.

Bài học rút ra, xin thầy cô nhớ giúp: nếu bo DevKit không chịu nạp, hãy đưa nó vào chế độ nạp bằng tay — giữ nút BOOT, nhấn thả nút EN, rồi thả BOOT, đèn sẽ ngừng nháy, và bấm nạp ngay trong vài giây sau đó. Mẹo này cứu được gần như mọi bo bướng. Và với bài STEM, cả bộ chỉ phải làm việc đó đúng một lần: từ lần sau chương trình đi qua Wi-Fi.

Còn chuyện của chính thầy cô

Hộp trên viết từ quá trình dựng và chạy thử bài, chưa phải chuyện trên lớp. Sau buổi dạy đầu tiên, xin thầy cô thêm một tình huống đã thực sự xảy ra với học sinh mình — đó mới là thứ đồng nghiệp đọc để tránh.

08

Ứng dụng trong dạy học

Công nghệ 12Tin học 10STEM

Công nghệ — viên gạch đầu tiên của mạch điều khiển

Cả mạch nội dung Vi điều khiển đứng trên đúng một ý: chương trình đặt mức điện áp lên một chân, chân đó điều khiển một thiết bị. LED ở đây thay cho relay, quạt, bơm hay động cơ ở các bài sau. Đổi thiết bị thì đổi cách nối, còn dòng lệnh gần như giữ nguyên — hãy nói rõ điều đó với học sinh ngay từ bài này.

Tin học — vòng lặp có thật trước mắt

Trên giấy, while True: là một khái niệm trừu tượng. Ở đây nó là một con đèn không chịu tắt. Cho học sinh xóa thử dòng while True: và thụt lề lại cho đúng: LED nháy đúng một lần rồi thôi. Không có cách giải thích nào về vòng lặp gọn hơn thế.

Bài học STEM 5 hoạt động — "Đèn báo hiệu cho góc học tập"

Hoạt động 1 — Xác định vấn đề. Góc học nhóm trong lớp cần một đèn báo ba trạng thái nhìn từ xa là hiểu: đang trống, đang họp, và sắp hết giờ.

Tiêu chí sản phẩm: ba nhịp nháy phân biệt được từ cuối lớp; chỉ dùng một LED; một bạn chưa được giải thích trước phải đoán đúng cả ba nhịp.

Hoạt động 2 — Kiến thức nền. Chân ra số; điện trở hạn dòng; vòng lặp và thời gian; ngưỡng mắt người nhận ra được nhấp nháy.

Hoạt động 3 — Đề xuất và chọn phương án. Mỗi nhóm vẽ ba nhịp lên giấy kẻ ô thời gian trước khi lập trình, và giải thích vì sao chọn nhịp đó cho trạng thái đó.

Hoạt động 4 — Chế tạo và thử. Lập trình, đứng ở cuối lớp nhìn lại, chỉnh thời gian cho tới khi phân biệt được.

Hoạt động 5 — Báo cáo và điều chỉnh. Mời nhóm khác đoán. Nhóm bị đoán sai phân tích nguyên nhân rồi sửa nhịp.

Hướng mở rộng
  • Ghép nút nhấn của Bài 2 để đổi nhịp mà không cần nạp lại chương trình.
  • Thêm hai LED nữa thành đèn giao thông ba màu của Bài 3.
  • Thay on()/off() bằng PWM của Bài 8 để đèn sáng dần và tối dần thay vì bật tắt dứt khoát.
  • Hướng thi Khoa học kĩ thuật: đèn báo hiệu cho người khiếm thính, quy ước nhịp nháy thay cho chuông báo trong nhà.