Настраиваем двух стороннюю связь между микроконтроллерами ESP8266 в среде программирования Arduino IDE.

В данном уроке мы с Вами настроем связь между двумя микроконтроллерами ESP8266. Передавать мы будем текстовые данные и рандомные цифры.  Учитывая что мы будем общаться между платами напрямую, нам нужно понимать кто у нас приемник, а кто отправитель. В принципе отправитель может быть и приемником одновременно.  Пока рассмотрим более простой пример, когда у нас есть отправитель и приемник. 

Для начала, что бы понимать кто у нас приемник, нам нужен его MAC адрес, для этого воспользуемся программой которая считывает MAC адрес:

#include «ESP8266WiFi.h»

void setup(){
Serial.begin(115200);
//WiFi.mode(WIFI_MODE_STA);
Serial.println();
Serial.println(WiFi.macAddress());
}

void loop(){
}

По умолчанию режим WiFi обычно установлен в режиме станции, если это не так, расскоментируйте стройку WiFi.mode.

У Вас в мониторе порта появится МАС адрес вашего устройства. Я сразу считал с обеих плат, у меня следующие адреса (у Вас будут свои адреса):

98:F4:AB:B3:CA:4D —  плата отправитель
30:83:98:83:2C:7D —  плата приемник

Теперь напишем программны код для отправителя:

#include <ESP8266WiFi.h>
#include <espnow.h>
//Отправитель
// REPLACE WITH RECEIVER MAC Address 30:83:98:83:2C:7D
uint8_t broadcastAddress[] = {0x30, 0x83, 0x98, 0x83, 0x2C, 0x7D};

//опишем структуру со всеми основными типами данных
typedef struct struct_message {
char a[128];
int b;
float c;
String d;
bool e;
} struct_message;

//создадим структуру  myData
struct_message myData;

unsigned long lastTime = 0;
unsigned long timerDelay = 100; // интервал времени для отправки

// Callback when data is sent
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
Serial.print(«Last Packet Send Status: «);
if (sendStatus == 0){
Serial.println(«Delivery success»);
}
else{
Serial.println(«Delivery fail»);
}
}

void setup() {
// Init Serial Monitor
Serial.begin(115200);

// Set device as a Wi-Fi Station
WiFi.mode(WIFI_STA);

// Init ESP-NOW
if (esp_now_init() != 0) {
Serial.println(«Error initializing ESP-NOW»);
return;
}

// Once ESPNow is successfully Init, we will register for Send CB to
// get the status of Trasnmitted packet
esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
esp_now_register_send_cb(OnDataSent);

// Register peer
esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
}

void loop() {
if ((millis() — lastTime) > timerDelay) {
// Set values to send
strcpy(myData.a, «Hello Malik Aleksey»);
myData.b = random(1,20);
myData.c = 1.2;
myData.d = «all_Ok»;
myData.e = false;

// Send message via ESP-NOW
esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

lastTime = millis();
}
}

Теперь напишем программу для приемника:

#include <ESP8266WiFi.h>
#include <espnow.h>

// Structure example to receive data
// Must match the sender structure
typedef struct struct_message {
char a[128];
int b;
float c;
String d;
bool e;
} struct_message;

// Create a struct_message called myData
struct_message myData;

// Callback function that will be executed when data is received
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
memcpy(&myData, incomingData, sizeof(myData));
Serial.print(«Bytes received: «);
Serial.println(len);
Serial.print(«Char: «);
Serial.println(myData.a);
Serial.print(«Int: «);
Serial.println(myData.b);
Serial.print(«Float: «);
Serial.println(myData.c);
Serial.print(«String: «);
Serial.println(myData.d);
Serial.print(«Bool: «);
Serial.println(myData.e);
Serial.println();
}

void setup() {
// Initialize Serial Monitor
Serial.begin(115200);

// Set device as a Wi-Fi Station
WiFi.mode(WIFI_STA);

// Init ESP-NOW
if (esp_now_init() != 0) {
Serial.println(«Error initializing ESP-NOW»);
return;
}

// Once ESPNow is successfully Init, we will register for recv CB to
// get recv packer info
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
esp_now_register_recv_cb(OnDataRecv);
}

void loop() {

}

После включения двух плат на мониторе порта приемника  Вы увидите следующие данные:

<<—  Предыдущий урок

СОДЕРЖАНИЕ

Следующий урок —>>

<<—  Предыдущий урок

СОДЕРЖАНИЕ

Следующий урок —>>