ĐỊNH THỜI TIMER
Xin chào các bạn!
Chúng ta tiếp tục với Bài 5-6: Mô phỏng chức năng ngắt thời gian – Timer Interrupt.
Thông thường, trong Arduino thực tế, chúng ta có thể sử dụng thư viện TimerOne để tạo ngắt thời gian chính xác.
Tuy nhiên, trong môi trường Tinkercad, thư viện này không được hỗ trợ.
💡 Vậy giải pháp là gì?
Hôm nay, chúng ta sẽ dùng hàm millis()
để mô phỏng lại chức năng ngắt timer: cụ thể là làm LED nhấp nháy mỗi giây mà không dùng delay()
.
🛠️ PHẦN 1: CHUẨN BỊ MẠCH
Truy cập https://www.tinkercad.com. Trên Tinkercad, bạn hãy thực hiện các bước sau:
🔧 Linh kiện cần có:
- Arduino UNO
- LED
- 1 điện trở 220Ω
- Dây nối
🔌 Kết nối mạch:
- Kéo LED vào giao diện
- Nối chân dương (dài) của LED → qua điện trở → đến chân D13 của Arduino
- Nối chân âm (ngắn) của LED → GND
📌 Đây là mạch LED cơ bản – chúng ta sẽ điều khiển nó nhấp nháy đều đặn bằng code sử dụng millis()
.
💻 PHẦN 2: VIẾT CHƯƠNG TRÌNH
Chúng ta sẽ dùng biến thời gian lastTime
để lưu thời điểm gần nhất LED thay đổi trạng thái.
Mỗi khi đủ 1 giây trôi qua, ta đổi trạng thái LED, đồng thời cập nhật lại thời gian hiện tại.
✏️ Mã chương trình hoàn chỉnh:
unsigned long lastTime = 0; // Lưu thời điểm gần nhất LED thay đổi
int ledState = LOW; // Trạng thái hiện tại của LED
void setup() {
pinMode(13, OUTPUT); // Thiết lập chân D13 là OUTPUT
}
void loop() {
// Nếu đã đủ 1000ms kể từ lần cuối LED đổi trạng thái
if (millis() - lastTime >= 1000) {
ledState = !ledState; // Đảo trạng thái LED (HIGH ↔ LOW)
digitalWrite(13, ledState); // Ghi trạng thái mới ra chân D13
lastTime = millis(); // Cập nhật lại thời điểm hiện tại
}
}
🧠 GIẢI THÍCH CƠ CHẾ HOẠT ĐỘNG:
millis()
là hàm trả về số mili giây kể từ khi Arduino khởi động- Chúng ta kiểm tra millis() – lastTime >= 1000, tức là đã đủ 1 giây chưa
- Nếu đủ, thì đổi trạng thái LED (bật/tắt), rồi cập nhật lại lastTime
🎯 Đây chính là cách mô phỏng hành vi của một ngắt định kỳ, nhưng không làm chương trình bị chặn như delay()
.
▶️ PHẦN 3: CHẠY MÔ PHỎNG
- Nhấn Start Simulation
- Quan sát: đèn LED ở chân D13 sẽ sáng 1 giây, tắt 1 giây, lặp lại liên tục
🎯 PHẦN 4: TỔNG KẾT
Qua bài học này, bạn đã học được cách:
- Sử dụng hàm
millis()
để kiểm soát thời gian chính xác - Mô phỏng ngắt thời gian định kỳ mà không cần thư viện ngoài
- Điều khiển LED nhấp nháy mà không dùng
delay()
, rất hữu ích khi muốn chạy nhiều chức năng song song
Bài tập thực hành
🧪 Bài 1: 2 LED nhấp nháy với thời gian khác nhau
Mô tả:
- LED1 nhấp nháy mỗi 1 giây
- LED2 nhấp nháy mỗi 250 mili giây
🔧 Gợi ý:
- Dùng 2 biến
lastTime1
,lastTime2
- Kiểm tra từng khoảng thời gian riêng biệt với
millis()
✅ Kỹ năng: Quản lý nhiều tiến trình thời gian độc lập
🧪 Bài 2: LED bật sau 3 giây kể từ khi nhấn nút
Mô tả:
- Khi nhấn nút và giữ, bắt đầu tính giờ
- Nếu giữ đủ 3 giây, LED bật
- Nếu thả nút trước 3 giây, LED không bật
🔧 Gợi ý:
- Dùng biến
pressStart
=millis()
- Kiểm tra
millis() - pressStart >= 3000
✅ Kỹ năng: Đo thời gian giữ nút – nền tảng cho chức năng hẹn giờ, reset lâu,…
🧪 Bài 3: LED sáng trong 2 giây sau mỗi lần nhấn nút
Mô tả:
- Khi nhấn nút, LED bật
- LED tự tắt sau đúng 2 giây, không cần giữ
🔧 Gợi ý:
- Dùng
ledStartTime
khi nút được nhấn - So sánh
millis()
vớiledStartTime
✅ Kỹ năng: Sự kiện có thời hạn tự động, không dùng delay()
🧪 Bài 4: Hiển thị thời gian thực (giả lập đồng hồ số)
Mô tả:
- Dùng
Serial.print()
để in số giây kể từ khi khởi động - Mỗi giây in một dòng:
Đã chạy được X giây
🔧 Gợi ý:
- Dùng biến
counter
vàlastPrintTime
- Mỗi 1000ms, tăng
counter
, in ra
✅ Kỹ năng: Quản lý thời gian chính xác bằng millis()
, ứng dụng vào đồng hồ số, timer, v.v.
🧪 Bài 5: Nhấn nút đổi thời gian nhấp nháy LED
Mô tả:
- LED ban đầu nhấp nháy mỗi 1 giây
- Mỗi lần nhấn nút → đổi thời gian: 1000ms → 500ms → 200ms → quay lại 1000ms
🔧 Gợi ý:
- Mảng hoặc biến
interval
, chuyển giá trị mỗi lần nhấn - Gắn vào cơ chế kiểm tra
millis()
như Bài 5-6
✅ Kỹ năng: Thay đổi tham số thời gian động, ứng dụng cho tốc độ quạt, đèn nháy, v.v.