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ì

Cửa sổ trình duyệt chia ba phần: bên trái là mã chương trình, bên phải là mạch có ESP32 nối LED, nút nhấn, biến trở và nút Chạy, bên dưới là Serial Monitor in kết nối Wi-Fi và số đo
Mã, mạch và Serial Monitor trên cùng một trang (vẽ kiểu chung, không phải ảnh chụp màn hình).

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

Ba tệp sketch.ino là chương trình Arduino, diagram.json là danh sách linh kiện và dây nối, libraries.txt là tên thư viện; đoạn JSON rút gọn với parts gồm wokwi-esp32-devkit-v1 và wokwi-led, connections gồm dây từ esp:D2 tới điện trở
Chương trình, sơ đồ mạch dạng JSON và danh sách thư viện (đoạn JSON rút gọ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 parts liệt kê linh kiện (loại, tên, vị trí); mục connections liệ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ạng tê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ử

Sơ đồ ESP32 DevKit V1: LED qua điện trở 220 ohm nối D2, chân còn lại xuống GND; nút nhấn giữa D4 và GND; biến trở VCC 3V3, SIG D34, GND
LED qua điện trở 220 Ω ở D2, nút nhấn ở D4, biến trở 10 kΩ ở D34: dựng được cả trên Wokwi lẫn breadboard (hình minh họa).
  1. 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).
  2. 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ở.
  3. 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.
  4. Dán chương trình ở mục 4 vào sketch.ino, bấm Chạy.
  5. 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

Serial Monitor: kết nối Wi-Fi xong, IP 10.10.0.2; các dòng giờ, biến trở 1650 mV chu kỳ nháy 550 ms; Nút tắt nháy đèn; biến trở 2890 mV chu kỳ 888 ms; Nút bật nháy đèn; biến trở 420 mV chu kỳ 214 ms
Xoay biến trở, bấm nút trong trình mô phỏng (giờ, điện áp là ví dụ).

6. Chuyển sang mạch thật

  • Đổi CHAY_TREN_WOKWI thành false, đ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ượngNguyên nhân thường gặpCách xử lý
Không kết nối Wi-Fi trên mô phỏngDùng tên mạng nhà mình thay vì Wokwi-GUESTDùng WiFi.begin("Wokwi-GUEST", "", 6)
Báo thiếu thư viện khi chạyChưa thêm thư viện vào dự ánThêm qua Library Manager (ghi vào libraries.txt)
LED không sáng dù chương trình đúngLED cắm ngược, dây vào nhầm chânDi chuột lên chân để xem tên; đổi chiều LED
Chạy trên Wokwi được, mạch thật khôngDây lỏng, nguồn yếu, sai chân thậtKiể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ạyWokwi chưa mô phỏng BluetoothThử phần Bluetooth trên mạch thật

8. Xem thêm


Tin tức liên quan

Gá lắp gia tốc kế theo ISO 5348: tần số cộng hưởng, dải tần dùng được và các sai số khi đo rung
Gá lắp gia tốc kế theo ISO 5348: tần số cộng hưởng, dải tần dùng được và các sai số khi đo rung

Cách gá gia tốc kế theo ISO 5348: vít cấy, keo, sáp, nam châm, đầu dò cầm tay; tần số cộng hưởng lắp đặt, dải tần dùng được, ảnh hưởng khối lượng cảm biến và các điểm kỹ thuật khi gắn.

Xốp định hình cho vali nhôm, vali kéo: sắp xếp bộ dụng cụ nhiều chi tiết
Xốp định hình cho vali nhôm, vali kéo: sắp xếp bộ dụng cụ nhiều chi tiết

Gia công xốp định hình cho vali nhôm và vali kéo: khoang tròn, khoang chữ nhật, rãnh dài cho bộ dụng cụ nhiều chi tiết. Xem hai mẫu thực tế, bảng kích thước vali nhôm và cách đặt làm.

RF 433 MHz là gì: điều chế ASK/OOK và tự viết giao thức phát, thu bằng ESP32
RF 433 MHz là gì: điều chế ASK/OOK và tự viết giao thức phát, thu bằng ESP32

Giải thích sóng RF 433 MHz và điều chế ASK/OOK, cách mã hóa bit bằng độ rộng xung và khung tin 24 bit. Hướng dẫn tự viết chương trình phát và thu trên hai mạch ESP32, không dùng thư viện ngoài.

Hiệu chuẩn LVDT và cảm biến dòng xoáy: bộ hiệu chuẩn vi kế, hệ số thang, độ tuyến tính, vật liệu bia
Hiệu chuẩn LVDT và cảm biến dòng xoáy: bộ hiệu chuẩn vi kế, hệ số thang, độ tuyến tính, vật liệu bia

Hiệu chuẩn tĩnh LVDT và đầu dò dòng xoáy đo khe hở: bộ hiệu chuẩn vi kế, tính hệ số thang, hệ số từng đoạn, độ lệch đường thẳng, sai số tuyến tính và ảnh hưởng của vật liệu bia.

Driver động cơ bước A4988, DRV8825, TMC2209: chọn loại, chỉnh dòng VREF và chạy êm
Driver động cơ bước A4988, DRV8825, TMC2209: chọn loại, chỉnh dòng VREF và chạy êm

So sánh driver động cơ bước A4988, DRV8825, TMC2209, cách nối dây, công thức và cách đo VREF để đặt dòng, bảng chọn vi bước, tản nhiệt, chạy êm và khi nào dùng driver rời.

Đo dung lượng và dòng xả pin 18650 bằng ESP32: mAh, Wh, điện trở trong, nhận ra pin giả, pin chai
Đo dung lượng và dòng xả pin 18650 bằng ESP32: mAh, Wh, điện trở trong, nhận ra pin giả, pin chai

Làm máy đo dung lượng pin 18650 bằng ESP32, MOSFET và điện trở tải: mAh, Wh, dòng xả và C-rate, đo điện trở trong, cộng mAh tới 3,0 V, đọc kết quả để nhận ra pin giả và pin đã chai.

Bài đầu tiên với ESP32 cho học sinh: đèn nhấp nháy và phát tên bằng mã Morse
Bài đầu tiên với ESP32 cho học sinh: đèn nhấp nháy và phát tên bằng mã Morse

Dự án STEM đầu tiên với ESP32 không cần linh kiện: nháy đèn LED có sẵn trên mạch, rồi phát tên của bé bằng mã Morse; cài Arduino IDE, giải thích code và trò chơi đoán tên.

Chuẩn lực: máy tải trọng chết, đòn bẩy, khuếch đại thủy lực, máy so sánh và gia tốc trọng trường
Chuẩn lực: máy tải trọng chết, đòn bẩy, khuếch đại thủy lực, máy so sánh và gia tốc trọng trường

Bốn kiểu máy chuẩn lực: tải trọng chết, đòn bẩy, khuếch đại thủy lực, máy so sánh; cách tính lực từ quả cân, vì sao g tại Việt Nam lệch 0,25 % và chuỗi liên kết chuẩn lực.


Bình luận
Đã thêm vào giỏ hàng