IoTLabs

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

LED Blink — Hiểu Cấu Trúc Sketch và Điều Khiển LED Ngoài

Skeleton Của Mọi Sketch Arduino

Mọi chương trình Arduino (gọi là sketch) đều có cùng một cấu trúc cơ bản:

void setup() {
  // Chạy MỘT LẦN khi board khởi động
  // Dùng để khởi tạo: cấu hình chân, bắt đầu serial, ...
}

void loop() {
  // Chạy LẶP LẠI vô tận sau khi setup() xong
  // Đây là "trái tim" của chương trình
}

Đây là điểm khác biệt quan trọng so với lập trình C/C++ thông thường — Arduino không có hàm main() theo nghĩa thông thường. Thư viện runtime của Arduino gọi setup() một lần, sau đó gọi loop() liên tục cho đến khi tắt nguồn.

Ba Hàm Cốt Lõi Trong Bài Này

pinMode(pin, mode)

Cấu hình một chân digital làm đầu vào hoặc đầu ra:

pinMode(13, OUTPUT);      // Chân 13 là output
pinMode(2, INPUT);        // Chân 2 là input
pinMode(4, INPUT_PULLUP); // Chân 4 là input với điện trở kéo lên nội
ModeÝ nghĩa
OUTPUTChân xuất tín hiệu (điều khiển thiết bị ngoài)
INPUTChân đọc tín hiệu (cần điện trở ngoài)
INPUT_PULLUPInput với 20–50 kΩ pull-up nội → đơn giản hơn

digitalWrite(pin, value)

Đặt giá trị cho chân digital OUTPUT:

digitalWrite(13, HIGH); // Xuất 5V ra chân 13
digitalWrite(13, LOW);  // Xuất 0V ra chân 13

HIGH = 5V (trên Arduino 5V), LOW = 0V (GND).

delay(ms)

Dừng thực thi chương trình trong ms mili giây:

delay(1000);  // Dừng 1 giây
delay(500);   // Dừng 0.5 giây
delay(100);   // Dừng 0.1 giây

Hạn chế của delay(): Trong khi delay() chạy, board không làm gì khác được — không đọc cảm biến, không nhận lệnh. Bài sau sẽ giới thiệu millis() để khắc phục điều này.

Kết Nối LED Ngoài

LED tích hợp trên board (pin 13) chỉ để test. Để kết nối LED ngoài, bạn cần:

Linh kiện cần:

  • 1 LED màu đỏ/xanh/vàng
  • 1 điện trở 220Ω (dải màu: đỏ-đỏ-nâu)
  • Breadboard và dây cắm

Tại sao cần điện trở?

LED không tự giới hạn dòng điện — nếu cắm thẳng vào 5V sẽ bị cháy ngay. Điện trở 220Ω giới hạn dòng qua LED:

Dòng = (5V - 2V) / 220Ω ≈ 14 mA  ✓ (LED thường cần 5–20 mA)

Sơ đồ kết nối:

Arduino D13 ──[220Ω]──▷|── GND
                   (LED)
  • Chân dài của LED (+, anode) nối vào điện trở → chân D13
  • Chân ngắn của LED (-, cathode) nối thẳng vào GND

Code: LED Blink Đầy Đủ

// Khai báo hằng số cho pin LED
const int LED_PIN = 13;

void setup() {
  // Cấu hình pin 13 làm output
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN, HIGH); // Bật LED
  delay(1000);                 // Giữ sáng 1 giây

  digitalWrite(LED_PIN, LOW);  // Tắt LED
  delay(1000);                 // Giữ tắt 1 giây
}

Best practice: Dùng hằng số (const int LED_PIN = 13) thay vì số cứng. Khi đổi chân, chỉ sửa một chỗ.

Thử Nghiệm: Pattern LED Nâng Cao

3 Lần Nháy Nhanh, Rồi Dừng

const int LED_PIN = 13;

void blink(int times, int onTime, int offTime) {
  for (int i = 0; i < times; i++) {
    digitalWrite(LED_PIN, HIGH);
    delay(onTime);
    digitalWrite(LED_PIN, LOW);
    delay(offTime);
  }
}

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  blink(3, 150, 150); // 3 lần nháy nhanh
  delay(1000);        // Dừng 1 giây
}

Nhiều LED Cùng Lúc

const int LEDS[] = {11, 12, 13};
const int NUM_LEDS = 3;

void setup() {
  for (int i = 0; i < NUM_LEDS; i++) {
    pinMode(LEDS[i], OUTPUT);
  }
}

void loop() {
  // Chạy đèn từ trái sang phải
  for (int i = 0; i < NUM_LEDS; i++) {
    digitalWrite(LEDS[i], HIGH);
    delay(200);
    digitalWrite(LEDS[i], LOW);
  }
}

Kết nối 3 LED vào chân D11, D12, D13 (mỗi LED một điện trở 220Ω riêng) — bạn có hiệu ứng “đèn chạy” kinh điển!

Hiểu LED_BUILTIN

Trong sketch Blink ví dụ của Arduino, bạn thấy LED_BUILTIN thay vì số 13. Đây là hằng số được định nghĩa sẵn trong thư viện Arduino:

// Trong hardware/arduino/avr/variants/standard/pins_arduino.h
#define LED_BUILTIN 13

Dùng LEDBUILTIN giúp code tương thích với nhiều board khác nhau (ví dụ trên ESP32, LEDBUILTIN có thể là pin 2).

Tổng Kết

Những khái niệm quan trọng trong bài:

Khái niệmÝ nghĩa
setup()Chạy một lần khi khởi động — khởi tạo
loop()Chạy lặp vô tận — logic chính
pinMode()Cấu hình chân INPUT/OUTPUT
digitalWrite()Xuất HIGH/LOW ra chân
delay()Dừng (ms) — nhưng chặn toàn bộ
Điện trở 220ΩBảo vệ LED khỏi quá dòng

Bài tiếp theo: Đọc nút nhấn — chúng ta sẽ học digitalRead()INPUT_PULLUP để tạo tương tác người dùng. Chuẩn bị thêm một nút nhấn (push button) nhé!