Bài nhập môn: nút nhấn bật/tắt đèn LED (Arduino Nano)

Bài đầu tiên cho người mới học điện tử: bấm nút một lần đèn sáng, bấm lần nữa đèn tắt. Học được cách nối LED đúng chiều, tính điện trở hạn dòng, trở kéo lên bên trong chip và chống dội phím bằng code.

⏱ 30 phút🔧 Mới học💰 Linh kiện ~86.400đ🧠 Arduino Nano⚡ Nguồn USB 5V

✅ Đã kiểm thử

Luật điệnKhông lỗiSai chân, chập nguồn, quá áp 5V vào chân 3,3V, thiếu đi-ốt, thiếu trở kéo…
Mô phỏng SPICE2/2 kịch bản · 9 phép đo đạtDòng/áp từng linh kiện ở trường hợp xấu nhất (ngspice)
Biên dịch codeĐạt · dùng 7% bộ nhớarduino:avr:nano
Xem chi tiết 9 phép đo

Đèn đang sáng, đang bấm nút

  • D1: dòng 9.0mA (cho phép 20.0mA).
  • Chân D9 cấp 9.0mA (an toàn ≤ 20.0mA).
  • Tổng dòng đỉnh từ USB 39.0mA (đủ với cục sạc 5V 1A).
  • Dòng qua LED (≈9mA: đủ sáng, an toàn): 9.0mA ✓
  • Dòng chân D9 phải cấp (giới hạn 20mA): 9.0mA ✓
  • Chân D2 khi bấm nút đọc mức THẤP: 0.00V ✓

Đèn tắt, thả nút

  • Tổng dòng đỉnh từ USB 30.0mA (đủ với cục sạc 5V 1A).
  • LED tắt: 0.0mA ✓
  • Chân D2 khi thả nút đọc mức CAO: 4.98V ✓
Kiểm lần cuối: 12:02:53 12/11/2026

Nguyên lý hoạt động

Chân D9 xuất 5V khi muốn đèn sáng. LED đỏ cần khoảng 1,9V, phần còn lại 3,1V rơi trên trở 330Ω → dòng I = 3,1V ÷ 330Ω ≈ 9mA (định luật Ôm). Không có trở, dòng sẽ vọt lên rất lớn làm cháy LED và hỏng chân Arduino. Nút nhấn nối D2 xuống GND; lệnh pinMode(D2, INPUT_PULLUP) bật một trở ~40kΩ bên trong chip kéo D2 lên 5V, nên thả nút đọc được HIGH, bấm nút đọc được LOW. Khi bấm, lá kim loại trong nút bị nảy vài mili giây tạo ra nhiều lần bật/tắt giả (gọi là dội phím); code chỉ chấp nhận thay đổi khi tín hiệu đứng yên đủ 30ms.

Sơ đồ đấu dây

Mỗi màu là một dây. Chấm tròn là điểm hàn. Chạm vào tên dây trong bảng để làm nổi bật.

GNDGNDLED_DRVLED_DRVLED_ALED_ABTNBTNU1 · Arduino NanoD2D9GNDSW1 · Nút nhấn12R1 · Điện trở 330Ω12D1 · Đèn LED 5mmA · chân dài (+)K · chân ngắn (−)
#DâyNối các điểm
1đen
GND
U1 GND ⟷ D1 K · chân ngắn (−) ⟷ SW1 2
2vàng
LED_DRV
U1 D9 ⟷ R1 1
3xanh lá
LED_A
R1 2 ⟷ D1 A · chân dài (+)
4xanh dương
BTN
U1 D2 ⟷ SW1 1

Danh sách linh kiện

Ký hiệuLinh kiệnGiá tham khảo
U1Arduino Nano V3 (ATmega328P, chip nạp CH340) kèm cáp USB85.000đTìm mua
D1LED đỏ 5mm (red)300đTìm mua
R1Điện trở 330Ω 1/4W (cam-cam-nâu)100đTìm mua
SW1Nút nhấn 4 chân 6×6mm1.000đTìm mua
Tổng (chưa gồm board hàn, dây, thiếc)86.400đ

Các bước làm

Code nạp cho mạch

Chọn board Arduino Nano.

/*
  Mạch Gọn — Bài nhập môn: nút nhấn bật/tắt LED
  Board: Arduino Nano
  Chân : D9 -> trở 330Ω -> LED -> GND
         D2 -> nút nhấn -> GND (dùng trở kéo lên bên trong chip)
*/

const uint8_t PIN_LED = 9;
const uint8_t PIN_BTN = 2;
const unsigned long DEBOUNCE_MS = 30;   // thời gian chờ tín hiệu nút ổn định

bool ledOn = false;                     // trạng thái đèn hiện tại
bool btnStable = HIGH;                  // trạng thái nút đã ổn định (HIGH = đang thả)
bool btnLastRead = HIGH;                // lần đọc gần nhất
unsigned long lastChange = 0;           // thời điểm tín hiệu thay đổi gần nhất
unsigned long pressCount = 0;

void setup() {
  Serial.begin(115200);
  pinMode(PIN_LED, OUTPUT);
  pinMode(PIN_BTN, INPUT_PULLUP);       // thả nút = HIGH, bấm nút = LOW
  digitalWrite(PIN_LED, LOW);
  Serial.println(F("San sang. Bam nut de bat/tat den."));
}

void loop() {
  bool reading = digitalRead(PIN_BTN);

  // tín hiệu vừa đổi -> ghi lại thời điểm, chờ nó đứng yên
  if (reading != btnLastRead) {
    btnLastRead = reading;
    lastChange = millis();
  }

  // tín hiệu đã đứng yên đủ lâu và khác trạng thái cũ -> chấp nhận
  if (millis() - lastChange >= DEBOUNCE_MS && reading != btnStable) {
    btnStable = reading;
    if (btnStable == LOW) {             // vừa bấm xuống
      ledOn = !ledOn;
      digitalWrite(PIN_LED, ledOn ? HIGH : LOW);
      pressCount++;
      Serial.print(F("Lan bam thu "));
      Serial.print(pressCount);
      Serial.println(ledOn ? F(": DEN SANG") : F(": DEN TAT"));
    }
  }
}

Đo kiểm bằng đồng hồ vạn năng

Hai đầu điện trở 330Ω khi đèn sángkhoảng 3,0V (≈9mA)
Chân D2 với GND khi không bấmkhoảng 5V
Chân D2 với GND khi đang bấm0V

Sửa lỗi thường gặp

LED không sáng

Xoay ngược LED (rất hay gặp). Kiểm tra trở có cùng hàng với chân D9 không. Thử mở code mẫu File → Examples → Basics → Blink để chắc Nano hoạt động.

Bấm nút đèn lúc đổi lúc không

Nút đang cắm 2 chân luôn thông nhau. Dùng 2 chân chéo nhau của nút.

Máy tính không nhận Arduino

Cài driver CH340, đổi cáp USB (nhiều cáp chỉ để sạc, không có dây dữ liệu), thử cổng USB khác.

⚠️ An toàn

  • Chỉ dùng điện 5V từ cổng USB, an toàn tuyệt đối khi chạm tay.
  • Luôn có điện trở nối tiếp với LED.