Mô phỏng ESP32 trên Wokwi: thử mạch và chương trình ngay trên trình duyệt, có cả Wi-Fi
Wokwi mô phỏng ESP32 làm được gì và chưa làm được gì, ba tệp sketch.ino, diagram.json, libraries.txt, dựng mạch LED, nút, biến trở, Wi-Fi ảo và cách chuyển sang mạch thật.
Chưa có linh kiện, sợ nối sai làm cháy mạch, hay muốn thử nhanh một ý tưởng trước khi mua? Wokwi là trình mô phỏng chạy ngay trên trình duyệt: viết chương trình Arduino cho ESP32, kéo thả LED, nút nhấn, cảm biến, màn hình, rồi bấm chạy như một mạch thật, kể cả kết nối Wi-Fi. Bài này giải thích Wokwi làm được gì và không làm được gì, ba tệp của một dự án, cách dựng một mạch thử, và cách chuyển chương trình từ mô phỏng sang mạch thật.
1. Wokwi làm được gì

Wokwi (trang wokwi.com) mô phỏng chính con chip: chương trình được biên dịch như khi nạp vào ESP32 thật rồi chạy trên chip ảo, nên phần lớn mã viết cho mạch thật chạy được nguyên vẹn. Wokwi hỗ trợ ESP32 và các dòng S2, S3, C3, C6, H2, cùng Arduino Uno, Mega, Nano và Raspberry Pi Pico. Có sẵn nhiều linh kiện: LED, nút, biến trở, relay, DHT22, cảm biến siêu âm, màn hình OLED, LCD, TFT, LED WS2812B, động cơ servo, bàn phím 4×4…
Những gì Wokwi chưa mô phỏng hoặc mô phỏng chưa đủ, theo tài liệu của Wokwi: Bluetooth, một phần I2S, phần lớn khối RTC (chỉ có điện trở kéo lên, kéo xuống), cảm biến Hall, MCPWM. Ngoài ra mô phỏng không có nhiễu điện, sụt áp nguồn, dây lỏng hay linh kiện hỏng: chạy được trên Wokwi chưa chắc chạy ngay trên mạch thật.
2. Ba tệp của một dự án

- sketch.ino: chương trình Arduino, y như khi viết cho mạch thật.
- diagram.json: mạch điện. Mục
partsliệt kê linh kiện (loại, tên, vị trí); mụcconnectionsliệt kê dây, mỗi dây ghi chân đầu, chân cuối, màu và đường đi. Chân được ghi theo dạngtên linh kiện:tên chân, ví dụesp:D2. Thường không phải sửa tay: kéo thả trên mạch là Wokwi tự cập nhật tệp này. - libraries.txt: tên các thư viện cần cài, mỗi dòng một tên. Thêm qua mục Library Manager của dự án.
Khi cần sửa tay diagram.json, di chuột lên chân linh kiện trong trình mô phỏng để xem đúng tên chân; các chân trùng tên (như các chân GND) được đánh thêm số để phân biệt.
3. Dựng mạch thử

- Tạo dự án mới, chọn bo ESP32 (ở Wokwi có cả "ESP32 DevKit v1", cùng sơ đồ chân với bo DevKit V1 30 chân).
- Bấm dấu + trên vùng mạch để thêm LED, điện trở (đặt 220 Ω trong phần thuộc tính), nút nhấn, biến trở.
- Kéo dây từ chân này sang chân kia theo sơ đồ trên. Đổi màu dây cho dễ nhìn.
- Dán chương trình ở mục 4 vào
sketch.ino, bấm Chạy. - Trong lúc chạy: bấm nút trên mạch, kéo thanh trượt của biến trở, xem Serial Monitor bên dưới.
4. Chương trình
Đèn nháy nhanh hay chậm theo biến trở, nút nhấn bật tắt việc nháy, và mỗi 2 giây in giờ lấy qua Wi-Fi cùng điện áp biến trở. Trên Wokwi, ESP32 kết nối mạng ảo tên Wokwi-GUEST (không mật khẩu, kênh 6) để ra Internet thật qua máy chủ của Wokwi.
// PYWORLD.VN - Chương trình mẫu để thử trên trình mô phỏng Wokwi và trên mạch thật: đèn nháy theo biến trở, nút bật tắt, lấy giờ qua Wi-Fi
// Nối: đèn LED qua điện trở 220 Ω ở D2, nút nhấn giữa D4 và GND, biến trở 10 kΩ (VCC 3V3, SIG D34, GND)
// Trong Wokwi dùng Wi-Fi "Wokwi-GUEST" không mật khẩu; trên mạch thật đổi TEN_WIFI, MAT_KHAU_WIFI
#include <WiFi.h>
#include <time.h>
const bool CHAY_TREN_WOKWI = true; // false khi nạp vào mạch thật
const char *TEN_WIFI = "TEN_WIFI";
const char *MAT_KHAU_WIFI = "MAT_KHAU_WIFI";
const int CHAN_DEN = 2, CHAN_NUT = 4, CHAN_BIEN_TRO = 34;
bool choPhepNhay = true;
void ketNoiWifi() {
if (CHAY_TREN_WOKWI) WiFi.begin("Wokwi-GUEST", "", 6); // mạng ảo của Wokwi, kênh 6
else WiFi.begin(TEN_WIFI, MAT_KHAU_WIFI);
Serial.print("Dang ket noi Wi-Fi");
for (int i = 0; i < 40 && WiFi.status() != WL_CONNECTED; i++) {
delay(250);
Serial.print(".");
}
if (WiFi.status() != WL_CONNECTED) {
Serial.println(" chua ket noi duoc, van chay phan con lai");
return;
}
Serial.printf(" xong, IP %s\n", WiFi.localIP().toString().c_str());
configTime(7 * 3600, 0, "pool.ntp.org"); // giờ Việt Nam UTC+7
}
void setup() {
Serial.begin(115200);
pinMode(CHAN_DEN, OUTPUT);
pinMode(CHAN_NUT, INPUT_PULLUP);
ketNoiWifi();
}
void loop() {
static bool nutTruoc = HIGH;
bool nut = digitalRead(CHAN_NUT);
if (nutTruoc == HIGH && nut == LOW) { // vừa bấm xuống
choPhepNhay = !choPhepNhay;
Serial.printf("Nut: %s nhay den\n", choPhepNhay ? "bat" : "tat");
delay(30); // chống dội đơn giản
}
nutTruoc = nut;
int mv = analogReadMilliVolts(CHAN_BIEN_TRO);
uint32_t chuKy = map(mv, 0, 3300, 100, 1000); // xoay biến trở: nháy nhanh hay chậm
static uint32_t lanDoi = 0, lanIn = 0;
if (choPhepNhay && millis() - lanDoi >= chuKy / 2) {
lanDoi = millis();
digitalWrite(CHAN_DEN, !digitalRead(CHAN_DEN));
}
if (!choPhepNhay) digitalWrite(CHAN_DEN, LOW);
if (millis() - lanIn >= 2000) {
lanIn = millis();
struct tm gio;
if (WiFi.status() == WL_CONNECTED && getLocalTime(&gio, 10)) {
Serial.printf("%02d:%02d:%02d | bien tro %4d mV | chu ky nhay %lu ms\n", gio.tm_hour, gio.tm_min, gio.tm_sec, mv,
(unsigned long)chuKy);
} else {
Serial.printf("bien tro %4d mV | chu ky nhay %lu ms\n", mv, (unsigned long)chuKy);
}
}
}
5. Kết quả mong đợi

6. Chuyển sang mạch thật
- Đổi
CHAY_TREN_WOKWIthànhfalse, điền tên và mật khẩu Wi-Fi nhà mình. - Dựng đúng mạch trên breadboard: chân giống hệt trên mô phỏng nếu dùng ESP32 DevKit V1.
- Nạp bằng Arduino IDE như bình thường. Chú ý những thứ mô phỏng không có: LED phải có điện trở hạn dòng, chân dài của LED là chân A, nút nhấn bốn chân thì hai chân cùng phía thường thông nhau sẵn.
- Biến trở thật đọc ra số dao động vài chục mV, không đứng yên như trên mô phỏng: lấy trung bình nhiều lần đọc khi cần số ổn định.
7. Xử lý lỗi thường gặp
| Hiện tượng | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Không kết nối Wi-Fi trên mô phỏng | Dùng tên mạng nhà mình thay vì Wokwi-GUEST | Dùng WiFi.begin("Wokwi-GUEST", "", 6) |
| Báo thiếu thư viện khi chạy | Chưa thêm thư viện vào dự án | Thêm qua Library Manager (ghi vào libraries.txt) |
| LED không sáng dù chương trình đúng | LED cắm ngược, dây vào nhầm chân | Di chuột lên chân để xem tên; đổi chiều LED |
| Chạy trên Wokwi được, mạch thật không | Dây lỏng, nguồn yếu, sai chân thật | Kiểm tra từng dây; đo điện áp; đối chiếu sơ đồ chân bo |
| Chương trình dùng Bluetooth không chạy | Wokwi chưa mô phỏng Bluetooth | Thử phần Bluetooth trên mạch thật |
8. Xem thêm
- ESP32 DevKit V1 30 chân: mạch thật cùng sơ đồ chân với bo trên mô phỏng; dựng mạch bằng breadboard và dây cắm.
- Biến trở, quang trở, NTC với ESP32: phần biến trở trong mạch thử.
- Các bài PlatformIO, ESP-IDF trong cùng loạt công cụ: bước tiếp theo khi dự án lớn dần.
Xem thêm