
VS Code + PlatformIO: Môi trường lập trình chuyên nghiệp cho IoT
Chuyển từ Arduino IDE sang VS Code + PlatformIO: hiểu cấu trúc platformio.ini/src/lib, build cùng một firmware đọc nhiệt độ - độ ẩm DHT22 trên ESP32, và vì sao dân chuyên nghiệp chọn PlatformIO cho dự án IoT thật.
Arduino IDE dễ bắt đầu nhưng khi dự án IoT lớn dần - nhiều file, nhiều thư viện, nhiều board - bạn sẽ cần một môi trường lập trình có cấu trúc rõ ràng hơn. Bài này hướng dẫn cài đặt VS Code + PlatformIO, hiểu cấu trúc project chuẩn (platformio.ini, src/, lib/, include/), và build lại đúng firmware đọc cảm biến DHT22 trên ESP32 bằng PlatformIO thay vì Arduino IDE.
Hướng dẫn chi tiết
Chuyển từ Arduino IDE sang VS Code + PlatformIO: cấu trúc platformio.ini/src/lib, build firmware DHT22 trên ESP32 bằng PlatformIO CLI.
1. Giới thiệu
Arduino IDE dễ bắt đầu nhưng khi dự án IoT lớn dần - nhiều file, nhiều thư viện, nhiều board - bạn sẽ cần một môi trường lập trình có cấu trúc rõ ràng hơn. VS Code kết hợp extension PlatformIO là lựa chọn phổ biến của dân chuyên nghiệp: mỗi project có file cấu hình platformio.ini riêng, thư viện được khai báo và pin version ngay trong project (không phụ thuộc vào những gì đã cài sẵn trên máy), và có thể build nhiều board cùng lúc. Bài này hướng dẫn cài đặt VS Code + PlatformIO, hiểu cấu trúc project chuẩn, và build lại đúng firmware đọc cảm biến DHT22 trên ESP32 - cùng một mạch, cùng một logic code như khi dùng Arduino IDE, nhưng qua một quy trình chuyên nghiệp hơn.
2. Linh kiện cần có
Linh kiện | Số lượng | Giá tham khảo |
|---|---|---|
ESP32 DevKit V4 (ESP32-WROOM-32) | 1 | ~75.000 - 120.000đ |
Cảm biến DHT22 (AM2302) | 1 | ~45.000 - 70.000đ |
Dây jumper cái - đực | 3 | ~5.000đ |
3. Sơ đồ kết nối
DHT22 | ESP32 DevKit V4 |
|---|---|
VCC | 3V3 |
GND | GND |
DATA | GPIO4 |
Lưu ý: cấp nguồn DHT22 bằng 3.3V (không dùng 5V) vì chân DATA giao tiếp trực tiếp với GPIO 3.3V của ESP32 - cấp 5V sẽ khiến mức tín hiệu DATA vượt điện áp chịu đựng của GPIO. Hầu hết module DHT22 dạng breakout đã có sẵn điện trở kéo lên trên chân DATA.
4. Cài đặt VS Code + PlatformIO
Các bước cài đặt:
Cài Visual Studio Code.
Mở tab Extensions (Ctrl+Shift+X), tìm "PlatformIO IDE", cài đặt. PlatformIO sẽ tự tải toolchain cho ESP32 trong lần chạy đầu tiên.
Chọn "New Project" trong PlatformIO Home, đặt board là "Espressif ESP32 Dev Module", framework "Arduino".
PlatformIO sinh ra cấu trúc thư mục chuẩn - đây là điểm khác biệt lớn nhất so với Arduino IDE.
my-esp32-project/
├── platformio.ini # cấu hình board, framework, thư viện
├── src/
│ └── main.cpp # code chính (tương đương .ino nhưng là C++ chuẩn)
├── include/ # header dùng chung (config, secrets mẫu...)
├── lib/ # thư viện riêng của project (không public lên registry)
└── .pio/ # build cache - KHÔNG commit vào git
5. Code ví dụ #1 — platformio.ini
Toàn bộ cấu hình board, tốc độ Serial Monitor, và thư viện cần thiết nằm trong một file duy nhất:
; platformio.ini - cau hinh project PlatformIO cho ESP32 DevKit V4 + DHT22
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
upload_speed = 921600
; lib_deps: khai bao thu vien + version ngay trong project,
; khong phu thuoc vao nhung gi da cai san trong Arduino IDE cua may ban.
lib_deps =
adafruit/DHT sensor library@^1.4.4
adafruit/Adafruit Unified Sensor@^1.1.9
So với Arduino IDE (nơi thư viện cài toàn cục, ai cũng dùng chung một version), lib_deps khai báo thư viện theo từng project - clone project này về máy khác, chạy build là PlatformIO tự tải đúng thư viện, đúng version.
6. Code ví dụ #2 — src/main.cpp
Firmware đọc DHT22 mỗi 2 giây và in ra Serial Monitor, viết bằng C++ chuẩn (không phải cú pháp .ino đặc thù của Arduino IDE):
// src/main.cpp - firmware doc nhiet do/do am DHT22 tren ESP32
// Duoc build bang PlatformIO (khong phai Arduino IDE) - xem platformio.ini cung thu muc.
#include <Arduino.h>
#include <DHT.h>
#define DHT_PIN 4
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);
const unsigned long READ_INTERVAL_MS = 2000; // DHT22 lay mau toi da 1 lan / 2s
unsigned long lastReadAt = 0;
void setup() {
Serial.begin(115200);
delay(300);
Serial.println();
Serial.println(F("=== PlatformIO + ESP32 + DHT22 ==="));
Serial.println(F("Build system: PlatformIO (src/main.cpp)"));
dht.begin();
}
void loop() {
unsigned long now = millis();
if (now - lastReadAt < READ_INTERVAL_MS) {
return; // chua den chu ky doc tiep theo, khong block bang delay()
}
lastReadAt = now;
float humidity = dht.readHumidity();
float tempC = dht.readTemperature();
if (isnan(humidity) || isnan(tempC)) {
Serial.println(F("[WARN] Doc DHT22 that bai (mat ket noi hoac nhieu tin hieu)"));
return;
}
Serial.print(F("Nhiet do: "));
Serial.print(tempC);
Serial.print(F(" C | Do am: "));
Serial.print(humidity);
Serial.println(F(" %"));
}
Chú ý dòng #include <Arduino.h> ở đầu file - Arduino IDE tự thêm dòng này ngầm cho file .ino, nhưng file .cpp chuẩn trong PlatformIO cần khai báo tường minh.
7. Code ví dụ #3 — build và nạp bằng PlatformIO CLI
Ứng dụng thực tế: build, kiểm tra lỗi biên dịch, và nạp firmware ngay từ terminal - hữu ích khi tích hợp vào CI hoặc script tự động, điều Arduino IDE không hỗ trợ tốt:
# Build (chi bien dich, khong nap)
pio run
# Nap firmware qua USB
pio run --target upload
# Mo Serial Monitor voi dung toc do khai bao trong platformio.ini
pio device monitor
# Lam 3 buoc tren trong 1 lenh
pio run --target upload --target monitor
8. Lỗi thường gặp
Lỗi | Nguyên nhân | Cách sửa |
|---|---|---|
| Thiếu hoặc gõ sai | Chạy |
Không tìm thấy cổng COM/USB khi upload | Driver CP2102/CH340 chưa cài, hoặc board đang ở chế độ boot sai | Cài driver USB-UART tương ứng; giữ nút BOOT khi bắt đầu upload nếu cần |
|
| Thêm đúng dòng |
Build chạy rất lâu ở lần đầu tiên | PlatformIO đang tải toolchain ESP32 + thư viện lần đầu | Bình thường, chỉ chậm ở lần build đầu tiên; các lần sau dùng cache |
9. Tổng kết
PlatformIO không thay đổi logic firmware - firmware đọc DHT22 ở đây giống hệt bản Arduino IDE - nhưng thay đổi cách bạn tổ chức và tái tạo project: cấu hình board/thư viện nằm trong file text theo dõi được bằng git, build/nạp có thể chạy từ terminal hoặc CI, và mỗi project độc lập với những gì cài trên máy.
Với dự án IoT nhỏ một file thì khác biệt chưa rõ, nhưng khi dự án lớn dần - nhiều board, nhiều thư viện, nhiều người cùng làm - đây là công cụ giúp bạn không còn phải nhớ "máy tôi cài thư viện version nào".