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Ω.

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
