X

Kurs ESP - ESP-MESH

ESP-MESH to bezprzewodowa sieć komunikacyjna z węzłami zorganizowanymi w topologii kratowej przy użyciu funkcji jednoczesnego AP-STA w układach SoC Espressif. Zapewnia samoformującą się i samonaprawiającą się sieć, która jest łatwa do wdrożenia. Topologia sieci ESP-WIFI-MESH może skalować się do 1000 węzłów na dużych obszarach, bez konieczności obsługi określonej infrastruktury Wi-Fi. ESP-WIFI-MESH może być również używany do pokrycia martwych punktów Wi-Fi w scenariuszach wdrażania w domu, w których nie można osiągnąć sygnału Wi-Fi[1].

ESP MESH oferuje:

  • Automatyczne wykrywanie nowych węzłów.
  • W trybie automatycznego routingu sieć ESP-WIFI-MESH jest tworzona automatycznie zgodnie z wartościami siły sygnału.
  • Każdy węzeł może komunikować się ze światem zewnętrznym
  • Bezpieczeństwo komunikacji pomiędzy węzłami tworzona jest sieć WiFi z zabezpieczeniami WPA2.

Porgram

Do realizacji programu potrzebne są dwa kontrolery ESP8266. Pierwszy kontroler odczytuje dane z sensora DS18b20 i rozgłasza je w sieci. Drugi natomiast Odbiera dane i kontroluje diodę LED. W przypadku przekroczenia 31 stopni C załącza diodę i wysyła komunikat o aktywacji diody LED.

Schemat

Do realizacji potrzebne są dwa rezystory, dla czujnika 4,7kΩ, natomiast dioda LED wymaga 220Ω.

Mesh schemat

Kod odczyt adresu sensora

Odczyt adresu czujnika DS18b20,

#include <OneWire.h>
#define ONE_WIRE_BUS D2
OneWire pin(ONE_WIRE_BUS); 
void setup(void) {
  Serial.begin(9600);
}
void loop(void) {
  byte i;
  byte addr[8];
  
  if (!pin.search(addr)) {
    Serial.println();
    pin.reset_search();
    delay(250);
    return;
  }
  Serial.print(" ROM =");
  for (i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }
  delay(5000);
}

Kod odczyt sensora

Program wysyła odczyt temperatury poprzez sieć ESP MESH.

//Obsługa Czujnika
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS D2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress sensor = { 0x28, 0xFF, 0x19, 0x4D, 0xB3, 0x17, 0x1, 0x3E };
//Biblioteka ESP-MESH
#include "painlessMesh.h"

//Dane sieci ESP MESH
#define   MESH_PREFIX     "espMeshTest"
#define   MESH_PASSWORD   "espMeshTest1Password"
#define   MESH_PORT       5555

Scheduler userScheduler; 
painlessMesh  mesh;

void sendMessage() ;

Task taskSendMessage( TASK_SECOND * 1 , TASK_FOREVER, &sendMessage );

// Wysłanie danych w sieci ESP MESH
void sendMessage() {
  String msg = "Hello from node ";
  sensors.requestTemperatures(); 
  msg += mesh.getNodeId();
  // Wysłanie danych z sensora 
  mesh.sendBroadcast((String)sensors.getTempC(sensor));
  taskSendMessage.setInterval(TASK_SECOND * 5);
}

// Odebranie danych w sieci ESP MESH
void receivedCallback( uint32_t from, String &msg ) {
  Serial.printf("startHere: Received from %u msg=%s^C\n", from, msg.c_str());
}

void newConnectionCallback(uint32_t nodeId) {
    Serial.printf("--> startHere: New Connection, nodeId = %u\n", nodeId);
}

void changedConnectionCallback() {
  Serial.printf("Changed connections\n");
}

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

void setup() {
  Serial.begin(115200);
  // Inicjalizacja sensora
  sensors.begin();

  mesh.setDebugMsgTypes( ERROR | STARTUP ); 

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

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

void loop() {
  // Uruchamianie komunikacji ESP MESH
  mesh.update();
}

Kod sterowanie diodą LED

Program steruje diodą LED na podstawie otrzymanych danych. Wysyła aktualny stan diody poprzez ESP MESH.


#define Led D2

#include "painlessMesh.h"

#define   MESH_PREFIX     "espMeshTest"
#define   MESH_PASSWORD   "espMeshTest1Password"
#define   MESH_PORT       5555

float temperature = 0;
bool ledOn = false;

Scheduler userScheduler;
painlessMesh  mesh;


void sendMessage() ;

Task taskSendMessage( TASK_SECOND * 1 , TASK_FOREVER, &sendMessage );

//Wysłanie wiadomości ESP MESH
void sendMessage() {
  String msg = "Hello from node ";
  msg += mesh.getNodeId();
  if(ledOn == true)
  {
    mesh.sendBroadcast("Led On");
  }
  else
  {
    mesh.sendBroadcast("Led Off");
  } 
  taskSendMessage.setInterval(TASK_SECOND * 5);
}

// Odebranie Wiadomości ESP MESH
void receivedCallback( uint32_t from, String &msg ) {
  Serial.printf("startHere: Received from %u msg=%s^C\n", from, msg.c_str());
  // Przypisanie wiadomości do zmiennej
  temperature = msg.toFloat();
}

void newConnectionCallback(uint32_t nodeId) {
    Serial.printf("--> startHere: New Connection, nodeId = %u\n", nodeId);
}

void changedConnectionCallback() {
  Serial.printf("Changed connections\n");
}

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

void setup() {
  Serial.begin(115200);
  pinMode(Led, OUTPUT); //Dioda jako wyjście
  digitalWrite(Led, LOW); //Wyłączenie diody

  mesh.setDebugMsgTypes( ERROR | STARTUP );  

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

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

void loop() {
  //Uruchomienie komunikacji ESP MESH
  mesh.update();
  if(temperature >=31)
  {
    digitalWrite(Led, HIGH); //Włącz diodę
    ledOn = true;
  }
  else
  {
    digitalWrite(Led, LOW); //Włącz diodę
    ledOn=false;
  }
}

 

[1]       https://www.espressif.com/en/products/sdks/esp-wifi-mesh/overview