• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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. Уж больно интересно стало.
 
Сверху Снизу