ArduinoVN
Đăng nhập Tham gia
Thư viện Code /u/linucat /10/05/2026

Thư viện PainlessMesh: mạng mesh ESP32 và ESP8266 tự kết nối

Thảo luận

PainlessMesh là thư viện mạng mesh cho ESP32/ESP8266 — nhiều node tự động kết nối với nhau thành mạng lưới không cần router, không cần MQTT broker, không cần code phức tạp. Lý tưởng cho dải LED sync, cảm biến phân tán trong cùng nhà/sân vườn.

1. Mesh là gì?

Mesh = mỗi node kết nối với nhiều node lân cận → tạo lưới. Khi 1 node muốn gửi tới node xa, gói tự route qua các node trung gian.

Ưu điểm so với star topology (1 router center):

  • Không single point of failure: router hỏng → mạng vẫn chạy.
  • Phủ sóng rộng: node A xa node Z, node trung gian relay.
  • Self-healing: node rớt → mạng tự định tuyến lại.

Nhược: throughput thấp hơn (mỗi hop tốn thời gian), latency cao.

2. PainlessMesh đặc điểm

  • Dùng WiFi 2.4GHz nhưng không cần router — node tự AP+STA.
  • JSON-based protocol — gửi data dạng text dễ debug.
  • Auto-pairing — chỉ cần cùng SSID/PASS "mesh".
  • Tối đa khuyên dùng ~20 node trong mesh.
  • Tầm xa mỗi hop ~10–30m trong nhà.

3. Cài đặt

Library Manager → "painlessMesh" by BlackEdder. Dependency:

  • ArduinoJson v6+ (KHÔNG dùng v7 — chưa tương thích).
  • TaskScheduler.
  • AsyncTCP (ESP32) hoặc ESPAsyncTCP (ESP8266).

4. Code node cơ bản — tất cả node giống nhau

#include 

#define MESH_SSID    "mesh-arduinoVN"
#define MESH_PASS    "meshSecret123"
#define MESH_PORT    5555

Scheduler scheduler;
painlessMesh mesh;

void sendMessage();
Task taskSend(TASK_SECOND * 5, TASK_FOREVER, &sendMessage);

void sendMessage() {
  String msg = "Hello from " + String(mesh.getNodeId());
  mesh.sendBroadcast(msg);
}

void onReceived(uint32_t from, String &msg) {
  Serial.printf("[%u] %s\n", from, msg.c_str());
}

void onNewConnection(uint32_t nodeId) {
  Serial.printf(">> New: %u\n", nodeId);
}

void onChangedConnections() {
  Serial.printf("Topology: %s\n", mesh.subConnectionJson().c_str());
}

void setup() {
  Serial.begin(115200);
  mesh.setDebugMsgTypes(ERROR | STARTUP);
  mesh.init(MESH_SSID, MESH_PASS, &scheduler, MESH_PORT);
  mesh.onReceive(&onReceived);
  mesh.onNewConnection(&onNewConnection);
  mesh.onChangedConnections(&onChangedConnections);
  scheduler.addTask(taskSend);
  taskSend.enable();
}

void loop() {
  mesh.update();
}

Nạp code này lên 3+ ESP32, để gần nhau — chúng tự kết nối thành mesh, gửi message broadcast mỗi 5s.

5. Send to specific node — unicast

uint32_t targetId = 1234567890;
mesh.sendSingle(targetId, "hello specific");

NodeId là 32-bit integer dựa trên MAC. In ra Serial khi onNewConnection để biết.

6. JSON message

#include 

void sendSensor() {
  StaticJsonDocument<128> doc;
  doc["type"] = "sensor";
  doc["temp"] = 25.4;
  doc["hum"] = 60;
  String s;
  serializeJson(doc, s);
  mesh.sendBroadcast(s);
}

void onReceived(uint32_t from, String &msg) {
  StaticJsonDocument<128> doc;
  if (deserializeJson(doc, msg) == DeserializationError::Ok) {
    if (doc["type"] == "sensor") {
      float t = doc["temp"];
      // ...
    }
  }
}

7. Topology — xem mesh structure

String topo = mesh.subConnectionJson();
Serial.println(topo);
// {"nodeId":123,"subs":[{"nodeId":456,"subs":[]},{"nodeId":789,"subs":[]}]}

JSON tree cho biết node nào kết nối qua ai.

8. Gateway — bridge mesh ↔ MQTT

1 node trong mesh có thể đồng thời connect WiFi router → gửi data mesh lên MQTT broker:

void onReceived(uint32_t from, String &msg) {
  if (WiFi.status() == WL_CONNECTED) {
    mqttClient.publish("mesh/data", msg.c_str());
  }
}

void setup() {
  WiFi.begin(SSID, PASS);    // STATION mode
  mesh.stationManual(SSID, PASS);  // mesh dùng cùng WiFi
  mesh.init(MESH_SSID, MESH_PASS, ...);
}

Node này thành "root" — các node khác gửi data về root, root upload cloud.

9. Hiệu năng

  • Throughput: ~10–50 KB/s mỗi node tuỳ tải mesh.
  • Latency: 50–500ms tùy số hop.
  • Đừng broadcast quá nhanh (10+ Hz) — mesh nghẽn.
  • Tốt cho: command, sensor reading định kỳ. Tệ cho: stream video, audio.

10. Ứng dụng

  • Smart farm: 10 ESP32 cảm biến đất, gateway gửi lên cloud.
  • LED art: nhiều dải WS2812 đồng bộ animation, không dây.
  • Building wireless: mỗi phòng 1 node, thay zigbee mesh đắt tiền.
  • Sự kiện ngoài trời: setup nhanh sensor đo crowd, audio.
  • Đèn ngủ trẻ em đồng bộ: 5 đèn ESP32 cùng đổi màu khi 1 đèn đổi.

11. So với ESP-NOW

Tiêu chíESP-NOWPainlessMesh
TopologyStar (peer manual)Mesh tự động
Phạm vi1 hop (~200m)Multi-hop (vô hạn về lý thuyết)
SetupPhải biết MAC mỗi peerAuto pairing
Throughput~1 Mbps10-50 KB/s
Latency< 5ms50-500ms
RAMThấpCao hơn (JSON, scheduler)

12. Lỗi thường gặp

  • Node không pair: sai SSID/PASS mesh hoặc kênh WiFi xung đột.
  • Crash sau vài giờ: memory leak — gỡ và update painlessMesh phiên bản mới.
  • Mesh chia tách: 2 cluster không kết nối được, mỗi cluster tự tạo root.
  • Throughput tụt theo số node: bình thường — mesh không scale tốt với 30+ node.

Liên quan

So sánh ESP-NOW: truyền ESP32 không cần router. Áp dụng vào Mạng LoRa mesh đo môi trường (Phase 3).

Thảo luận (0)

Đăng nhập để tham gia thảo luận.
Chưa có bình luận nào. Hãy là người đầu tiên!