ESP32/ESP8266 Tutorial Aplikasi Topologi Mesh (Mesh Network)

Helo temen temen anakkendali.com

Pada kesempatan kali ini saya akan menulis artikel tentang ESP32/ESP8266 Tutorial Aplikasi Topologi Mesh (Mesh Network). Topologi mesh (Mesh Network) merupakan suatu bentuk hubungan antar jaringan dimana setiap perangkat terhubung secara langsung ke perangkat lainnya yang ada di dalam jaringan. Akibatnya, dalam topologi mesh setiap perangkat dapat berkomunikasi langsung dengan perangkaat yang dituju. Wikipedia.

Pada tutorial kali ini saya menggunakan empat buah perangkat wifi yaitu dua buah ESP8266 Wemos D1 mini, ESP32 Lolin32, ESP8266 NodeMCU untuk membua jaringan mesh supaya ke empatnya dapat saling terhubung. adapun software yang saya gunakan adalah Arduino IDE untuk membuat program dan mengupload nya.

ESP32/ESP8266 Tutorial Aplikasi Topologi Mesh (Mesh Network)

untuk membuat topologi mesh dengan ESP8266 dan ESP32 kita membutuhkan library painlessMesh.h yang dapat kalian download pada software Arduino IDE. atau bisa juga download melalui link painlessMesh.h

untuk mendownload library dari software Arduino IDE, bisa mengikuti langkah berikut.

ESP32/ESP8266 Tutorial Aplikasi Topologi Mesh (Mesh Network)
ESP32/ESP8266 Tutorial Aplikasi Topologi Mesh (Mesh Network)

Slanjutnya buka example arduino dan cari painlessmesh > start here atau copy paste program berikut ini.

#include <painlessMesh.h>

// some gpio pin that is connected to an LED...
// on my rig, this is 5, change to the right number of your LED.
#define   LED             2       // GPIO number of connected LED, ON ESP-12 IS GPIO2

#define   BLINK_PERIOD    3000 // milliseconds until cycle repeat
#define   BLINK_DURATION  100  // milliseconds LED is on for

#define   MESH_SSID       "Smart-PF"
#define   MESH_PASSWORD   "anamganteng"
#define   MESH_PORT       5555

// Prototypes
void sendMessage(); 
void receivedCallback(uint32_t from, String & msg);
void newConnectionCallback(uint32_t nodeId);
void changedConnectionCallback(); 
void nodeTimeAdjustedCallback(int32_t offset); 
void delayReceivedCallback(uint32_t from, int32_t delay);

Scheduler     userScheduler; // to control your personal task
painlessMesh  mesh;

bool calc_delay = false;
SimpleList<uint32_t> nodes;

void sendMessage() ; // Prototype
Task taskSendMessage( TASK_SECOND * 1, TASK_FOREVER, &sendMessage ); // start with a one second interval

// Task to blink the number of nodes
Task blinkNoNodes;
bool onFlag = false;

void setup() {
  Serial.begin(115200);

  pinMode(LED, OUTPUT);

  mesh.setDebugMsgTypes(ERROR | DEBUG);  // set before init() so that you can see error messages

  mesh.init(MESH_SSID, MESH_PASSWORD, &userScheduler, MESH_PORT);
  mesh.onReceive(&receivedCallback);
  mesh.onNewConnection(&newConnectionCallback);
  mesh.onChangedConnections(&changedConnectionCallback);
  mesh.onNodeTimeAdjusted(&nodeTimeAdjustedCallback);
  mesh.onNodeDelayReceived(&delayReceivedCallback);

  userScheduler.addTask( taskSendMessage );
  taskSendMessage.enable();

  blinkNoNodes.set(BLINK_PERIOD, (mesh.getNodeList().size() + 1) * 2, []() {
      // If on, switch off, else switch on
      if (onFlag)
        onFlag = false;
      else
        onFlag = true;
      blinkNoNodes.delay(BLINK_DURATION);

      if (blinkNoNodes.isLastIteration()) {
        // Finished blinking. Reset task for next run 
        // blink number of nodes (including this node) times
        blinkNoNodes.setIterations((mesh.getNodeList().size() + 1) * 2);
        // Calculate delay based on current mesh time and BLINK_PERIOD
        // This results in blinks between nodes being synced
        blinkNoNodes.enableDelayed(BLINK_PERIOD - 
            (mesh.getNodeTime() % (BLINK_PERIOD*1000))/1000);
      }
  });
  userScheduler.addTask(blinkNoNodes);
  blinkNoNodes.enable();

  randomSeed(analogRead(A0));
}

void loop() {
  mesh.update();
  digitalWrite(LED, !onFlag);
}

void sendMessage() {
  String msg = "Hello from node ";
  msg += mesh.getNodeId();
  msg += " myFreeMemory: " + String(ESP.getFreeHeap());
  mesh.sendBroadcast(msg);

  if (calc_delay) {
    SimpleList<uint32_t>::iterator node = nodes.begin();
    while (node != nodes.end()) {
      mesh.startDelayMeas(*node);
      node++;
    }
    calc_delay = false;
  }

  Serial.printf("Sending message: %s\n", msg.c_str());
  
  taskSendMessage.setInterval( random(TASK_SECOND * 1, TASK_SECOND * 5));  // between 1 and 5 seconds
}


void receivedCallback(uint32_t from, String & msg) {
  Serial.printf("startHere: Received from %u msg=%s\n", from, msg.c_str());
}

void newConnectionCallback(uint32_t nodeId) {
  // Reset blink task
  onFlag = false;
  blinkNoNodes.setIterations((mesh.getNodeList().size() + 1) * 2);
  blinkNoNodes.enableDelayed(BLINK_PERIOD - (mesh.getNodeTime() % (BLINK_PERIOD*1000))/1000);
 
  Serial.printf("--> startHere: New Connection, nodeId = %u\n", nodeId);
  Serial.printf("--> startHere: New Connection, %s\n", mesh.subConnectionJson(true).c_str());
}

void changedConnectionCallback() {
  Serial.printf("Changed connections\n");
  // Reset blink task
  onFlag = false;
  blinkNoNodes.setIterations((mesh.getNodeList().size() + 1) * 2);
  blinkNoNodes.enableDelayed(BLINK_PERIOD - (mesh.getNodeTime() % (BLINK_PERIOD*1000))/1000);
 
  nodes = mesh.getNodeList();

  Serial.printf("Num nodes: %d\n", nodes.size());
  Serial.printf("Connection list:");

  SimpleList<uint32_t>::iterator node = nodes.begin();
  while (node != nodes.end()) {
    Serial.printf(" %u", *node);
    node++;
  }
  Serial.println();
  calc_delay = true;
}

void nodeTimeAdjustedCallback(int32_t offset) {
  Serial.printf("Adjusted time %u. Offset = %d\n", mesh.getNodeTime(), offset);
}

void delayReceivedCallback(uint32_t from, int32_t delay) {
  Serial.printf("Delay to node %u is %d us\n", from, delay);
}

Untuk ESP32 ubahlah pin LED menjadi 5 karena LED user terhubung pada GPIO 5.

Baca Juga :  Cara Mengakses Sensor Ultrasonik SRF04 Arduino

apakah sudah cukup sampai disini ? ternyata tidak. Kita masih membutuhkan library lainya suapaya tidak error saat compiling. adapun library pendukung yang harus di pasang adalah berikut :

perlu di perhatikan, library painlessMesh hanya support library arduino json versi 6.0 ke atas. silahkan update ke versi terbaru bisa melalui arduino IDE dengan mengikuti langkah diatas untuk mencari library arduinojson.

selanjutnya upload masing masing perangkat wifi seperti nodeMCU, Wemos D1 Mini dan Lolin32 dengan program yang sama.

hasilnya dapat dilihat melalui video dibawah ini.

Pencarian Terkait
Cara Menjadikan ESP8266 Bridge (1002)
Implementasi ESP8266 Bridge Network (963)
Cara Menjadikan ESP32 Bridge (832)
Implementasi ESP32 Bridge Network (723)
Repeater ESP32 (674)
Repeater ESP8266 (623)
Cara Menjadikan NodeMCU Bridge (588)
Implementasi NodeMCU Bridge Network (521)
Cara Menjadikan Wemos D1 Mini Bridge (408)
Implementasi Wemos D1 Mini Bridge Network (388)
Repeater NodeMCU (370)
Repeater Wemos D1 Mini (309)
Mesh ESP8266 (299)
Topologi Mesh ESP32 (219)
Mesh Wemos d1 mini (190)
Topologi Mesh wemos d1 mini (150)
Mesh NodeMCU (106)
Topologi Mesh NodeMCU (74)

Baca Juga :  Program Arduino Bluetooth Hc-05 dan Aplikasi Android
(Visited 174 times, 2 visits today)