Arduino IDE 2: tự gợi ý code, quản lý board và thư viện, gỡ lỗi từng bước, log khi không có JTAG
Dùng Arduino IDE 2 hiệu quả: tự gợi ý code, nhảy tới định nghĩa, quản lý board và thư viện, thư mục của IDE, gỡ lỗi từng bước, macro log có mức cho ESP32.
Arduino IDE 2 không chỉ có giao diện mới. Bản này tự gợi ý code khi gõ, nhảy tới nơi định nghĩa hàm, đổi tên biến khắp chương trình, quản lý board và thư viện ở thanh bên, và gỡ lỗi từng bước với bo mạch hỗ trợ. Bài này chỉ những tính năng đáng dùng, file của IDE nằm ở đâu, các cài đặt nên đổi, gỡ lỗi được với bo nào, và khi không có mạch gỡ lỗi thì dùng log thế nào cho hiệu quả. Phần cài gói ESP32 đã có ở bài cài ESP32 vào Arduino IDE 2.
1. Giao diện

Khác nhiều nhất so với bản 1.8 là thanh bên trái: Sketchbook, Boards Manager, Library Manager, Debug, Search. Serial Monitor không còn là cửa sổ rời mà nằm ở khung dưới, nhờ đó vẫn sửa code được khi đang xem Serial.
2. Tự gợi ý và điều hướng code
Phần phân tích code dùng clangd, nên cần chọn đúng board trước. Lần đầu mở sketch có thể chờ vài giây tới khi chỉ mục xong. Các việc hay dùng:
- Gõ
Serial.là hiện danh sách hàm kèm tham số. - Giữ Ctrl rồi bấm vào tên hàm, hoặc F12, để mở nơi định nghĩa, kể cả trong thư viện. Đây là cách nhanh nhất để biết một hàm thật sự làm gì.
- F2 đổi tên biến ở mọi nơi, an toàn hơn tìm và thay.
- Rê chuột vào tên hàm để xem chữ ký. Lỗi cú pháp được gạch đỏ ngay khi gõ.

3. Quản lý board và thư viện
Trong Boards Manager và Library Manager, mỗi mục có ô chọn phiên bản. Khi một dự án cũ đột nhiên lỗi sau cập nhật, quay về phiên bản trước ở đây, không cần cài lại IDE. Muốn dự án dùng lại được sau này, ghi phiên bản gói board và thư viện vào đầu file. Lỗi trùng thư viện xem bài lỗi thư viện Arduino cùng cụm.


4. Gỡ lỗi từng bước
Gỡ lỗi nghĩa là dừng chương trình ở một dòng, xem biến, chạy từng lệnh. Việc này cần phần cứng hỗ trợ, không phải board nào cũng có.

Với bo hỗ trợ: chọn Sketch → Optimize for Debugging, nạp lại, bấm nút Start Debugging, đặt điểm dừng bằng cách bấm vào lề trái số dòng. Khung Debug hiện biến, ngăn xếp lời gọi, thanh ghi. Bật tối ưu cho gỡ lỗi làm chương trình lớn và chậm hơn, nên tắt khi xong.
ESP32 DevKit thường cần mạch JTAG ngoài nối D12 (TDI), D13 (TCK), D14 (TMS), D15 (TDO), và phần cấu hình trong gói board. Nhiều bạn mới không cần tới mức này. ESP32 DevKit có Serial sẵn, log có kiểm soát giải quyết được phần lớn trường hợp.
5. Log có mức khi không có mạch gỡ lỗi
Thay vì rải Serial.println rồi xóa, dùng macro có mức. Đổi một số là tắt toàn bộ, không phải sửa từng dòng.
// PYWORLD.VN - Macro log theo mức cho Arduino, ESP32: khi không có mạch gỡ lỗi thì in có kiểm soát, tắt là biến mất khỏi chương trình
// PYWORLD.VN - Đổi MUC_LOG: 0 tắt hết, 1 lỗi, 2 thêm thông tin, 3 thêm chi tiết; dòng log có thời gian và số dòng lệnh
// PYWORLD.VN - Đo thời gian in một dòng để thấy log làm chậm chương trình bao nhiêu
#ifndef MUC_LOG
#define MUC_LOG 2
#endif
#define _IN_LOG(muc, ...) \
do { \
Serial.printf("[%8lu] %s %d: ", (unsigned long)millis(), muc, __LINE__); \
Serial.printf(__VA_ARGS__); \
Serial.println(); \
} while (0)
#if MUC_LOG >= 1
#define LOGE(...) _IN_LOG("LOI", __VA_ARGS__)
#else
#define LOGE(...) do {} while (0)
#endif
#if MUC_LOG >= 2
#define LOGI(...) _IN_LOG("TIN", __VA_ARGS__)
#else
#define LOGI(...) do {} while (0)
#endif
#if MUC_LOG >= 3
#define LOGD(...) _IN_LOG("CHI", __VA_ARGS__)
#else
#define LOGD(...) do {} while (0)
#endif
const int CHAN_DO = 34;
const int NGUONG_LOI = 3900;
uint32_t soVong = 0;
void setup() {
Serial.begin(115200);
delay(300);
LOGI("Bat dau, MUC_LOG = %d", MUC_LOG);
}
void loop() {
int gt = analogRead(CHAN_DO);
soVong++;
LOGD("Vong %u, gia tri %d", (unsigned)soVong, gt);
if (gt >= NGUONG_LOI) {
LOGE("Gia tri qua nguong: %d", gt);
}
if (soVong % 1000 == 0) {
uint32_t dau = micros();
LOGI("Da chay %u vong", (unsigned)soVong);
uint32_t mat = micros() - dau;
Serial.printf("Mot dong log mat %u us\n", (unsigned)mat);
}
delay(1);
}

Khi tắt, macro thành khối rỗng nên không tốn gì. Ưu điểm nữa là dòng log tự có thời gian và số dòng, rất tiện để đối chiếu.

Log làm thay đổi thời gian của chính chương trình cần gỡ lỗi. Lỗi liên quan đến thời gian có thể biến mất khi thêm log, rồi quay lại khi tắt. Vì vậy trong vòng lặp nhanh, chỉ in mỗi N vòng, hoặc đưa tốc độ Serial lên cao, hoặc đảo một chân GPIO rồi đo bằng máy hiện sóng.
6. Lỗi hay gặp

Vẽ đồ thị ngay từ Serial xem bài Serial Plotter cùng cụm. Lỗi biên dịch thường gặp xem bài lỗi biên dịch Arduino cùng cụm.
Xem thêm