• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь связать 2 ESP8266-01 для управления серво.

nikolz

Well-known member
Код:
#include <ESP8266WiFi.h>
extern "C" {
#include <espnow.h>
}
uint8_t remoteMac[] = {0x84, 0xF3, 0xEB, 0x66, 0x16, 0xE5}; // это мак адрес второго ESP
#define CHANNEL 1

void send_cb( uint8_t *mac, uint8_t sendStatus); //колбек отправки данных
void recv_cb(u8 *macaddr, u8 *data, u8 len); //колбек подтверждения

void setup() {
  system("chcp 1251");
  system("cls");
  Serial.begin(115200);
  // initialize all the readings to 0:
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
  readings[thisReading] = 0;
  }
  WiFi.mode(WIFI_STA);   WiFi.disconnect();
  if (esp_now_init() == 0){
  esp_now_register_send_cb(send_cb);
  esp_now_register_recv_cb(recv_cb);
  esp_now_set_self_role(ESP_NOW_ROLE_COMBO);
  esp_now_add_peer(remoteMac, ESP_NOW_ROLE_CONTROLLER, CHANNEL, NULL, 0);
}
}

void loop() {

long  data = system_adc_read();
esp_now_send(remoteMac, (unsigned char*)data, sizeof(data)); //  передаем данные
delay(50);
}
мне с этим не справиться. Сегодня на обеде сделал правки, ошибка исчезла, но появилась новая.


Код:
c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-3-20ed2b9/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: sketch\NK_ESP_NOW_clirnt.ino.cpp.o:(.text.setup+0x18): undefined reference to `send_cb(unsigned char*, unsigned char)'

c:/users/user/appdata/local/arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-3-20ed2b9/bin/../lib/gcc/xtensa-lx106-elf/4.8.2/../../../../xtensa-lx106-elf/bin/ld.exe: sketch\NK_ESP_NOW_clirnt.ino.cpp.o:(.text.setup+0x1c): undefined reference to `recv_cb(unsigned char*, unsigned char*, unsigned char)'

collect2.exe: error: ld returned 1 exit status

exit status 1
Ошибка компиляции для платы Generic ESP8266 Module.
Намекните, что еще нужно этому компилятору? Я до вчерашнего дня в принципе на ардуино не пользовался указателями на переменные... Может я не все библиотеки подключил?
все нормально
он пишет что вы не написали функцию recv_cb и send_cb
т е нет самих функций осталось лишь их описание
линковщик
пытается найти их в библиотеке но там их естественно нет,
так как это ваши функции
вот он вам и говорит дескать что же ты их не написал
 

nikolz

Well-known member
если вам какой-то колбек не нужен то надо выкинуть все его упоминания
 

nikolz

Well-known member
напишите их пока так - пустышки
  1. void send_cb( uint8_t *mac, uint8_t sendStatus){}; //колбек отправки данных
  2. void recv_cb(u8 *macaddr, u8 *data, u8 len){}; //колбек подтверждения
 

AndreyFly

New member
Огромное спасибо. Сегодня до 4 утра пытался победить ошибки компилятора, с 8 на работу ушел сонный. В обед поправил по Вашей подсказке, и когда увидел снова ошибку компилятора, мозг отключился. Все скомпилировалось. теперь буду добивать приемную часть, в надежде, что будет чуточку проще.
 

AndreyFly

New member
Залил прошивки в оба чипа. Подключил приемную часть к монитору порта. Сообщение о выходе в готовность вижу, но данных нет.
Подключил передающую часть к монитору порта, а он в готовность не выходит.
по кругу пишет одно и тоже. Как будто что-то мешает запуститься и он в перезагрузку уходит. Это проблемы с питанием или с чипом?

Код:
Exception (28):
epc1=0x4000df09 epc2=0x00000000 epc3=0x00000000 excvaddr=0x0000015e depc=0x00000000

>>>stack>>>

ctx: cont
sp: 3ffffdb0 end: 3fffffc0 offset: 01a0
3fffff50:  4021edee 00000001 4021ede2 00000004 
3fffff60:  0000015e 402147b1 3ffeeae4 00000004 
3fffff70:  0000000b 3ffef0bc 0000015e 4021460f 
3fffff80:  00000004 0000015e 3fffdad0 3ffee3d4 
3fffff90:  40202521 4020252c 3ffee3d4 00000000 
3fffffa0:  feefeffe 00000000 3ffee3d4 40202f04 
3fffffb0:  feefeffe feefeffe 3ffe850c 401009a5 
<<<stack<<<

ets Jan  8 2013,rst cause:2, boot mode:(3,7)

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v951aeffa
~ld
 

AndreyFly

New member
Понятнее не становится. Вроде как стек переполнился, но с чего не понятно
Код:
Exception 28: LoadProhibited: A load referenced a page mapped with an attribute that does not permit loads
PC: 0x4000df09
EXCVADDR: 0x0000015e

Decoding stack results
0x402147b1: dhcp_renew at core/ipv4/dhcp.c line 1435
0x4021460f: dhcp_recv at core/ipv4/dhcp.c line 1704
0x40202521: setup() at D:\ESP8266\NK_ESPNow_8266\NK_ESP_NOW_clirnt/NK_ESP_NOW_clirnt.ino line 36
0x4020252c: setup() at D:\ESP8266\NK_ESPNow_8266\NK_ESP_NOW_clirnt/NK_ESP_NOW_clirnt.ino line 37
0x40202f04: __unhandled_exception_cpp() at C:\Users\User\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0\cores\esp8266\core_esp8266_main.cpp line 157
 

nikolz

Well-known member
Понятнее не становится. Вроде как стек переполнился, но с чего не понятно
Код:
Exception 28: LoadProhibited: A load referenced a page mapped with an attribute that does not permit loads
PC: 0x4000df09
EXCVADDR: 0x0000015e

Decoding stack results
0x402147b1: dhcp_renew at core/ipv4/dhcp.c line 1435
0x4021460f: dhcp_recv at core/ipv4/dhcp.c line 1704
0x40202521: setup() at D:\ESP8266\NK_ESPNow_8266\NK_ESP_NOW_clirnt/NK_ESP_NOW_clirnt.ino line 36
0x4020252c: setup() at D:\ESP8266\NK_ESPNow_8266\NK_ESP_NOW_clirnt/NK_ESP_NOW_clirnt.ino line 37
0x40202f04: __unhandled_exception_cpp() at C:\Users\User\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0\cores\esp8266\core_esp8266_main.cpp line 157
выложите свои программы
сообщение что произошла ошибка которая не контролируется средой исполнения
при выполнении 37 и 36 строки setup() при обращении к функции dhcp в строке 1435
------------------
полагаю это связано с инициализацией wifi
возможно у вас неправильно указан размер флеш либо не записаны параметры настройки Wifi по умолчанию
что и как для ардуино я не подскажу так как на дурине не пишу
но это типовая ошибка при работе новичков с новыми модулями ESP
полагаю подскажут как сделать
 

AndreyFly

New member
собственно как такового кода то еще и нет. Только инициализация и передача 1 либо 2 байт каждые 50 мсек.
код на сервере, стартует, проходит инициализацию, но данные не получает, так как ошибка на клиенте

Код:
#include <ESP8266WiFi.h>
extern "C" {
#include <espnow.h>
}
uint8_t remoteMac[] = {0x84, 0xF3, 0xEB, 0x66, 0x1D, 0xD5}; // это мак адресс второго ESP
#define CHANNEL 1
long data;
void send_cb( uint8_t *mac, uint8_t sendStatus){};
void recv_cb(u8 *macaddr, u8 *data, u8 len)
{
  esp_now_send(macaddr, (u8*) 1 , 1 );  //отправляем подтверждение
//data содержит принятые данные   работаем с ними
Serial.println(*data);
}; //колбек приема

void setup() {
  system("chcp 1252");
  system("cls");
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);   WiFi.disconnect();
  if (esp_now_init() == 0){
  esp_now_register_send_cb(send_cb);
  esp_now_register_recv_cb(recv_cb);
  esp_now_set_self_role(ESP_NOW_ROLE_COMBO);
  esp_now_add_peer(remoteMac, ESP_NOW_ROLE_COMBO, CHANNEL, NULL, 0);
  Serial.println("***********************************");
  Serial.println(WiFi.macAddress());
} else Serial.println("init error");
}

void loop() {
}
Код на клиенте, с которого выходит ошибка, 2 постами выше
В нем опрашивается АЦП и полученное значение отправляется на сервер каждые 50 мсек.

Код:
#include <ESP8266WiFi.h>
extern "C" {
#include <espnow.h>
}
uint8_t remoteMac[] = {0x84, 0xF3, 0xEB, 0x66, 0x16, 0xE5}; // это мак адресс второго ESP
#define CHANNEL 1

void send_cb( uint8_t *mac, uint8_t sendStatus){}; //колбек отправки данных
void recv_cb(u8 *macaddr, u8 *data, u8 len){}; //колбек подтверждения


void setup() {
  system("chcp 1252");
  system("cls");
  Serial.begin(115200);
  // initialize all the readings to 0:
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
  readings[thisReading] = 0;
  } 
  WiFi.mode(WIFI_STA);   WiFi.disconnect();
  if (esp_now_init() == 0){
  esp_now_register_send_cb(send_cb);
  esp_now_register_recv_cb(recv_cb);
  esp_now_set_self_role(ESP_NOW_ROLE_COMBO);
  esp_now_add_peer(remoteMac, ESP_NOW_ROLE_CONTROLLER, CHANNEL, NULL, 0);
  Serial.println("***********************************");
  Serial.println(WiFi.macAddress());
} else Serial.println("init error");
 
}

void loop() {

long  data = system_adc_read();
esp_now_send(remoteMac, (unsigned char*)data, sizeof(data)); //  передаем данные
delay(50);
}
 

nikolz

Well-known member
Вы не правильно логически написали программу
посмотрите внимательно мой пример
Отправка следующего сообщения возможно лишь после получения реакции на предыдущее
т е после вызова колбека отправки
у меня для этого используется флаг состояния
т е отправили сообщение - установили влаг
и ждете в колбеке send
в колбеке сбрасываете флаг
и после этого можно отправить новое сообщение
если второе ESP отсутствует или еще какая-то проблема то в колбеке получите ошибку
 

nikolz

Well-known member
и еще
1) начальное включение WiFi происходит долго и может составлять до 200 мс
я не знаю как это учитывается в дурине
поэтому поставьте задержку в конце setup
2) задержку на отправку нового сообщения лучше реализовать через таймер
например как у меня задержка ожидания ответа
и можно таймер установить в автоматический режим
а отправку поместить в колбек таймера
тогда loop будет пустым
 

nikolz

Well-known member
и еще
добавьте в цикл loop функцию, которая позволяет проверить наличие второго ESP
в виде
err=esp_now_is_peer_exist(remoteMac);
и выведите результат на дисплей
-------------------
отладку рекомендую делать так
если есть возможность то подключить оба ESP к компьютеру вывести их ответы в терминал
если такой возможности нет то поочередно
один к терминалу
второй к источнику питания
----------------
сначала проверяете результат исполнения init
и проверку в эфире второго ESP
делаете это для каждого ESP поочередно
--------------------------
после получения положительного результата
ставите отсылку данных например число 99 из одного и приемку в другом с отображением результата в терминале отображение делаете как для целого числа
формат %d
делаете это для каждого ESP вне зависимости сервер это или клиент
----------------------
В результате Вы должны получить ответ на вопрос передаются ли данные между ESP
===================
и только после этого делаете клиента и сервера с чтением и передачей значений АЦП
-------------------
 

AndreyFly

New member
Всем помогавшим огромное спасибо. После долгих проб написать код под ESP8266, у меня ничего не вышло. Поиски в интернете приемо-передающих модулей к ардуино, натолкнули меня на модули nRF24L01+ . К моему счастью, в интернете нашелся полностью рабочий код под мои нужды, и все заработало в тот же вечер. Конечно же дописал в тот код отключение моторов при потере связи, и плавное изменение PPM сигнала, чтобы моторы не дергались, а плавно меняли свои обороты.
Еще раз повторюсь. Огромное спасибо помогавшим! И я всетаки надеюсь, что как появится свободное время, я разберусь с модулями ESP8266. Уж больно интересно стало.
 
Сверху Снизу