В данном уроке мы с Вами настроем связь между двумя микроконтроллерами ESP8266. Передавать мы будем текстовые данные и рандомные цифры. Учитывая что мы будем общаться между платами напрямую, нам нужно понимать кто у нас приемник, а кто отправитель. В принципе отправитель может быть и приемником одновременно. Пока рассмотрим более простой пример, когда у нас есть отправитель и приемник.
Для начала, что бы понимать кто у нас приемник, нам нужен его MAC адрес, для этого воспользуемся программой которая считывает MAC адрес:
#include «ESP8266WiFi.h»
void setup(){
Serial.begin(115200);
//WiFi.mode(WIFI_MODE_STA);
Serial.println();
Serial.println(WiFi.macAddress());
}
По умолчанию режим 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() {
}
После включения двух плат на мониторе порта приемника Вы увидите следующие данные:
<<— Предыдущий урок
СОДЕРЖАНИЕ
Следующий урок —>>
<<— Предыдущий урок
СОДЕРЖАНИЕ
Следующий урок —>>