Đèn giao thông ngã tư với ESP32: dự án STEM chủ đề giao thông cho học sinh

Làm đèn giao thông ngã tư thu nhỏ với ESP32: 6 đèn LED cho hai hướng, bảng 6 pha, millis không dùng delay dài, dây cảm ứng làm nút xin qua đường và mô hình bìa cứng.

Đèn giao thông là "chương trình máy tính" mà trẻ gặp mỗi ngày trên đường đi học. Dự án này cho học sinh tự làm một ngã tư thu nhỏ: 6 đèn LED cho hai hướng đường, ESP32 điều khiển theo một bảng pha, và một dây cảm ứng làm nút xin qua đường cho người đi bộ. Qua dự án, trẻ vừa ôn luật giao thông, vừa học cách mô tả một quy trình lặp lại bằng bảng trạng thái, một ý tưởng rất quan trọng trong lập trình.

1. Chuẩn bị

2. Ba màu đèn và luật đi đường

  • Đèn xanh: được đi.
  • Đèn vàng: phải dừng lại trước vạch dừng, trừ khi đã đi quá vạch dừng thì được đi tiếp. Đèn vàng không phải là "đi nhanh lên".
  • Đèn đỏ: dừng lại trước vạch dừng.

Một điều trẻ ít để ý: sau đèn vàng của hướng này, có một khoảng ngắn cả hai hướng cùng đỏ, để xe cuối cùng kịp ra khỏi ngã tư rồi hướng kia mới được đi. Chương trình trong bài cũng làm như vậy.

3. Nối dây

Sơ đồ nối 6 LED với ESP32 DevKit V1: hướng A đỏ D25, vàng D26, xanh D27 ở bên trái; hướng B đỏ D23, vàng D22, xanh D21 ở bên phải; mỗi LED nối tiếp điện trở 220 ohm rồi về thanh GND; dây ở D4 là nút cảm ứng xin qua đường
Hình minh họa: mỗi nhánh gồm chân ESP32, điện trở 220 Ω, LED, về GND.
Chân nối đèn giao thông
HướngĐỏVàngXanh
A (đường dọc)D25D26D27
B (đường ngang)D23D22D21
  • LED có chiều: chân dài (dương) quay về phía chân ESP32, chân ngắn về GND. Cắm ngược thì đèn không sáng nhưng không hỏng.
  • Điện trở 220 Ω giới hạn dòng qua LED. Chân ESP32 cho ra 3,3 V, LED đỏ cần khoảng 2 V, nên dòng điện khoảng (3,3 − 2) : 220 ≈ 6 mA: đủ sáng và an toàn cho chân ESP32.
  • Một dây cắm ở D4, đầu kia để trống hoặc dán vào miếng giấy bạc: đó là nút cảm ứng "xin qua đường".

4. Bảng pha: mô tả đèn giao thông bằng dữ liệu

Biểu đồ thời gian một chu kỳ 24 giây: hướng A xanh 8 giây, vàng 3 giây, rồi đỏ; hướng B đỏ trong lúc A xanh và vàng, rồi xanh 8 giây, vàng 3 giây; giữa hai lượt có 1 giây cả hai hướng cùng đỏ; bảng 6 pha kèm thời gian
Hình minh họa: dựng từ đúng bảng PHA của chương trình.

Thay vì viết hàng chục lệnh bật, tắt rời rạc, chương trình mô tả đèn giao thông bằng một bảng 6 pha. Mỗi pha ghi: tên, thời gian, đèn nào của hướng A sáng, đèn nào của hướng B sáng. Chương trình chỉ việc chạy lần lượt từng dòng của bảng, hết dòng cuối thì quay lại dòng đầu.

// PYWORLD.VN - ESP32 DevKit V1: đèn giao thông ngã tư cho hai hướng A và B
// Hướng A: đỏ D25, vàng D26, xanh D27; hướng B: đỏ D23, vàng D22, xanh D21 (mỗi LED nối tiếp điện trở 220 ohm xuống GND)
// Dây cảm ứng ở D4 là "nút xin qua đường": chạm vào thì đèn xanh đang chạy được rút ngắn

const int A_DO = 25, A_VANG = 26, A_XANH = 27;
const int B_DO = 23, B_VANG = 22, B_XANH = 21;
const int CHAN_CHAM = 4;
const int DEN[6] = {A_DO, A_VANG, A_XANH, B_DO, B_VANG, B_XANH};

const unsigned long XANH_MS = 8000;      // thời gian đèn xanh
const unsigned long VANG_MS = 3000;      // thời gian đèn vàng
const unsigned long DO_CHUNG_MS = 1000;  // hai hướng cùng đỏ để xe cuối kịp ra khỏi ngã tư
const unsigned long XANH_CON_LAI_MS = 3000;  // có người xin qua đường: đèn xanh chỉ còn tối đa chừng này

struct Pha {
  const char* ten;
  unsigned long thoiGian;
  bool a[3];                    // hướng A: đỏ, vàng, xanh
  bool b[3];                    // hướng B: đỏ, vàng, xanh
};

const Pha PHA[] = {
  {"A xanh, B do",   XANH_MS,     {0, 0, 1}, {1, 0, 0}},
  {"A vang, B do",   VANG_MS,     {0, 1, 0}, {1, 0, 0}},
  {"Hai huong do",   DO_CHUNG_MS, {1, 0, 0}, {1, 0, 0}},
  {"A do, B xanh",   XANH_MS,     {1, 0, 0}, {0, 0, 1}},
  {"A do, B vang",   VANG_MS,     {1, 0, 0}, {0, 1, 0}},
  {"Hai huong do",   DO_CHUNG_MS, {1, 0, 0}, {1, 0, 0}},
};
const int SO_PHA = sizeof(PHA) / sizeof(PHA[0]);

int pha = 0;
unsigned long batDauPha = 0, thoiGianPha = 0;
uint32_t giaTriNen = 1;
bool dangCham = false;

void batPha(int p) {
  pha = p;
  batDauPha = millis();
  thoiGianPha = PHA[p].thoiGian;
  for (int i = 0; i < 3; i++) {
    digitalWrite(DEN[i], PHA[p].a[i] ? HIGH : LOW);
    digitalWrite(DEN[3 + i], PHA[p].b[i] ? HIGH : LOW);
  }
  Serial.printf("[%lu s] %s (%lu giay)\n", millis() / 1000, PHA[p].ten, thoiGianPha / 1000);
}

bool dangXanh() {
  return PHA[pha].a[2] || PHA[pha].b[2];
}

// Chạm vào dây D4: độ lệch so với giá trị nền vượt 30 %
bool vuaCham() {
  uint32_t v = touchRead(CHAN_CHAM);
  float lech = ((float)v - (float)giaTriNen) / giaTriNen;
  if (lech < 0) lech = -lech;
  bool cham = lech > 0.30;
  bool moi = cham && !dangCham;
  dangCham = cham;
  return moi;
}

void setup() {
  Serial.begin(115200);
  for (int i = 0; i < 6; i++) pinMode(DEN[i], OUTPUT);
  delay(500);
  uint32_t tong = 0;
  for (int i = 0; i < 30; i++) {          // lúc khởi động không chạm dây D4
    tong += touchRead(CHAN_CHAM);
    delay(2);
  }
  giaTriNen = tong / 30;
  if (giaTriNen == 0) giaTriNen = 1;
  batPha(0);
}

void loop() {
  unsigned long daChay = millis() - batDauPha;
  if (vuaCham() && dangXanh() && daChay + XANH_CON_LAI_MS < thoiGianPha) {
    thoiGianPha = daChay + XANH_CON_LAI_MS;   // rút ngắn đèn xanh đang chạy
    Serial.println("Co nguoi xin qua duong: den xanh con 3 giay");
  }
  if (daChay >= thoiGianPha) {
    batPha((pha + 1) % SO_PHA);
  }
  delay(20);
}
  • struct Pha và mảng PHA[]: mỗi phần tử là một dòng của bảng. Muốn đổi thời gian đèn xanh, chỉ sửa XANH_MS; muốn thêm pha, chỉ thêm một dòng.
  • Không dùng delay() dài: chương trình ghi thời điểm bắt đầu pha (batDauPha) và so với millis(). Nhờ vậy, trong lúc đèn đang sáng, ESP32 vẫn kiểm tra được nút cảm ứng.
  • Nút xin qua đường: chạm vào dây D4 khi một hướng đang xanh và còn hơn 3 giây, đèn xanh được rút ngắn chỉ còn 3 giây. Cảm ứng dùng độ lệch so với giá trị nền như bài chạm tay bật đèn, nên lúc cấp điện đừng chạm vào dây.
  • Mở Serial Monitor (115200 baud) để xem mỗi lần đổi pha.

5. Làm mô hình ngã tư

Mô hình ngã tư nhìn từ trên xuống: đường dọc là hướng A, đường ngang là hướng B, bốn cột đèn ở bốn góc, vạch qua đường cho người đi bộ, nút chạm xin qua đường; lúc hướng A xanh xe đi lên, hướng B đỏ xe dừng
Hình minh họa: nhìn từ trên xuống.
  • Vẽ hai con đường cắt nhau trên bìa cứng, kẻ vạch qua đường cho người đi bộ.
  • Cắm LED vào ống hút làm cột đèn, luồn dây xuống dưới bìa. Ở ngã tư thật, mỗi hướng có đèn ở cả hai phía đường; trong mô hình, có thể nối thêm LED song song cùng chân (mỗi LED một điện trở riêng).
  • Dán miếng giấy bạc nối với dây D4 ở góc đường làm nút xin qua đường.
  • Trẻ đóng vai người lái xe đồ chơi: đèn đỏ thì dừng trước vạch, đèn vàng thì sao?

6. Xử lý lỗi thường gặp

Lỗi thường gặp và cách xử lý
Hiện tượngNguyên nhân thường gặpCách xử lý
Một LED không bao giờ sángCắm ngược chiều LED; lỏng dâyXoay ngược LED: chân dài về phía chân ESP32
Đèn sáng sai màu, sai hướngCắm nhầm chânSo lại với bảng chân nối ở mục 3
Đèn xanh tự rút ngắn dù không ai chạmLúc cấp điện đang chạm dây D4, giá trị nền saiBỏ tay ra, bấm nút EN để khởi động lại
Chạm dây D4 không có tác dụngĐèn đang vàng hoặc đỏ, hoặc đèn xanh chỉ còn dưới 3 giâyChạm khi một hướng vừa chuyển xanh để thấy rõ

7. Thử thách mở rộng

  • Đường chính, đường phụ: cho hướng A xanh 12 giây, hướng B xanh 6 giây. Cần sửa bảng như thế nào?
  • Chế độ ban đêm: thêm một pha đặc biệt: cả hai hướng đèn vàng nhấp nháy.
  • Đèn cho người đi bộ: thêm một LED đỏ, một LED xanh hình người đi bộ; xanh khi hướng xe cắt qua vạch đang đỏ.
  • Đếm ngược: in số giây còn lại của đèn xanh mỗi giây trên Serial Monitor, hoặc hiện lên màn hình OLED.

8. Gợi ý cho phụ huynh và giáo viên

  • Bắt đầu từ quan sát thật: trước buổi học, cho trẻ đứng ở một ngã tư (an toàn, có người lớn) đếm số giây của đèn xanh, vàng, đỏ. Kết quả đó chính là dữ liệu để điền vào bảng pha.
  • Liên môn: giáo dục an toàn giao thông, Toán (thời gian, biểu đồ), Tin học (bảng, vòng lặp, trạng thái).
  • Độ tuổi: lớp 4–7. Học sinh nhỏ làm mô hình và chơi đóng vai; học sinh lớn đọc và sửa bảng pha.
  • Thời lượng: 2–3 buổi 45 phút: nối LED và chạy chương trình; làm mô hình; thử thách.

9. Xem thêm


Tin tức liên quan

Đèn trung thu nhấp nháy với ESP32 và pin 18650: dự án STEM cho học sinh
Đèn trung thu nhấp nháy với ESP32 và pin 18650: dự án STEM cho học sinh

Làm đèn ông sao trung thu với ESP32, 3 LED và mô đun pin 18650: 4 hiệu ứng chạy vòng, thở, lung linh, chạm cán đổi hiệu ứng, PWM, cách làm vỏ đèn và an toàn với pin.

Điện trở: đọc mã vạch màu, mã SMD, sai số, công suất và cách chọn
Điện trở: đọc mã vạch màu, mã SMD, sai số, công suất và cách chọn

Điện trở dùng để làm gì, các loại điện trở, cách đọc mã vạch màu 4 vòng và 5 vòng, đọc mã điện trở dán SMD, dãy giá trị chuẩn E12, sai số, công suất và các bước chọn điện trở cho mạch.

Scratch là gì? Bắt đầu với ScratchJr và Scratch cho học sinh lớp 4–5
Scratch là gì? Bắt đầu với ScratchJr và Scratch cho học sinh lớp 4–5

Scratch là gì, khác ScratchJr thế nào, cách dùng trên trình duyệt hoặc cài trên máy, năm vùng màn hình làm việc, chương trình đầu tiên và năm bài tập cho học sinh lớp 4–5.

Chọn cỡ vali theo thiết bị: đo kích thước lọt lòng, độ sâu nắp và đáy
Chọn cỡ vali theo thiết bị: đo kích thước lọt lòng, độ sâu nắp và đáy

Hướng dẫn đo thiết bị, tính phần xốp và xếp nhiều món để chọn đúng cỡ vali; kèm bảng tra kích thước lọt lòng, độ sâu nắp và đáy của các dòng vali PYWORLD và ba ví dụ chọn cỡ.

Tư duy logic, phản biện, thiết kế và kỹ năng 4C: rèn cho trẻ qua hoạt động STEM
Tư duy logic, phản biện, thiết kế và kỹ năng 4C: rèn cho trẻ qua hoạt động STEM

Phân biệt tư duy logic, phản biện, thiết kế và kỹ năng 4C bằng ví dụ; câu đố logic 4 x 4, thí nghiệm kiểm chứng, dự án hộp bút theo tư duy thiết kế và bảng đánh giá 4C.

Góc STEM tại nhà và câu lạc bộ STEM: dụng cụ, an toàn, kế hoạch 8 buổi, ngày hội STEM
Góc STEM tại nhà và câu lạc bộ STEM: dụng cụ, an toàn, kế hoạch 8 buổi, ngày hội STEM

Cẩm nang cho phụ huynh và giáo viên: bố trí góc STEM tại nhà, dụng cụ theo độ tuổi, quy tắc an toàn, kế hoạch 8 buổi cho câu lạc bộ STEM và cách tổ chức ngày hội STEM ở trường.

Hiệu chuẩn LVDT và cảm biến dòng xoáy: bộ hiệu chuẩn vi kế, hệ số thang, độ tuyến tính, vật liệu bia
Hiệu chuẩn LVDT và cảm biến dòng xoáy: bộ hiệu chuẩn vi kế, hệ số thang, độ tuyến tính, vật liệu bia

Hiệu chuẩn tĩnh LVDT và đầu dò dòng xoáy đo khe hở: bộ hiệu chuẩn vi kế, tính hệ số thang, hệ số từng đoạn, độ lệch đường thẳng, sai số tuyến tính và ảnh hưởng của vật liệu bia.

Quy trình thiết kế kỹ thuật trong dự án STEM: 5 hoạt động, ví dụ làm cối xay gió nâng vật
Quy trình thiết kế kỹ thuật trong dự án STEM: 5 hoạt động, ví dụ làm cối xay gió nâng vật

Dự án STEM là gì và quy trình thiết kế kỹ thuật 8 bước, 5 hoạt động theo hướng dẫn của Bộ GD&ĐT, minh họa bằng dự án cối xay gió nâng vật với phiếu thử nghiệm công bằng.


Bình luận
Đã thêm vào giỏ hàng