Cài ESP32 vào Arduino IDE 2: thêm bo mạch, chọn ESP32 Dev Module và nạp chương trình đầu tiên
Cài gói esp32 của Espressif vào Arduino IDE 2, chọn bo DOIT ESP32 DEVKIT V1 hoặc ESP32 Dev Module, chọn cổng COM, nạp chương trình nháy LED, in thông tin chip và sửa lỗi lần nạp đầu.
Mạch ESP32 mới mua về muốn lập trình bằng Arduino IDE thì phải cài thêm gói bo mạch ESP32, chọn đúng bo và đúng cổng COM. Bài viết hướng dẫn từng bước trên Arduino IDE 2: thêm gói esp32 của Espressif, chọn DOIT ESP32 DEVKIT V1 hay ESP32 Dev Module, nạp chương trình đầu tiên để nháy LED và in thông tin chip ra Serial Monitor, kèm cách xử lý các lỗi hay gặp ở lần nạp đầu tiên.

1. Chuẩn bị
- Mạch ESP32, ví dụ ESP32 DevKit V1 30 chân cổng Type-C. Bài dùng được cho cả bản CH340, bản 38 chân, bản có OLED hay có pin 18650.
- Dây USB nạp code loại có truyền dữ liệu, đúng đầu cắm của mạch (Type-C hoặc Micro USB).
- Máy tính Windows 10, 11 (macOS và Linux làm tương tự), có mạng Internet.
Bài dùng Arduino IDE 2 và gói esp32 phiên bản 3.3.10.
2. Cài Arduino IDE 2
- Vào trang arduino.cc, mục Software, tải bản Arduino IDE 2 cho Windows (file cài đặt .exe).
- Chạy file cài đặt, bấm I Agree, Next, Install như phần mềm thường. Khi Windows hỏi cài driver cổng USB, chọn Install.
- Mở Arduino IDE. Lần đầu mở, phần mềm tự tải thêm vài thành phần, chờ thanh trạng thái ở góc dưới chạy xong.
Muốn đổi giao diện sang tiếng Việt: File › Preferences › Language. Bài này ghi tên menu tiếng Anh vì đa số tài liệu dùng tên đó.
3. Thêm gói bo mạch ESP32

- Vào File › Preferences. Ở ô Additional boards manager URLs, dán đường dẫn sau rồi bấm OK:
https://espressif.github.io/arduino-esp32/package_esp32_index.json - Mở Tools › Board › Boards Manager (hoặc biểu tượng bo mạch ở thanh bên trái).
- Gõ esp32 vào ô tìm kiếm. Chọn gói esp32 by Espressif Systems, bấm INSTALL. Không chọn gói Arduino ESP32 Boards: gói đó chỉ dành cho mạch Arduino Nano ESP32.
- Chờ tải xong (vài trăm MB, có thể mất vài phút tùy mạng). Khi nút đổi thành REMOVE và hiện số phiên bản là đã cài xong.
4. Cắm mạch và tìm cổng COM
Cắm mạch ESP32 vào máy tính bằng dây USB. Đèn nguồn trên mạch phải sáng. Mở Device Manager (bấm chuột phải vào nút Start), xem mục Ports (COM & LPT):
- Mạch chip CP2102 hiện dạng Silicon Labs CP210x USB to UART Bridge (COM5).
- Mạch chip CH340 hiện dạng USB-SERIAL CH340 (COM6).
Số COM khác nhau trên từng máy, ghi nhớ số này. Nếu không thấy mục Ports, hoặc thiết bị hiện dấu chấm than vàng, xem phần xử lý lỗi ở cuối bài và bài ESP32 không nhận cổng COM cùng loạt.
5. Chọn bo và cổng

- Tools › Board › esp32, chọn DOIT ESP32 DEVKIT V1. Cũng có thể chọn ESP32 Dev Module; cả hai đều nạp được cho mạch DevKit 30 chân và 38 chân.
- Tools › Port, chọn cổng COM vừa thấy ở bước 4.
- Để các tùy chọn khác ở giá trị mặc định.
Khác biệt nhỏ giữa hai bo: DOIT ESP32 DEVKIT V1 có sẵn hằng LED_BUILTIN bằng 2 (LED xanh trên mạch). ESP32 Dev Module không có hằng này nhưng có thêm tùy chọn CPU Frequency, Flash Size, Partition Scheme, PSRAM. Chương trình trong bài khai báo thẳng chân 2 nên chạy với cả hai bo.
6. Nạp chương trình đầu tiên
Tạo sketch mới (File › New Sketch), xóa hết nội dung có sẵn, dán chương trình dưới đây và lưu lại:
// PYWORLD.VN - Chương trình đầu tiên sau khi cài ESP32 vào Arduino IDE
// PYWORLD.VN - In thông tin chip ra Serial Monitor, nháy LED trên mạch ở GPIO2 mỗi giây
// PYWORLD.VN - Bo mạch: DOIT ESP32 DEVKIT V1 hoặc ESP32 Dev Module, Serial Monitor 115200 baud
const int LED_PIN = 2; // LED xanh trên ESP32 DevKit V1 nối GPIO2; bo "ESP32 Dev Module" không có sẵn LED_BUILTIN
unsigned long lanTruoc = 0; // thời điểm đổi trạng thái LED lần trước (ms)
unsigned long dem = 0; // số giây đã chạy
void setup() {
Serial.begin(115200);
delay(500); // chờ một chút để Serial Monitor kịp mở cổng
pinMode(LED_PIN, OUTPUT);
uint16_t rev = ESP.getChipRevision(); // dạng MXX: 301 nghĩa là v3.1
uint64_t mac = ESP.getEfuseMac(); // địa chỉ MAC ghi sẵn trong chip, byte đầu nằm ở 8 bit thấp nhất
Serial.println();
Serial.println("PYWORLD.VN - ESP32 da chay chuong trinh dau tien");
Serial.printf("Chip: %s, ban v%u.%u, %u nhan, %u MHz\n", ESP.getChipModel(), (unsigned)(rev / 100),
(unsigned)(rev % 100), (unsigned)ESP.getChipCores(), (unsigned)ESP.getCpuFreqMHz());
Serial.printf("Flash: %u MB, RAM trong: %u byte\n", (unsigned)(ESP.getFlashChipSize() / (1024 * 1024)),
(unsigned)ESP.getFreeHeap());
Serial.printf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\n", (unsigned)(mac & 0xFF), (unsigned)((mac >> 8) & 0xFF),
(unsigned)((mac >> 16) & 0xFF), (unsigned)((mac >> 24) & 0xFF), (unsigned)((mac >> 32) & 0xFF),
(unsigned)((mac >> 40) & 0xFF));
Serial.printf("Goi esp32 (Arduino core): %s\n", ESP.getCoreVersion());
}
void loop() {
// Không dùng delay() để vòng lặp vẫn rảnh làm việc khác
if (millis() - lanTruoc >= 1000) {
lanTruoc = millis();
dem++;
bool sang = (dem % 2) == 1;
digitalWrite(LED_PIN, sang ? HIGH : LOW);
Serial.printf("Giay thu %lu, LED %s\n", dem, sang ? "SANG" : "TAT");
}
}
Bấm nút Upload (mũi tên sang phải). Arduino IDE biên dịch chương trình, sau đó cửa sổ Output hiện dòng Connecting..., rồi các dòng ghi dữ liệu với phần trăm tăng dần. Khi góc dưới báo Done uploading là nạp xong, mạch tự khởi động lại và LED xanh bắt đầu nhấp nháy.

Đa số mạch tự chuyển sang chế độ nạp. Nếu Output đứng mãi ở Connecting..... rồi báo lỗi, bấm Upload lại và nhấn giữ nút BOOT khi thấy chữ Connecting, thả ra khi bắt đầu ghi.
7. Xem kết quả trên Serial Monitor
- Mở Tools › Serial Monitor (hoặc biểu tượng kính lúp góc phải).
- Chọn tốc độ 115200 baud ở ô bên phải.
- Nhấn nút EN trên mạch một lần để chạy lại từ đầu và xem đủ các dòng thông tin.

Mỗi mạch có địa chỉ MAC riêng, tên chip và RAM trống có thể khác hình. Dòng Giay thu … tăng mỗi giây cùng lúc LED đổi trạng thái là chương trình đang chạy đúng.
8. Chương trình làm gì
Serial.begin(115200)mở cổng nối tiếp tốc độ 115200; Serial Monitor phải chọn đúng tốc độ này.ESP.getChipModel(),ESP.getChipCores(),ESP.getFlashChipSize(),ESP.getFreeHeap()đọc thông tin chip;ESP.getEfuseMac()đọc địa chỉ MAC ghi sẵn trong chip.- Trong
loop(), chương trình somillis()với lần đổi trước thay vì dùngdelay(1000), để sau này thêm việc khác vào vòng lặp mà không bị chặn.
9. Lỗi thường gặp khi nạp lần đầu
| Hiện tượng hoặc thông báo | Nguyên nhân hay gặp | Cách xử lý |
|---|---|---|
| Menu Port không có cổng nào | Dây chỉ sạc, chưa có driver CH340 hoặc CP2102 | Đổi dây có truyền dữ liệu; xem Device Manager; cài driver |
Failed to connect to ESP32: No serial data received | Mạch không tự vào chế độ nạp; GPIO0 hoặc GPIO2 bị mạch ngoài kéo sai mức | Giữ BOOT khi Connecting; rút dây khỏi GPIO0, GPIO2 khi nạp |
'LED_BUILTIN' was not declared in this scope | Đang chọn bo ESP32 Dev Module | Chọn DOIT ESP32 DEVKIT V1 hoặc khai báo const int LED_PIN = 2; |
could not open port 'COM5' hoặc báo cổng đang bận | Một chương trình khác đang mở cổng (cửa sổ Serial Monitor khác, phần mềm đọc cổng COM) | Đóng chương trình đó, rút ra cắm lại mạch |
| Serial Monitor ra ký tự lạ | Sai tốc độ baud | Chọn 115200 baud |
Serial Monitor báo Brownout detector was triggered, mạch khởi động lại liên tục | Nguồn USB yếu, dây dài hoặc kém, cắm qua bộ chia USB | Cắm thẳng vào máy tính, đổi dây ngắn tốt hơn |
Sketch too big | Chương trình lớn hơn vùng nhớ ứng dụng 1,2 MB | Chọn bo ESP32 Dev Module, Partition Scheme: Huge APP (3MB No OTA/1MB SPIFFS) |
| Gói esp32 cài báo lỗi tải về giữa chừng | Mạng chập chờn, tường lửa chặn | Thử lại, đổi mạng khác; kiểm tra lại đường dẫn gói |
10. Xem thêm
- Các mạch ESP32 của PYWORLD: bản 30 chân, 38 chân, bản có OLED, có pin 18650.
- Nạp file .bin vào ESP32 bằng Flash Download Tool: nạp file chương trình có sẵn mà không cần Arduino IDE.
- Nạp chương trình cho ESP32 qua Wi-Fi (OTA).
- PWM trên ESP32 và kết nối Wi-Fi trên ESP32: các bài nên làm tiếp theo.
- Bài cùng loạt: chọn mạch ESP32 phù hợp, sơ đồ chân ESP32 30 chân và 38 chân, ESP32 CH340 hay CP2102, ESP32 không nhận cổng COM.
Xem thêm