VS Code + PlatformIO: Môi trường lập trình chuyên nghiệp cho IoT
Cơ bản1/8/2026- Tác giả: IoTlabs Maker

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.

PlatformIOVS CodeESP32DHT22công cụ lập trìnhkien-thuc-nen-tang

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:

  1. Cài Visual Studio Code.

  2. 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.

  3. Chọn "New Project" trong PlatformIO Home, đặt board là "Espressif ESP32 Dev Module", framework "Arduino".

  4. 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

Error: Please specify board

Thiếu hoặc gõ sai board = esp32dev trong platformio.ini

Chạy pio boards esp32 để tra đúng tên board

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

fatal error: DHT.h: No such file or directory

lib_deps chưa khai báo thư viện, hoặc gõ sai tên package

Thêm đúng dòng adafruit/DHT sensor library@^1.4.4 vào lib_deps rồi build lại

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".