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

Общие вопросы по Arduino IDE для ESP8266

Phoenix

New member
Приветствую тут, в вашем полку пополнение.

Скажу честно не осилил, 30 страниц....

Внесу небольшую лепту, как входящий в тему, что я вижу и чего мне хотелось бы.

1. Очень хочется описание библиотек и команд, под среду Arduino IDE , прямо вот выворачивает ручки. К примеру есть AT команда по выводу всех подключённых IP, вот есть ли она в IDE и где, чего и как, ну очень надо и очень хочется.
2. Отлов глюков, я так и не понял до конца то ли баг, то ли фича, в общем когда зашиваю какой-нибудь тестовый скетч, для подключения к моей сети или создания точки и т.д. Обязательно создаётся ещё одна точка доступа, более того, создаётся и пингуется. Сначала была ESPap, сейчас TestESP. ESP NodeMCU использую.
3. Более адекватная документация. К примеру если в Ардуино совпадает распиновка платы со средой, то тут засада. На плате распиновка одна по портам, а в среде не распиновка платы, а распиновка GPIO.

Возможно есть ещё какие то подводные камни.
 

Victor

Administrator
Команда форума
1. Очень хочется описание библиотек и команд, под среду Arduino IDE , прямо вот выворачивает ручки. К примеру есть AT команда по выводу всех подключённых IP, вот есть ли она в IDE и где, чего и как, ну очень надо и очень хочется.
все есть · ESP8266 Arduino Core
2. Отлов глюков, я так и не понял до конца то ли баг, то ли фича, в общем когда зашиваю какой-нибудь тестовый скетч, для подключения к моей сети или создания точки и т.д. Обязательно создаётся ещё одна точка доступа, более того, создаётся и пингуется. Сначала была ESPap, сейчас TestESP. ESP NodeMCU использую.
[inline]WiFi.mode(WIFI_STA)[/inline]
3. Более адекватная документация. К примеру если в Ардуино совпадает распиновка платы со средой, то тут засада. На плате распиновка одна по портам, а в среде не распиновка платы, а распиновка GPIO.
нет, есть оба варианта, т.е. можно так [inline]pinMode(D4,OUTPUT)[/inline]
 

Phoenix

New member
Спасибо ребят, начал разбираться и изучать. Заодно формировать ТЗ самому себе к своему проекту.
 

Daenur

New member
В первую очередь благодарю автора за его работу, спасибо!

С самого начала возникло несколько вопросов. Сделал установку по инструкции, установилась версия 2.3.0. В качестве примера загружаю скетч OTA и тут же при компиляции получаю ошибку, что метод ArduinoOTA.getCommand() не существует. Смотрю ArduinoOTA.h - и правда, нет этого метода. После чего лезу за исходниками в интернет и вижу, что тут все в порядке. Чтобы запустить скрипт переписал файлы на компе файлами с интернета, все заработало. Правда папку cores оставил прежнюю - при замене новой возникали ошибки, ничего не компилировалось. Вопроса в части установки два - почему при установке по инструкции качается не последняя версия файлов с интернета и что делать с папкой cores (как ее правильно заменить новой)?

Второй вопрос по OTA обновлению. Скетч с примером запущен на плате, подключение к роутеру установлено. Переключаюсь с COM-порта на IP-адрес, запускаю Монитор порта и получаю запрос на ввод пароля. Но пароль в скрипте не указан! И даже если установить пароль, то все равно пароль не подходит. Вопрос - возможно, существует какой-то пароль по-умолчанию?
 

Phoenix

New member
Всех с наступающим. В преддверии нового года, сталкиваюсь с новыми заморочками :)

Поигравшись, и с началом понимания, приходят новые желания....

Суть такова. Сделать немного унифицированный код. А именно, возможность задавать параметры сети и подключения "сторонними" средствами. Это зачастую бывает очень удобно, при сборке каких-нибудь конструкторов.

Коротенько. Вводные: используется NodeMCU 1.0 + mega2560 (но не суть какая ардуинка).

"Хочем" - подключаться к WiFi с вариативными параметрами - т.е. вход в любую известную WiFi сеть с известными заведомо параметрами, без перепрошивок и плясок с бубном. Далее использование Esp как простого транзита данных по средствам UDP запросов - прямиком в UART arduino, ну и возможно потом пару-тройку ещё каких-нибудь функций чисто от ESP.

История:
Есть библиотека <ESP8266WiFi.h> - помогает конектиться к сетям.
Есть библиотека <WiFiUdp.h> - помогает организовать приём и передачу UDP запросов.

Итого гугл нас приводит на простой но рабочий пример, чуть русифицируем его и получаем

Код:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char* ssid = "Phoenix's";   //имя сети
const char* password = "o940km64"; //пароль

WiFiUDP Udp;
unsigned int localUdpPort = 2048;  // порт
char incomingPacket[255];  // буфер входящего пакета
char  replyPacekt[] = "Poluchil soobshenie";  // строка ответа

IPAddress ip(192, 168, 1, 101); // свой IP
IPAddress gateway(192, 168, 1, 1); // шлюз
IPAddress subnet(255, 255, 255, 0); // маска

void setup()
{
  Serial.begin(115200);
  Serial.println();

  Serial.printf("Podkluchayus ", ssid);
  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(200);
    Serial.print(".");
  }
  Serial.println("soedinen");

  Udp.begin(localUdpPort);
  Serial.printf(" IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
}


void loop()
{
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    // принимаем пакет
    Serial.printf("Prinyali %d bytes s %s, v port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
    int len = Udp.read(incomingPacket, 255);
    if (len > 0)
    {
      incomingPacket[len] = 0;
    }
    Serial.printf("Prinyata stroka: %s\n", incomingPacket);

    // отправка ответного сообщения о принятом пакете
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(replyPacekt);
    Udp.endPacket();
  }
}

Всё, просто и понятно. Работает, для тестов использовал софтинку PacketSenderPortable .


Но задачу это не решает. Мы же хотим "любую сеть и любые параметры". Начать решил с "простого" - а именно статический IP. В коде он уже вписан как


Код:
IPAddress ip(192, 168, 1, 101); // свой IP
IPAddress gateway(192, 168, 1, 1); // шлюз
IPAddress subnet(255, 255, 255, 0); // маска
Отлично, можем прописывать, но вот ньюанс, он может быть "волшебным" при работе в других Wifi сетях, к примеру университетских, и что там выпадет с какого диапазона, ну или просто что бы знать "кто где висит" и вписываться вне диапазона заданного роутером, и задавать у примеру аппаратно. Т.е. у меня мега сейчас для скорости и удобства, она читает 5 портов, и в зависимости от конфигурации "джамперов" - вычисляет какому быть IP , по сути можно использовать сдвиговик после, и задавать малым количеством пинов любой IP адрес аппаратно.

Значит в IP адресе должна быть переменная. Переменную эту я буду получать с подключённой Arduino через UART. И вот тут начинается самое интересное....

Если я прописываю к примеру:

Код:
byte IP=101;

IPAddress ip(192, 168, 1, IP);
Нормально, работает так же стабильно. Значит не вдаваясь в подробности - переменные в адресах канают.

Допустим.
Прежде чем подключаться, надо же знать куда.

Вот тут начинается диссонанс...

IPAddress ip - это у нас глобальная константа. Т.е. её место в самом верху. И если я её пихаю в setup и добавляю мол volatile - аля редактирую где хочу - компилятор говорит что я дурак не образованный что такое хочу с константой сделать.

Если она остаётся в "шапке" то последний байт IP у меня по просту не меняется, ибо константа объявлена и пофиг.

Хорошо, но с другой стороны, я могу задать все переменные в ней, до её фактического объявления, т.е. пихаем её всё же в setup , после прочтения последнего байта IP адреса.

В итоге, setup имеет вид

Код:
void setup() 
{
  Serial.begin(115200);
  Serial.println();

  bool f = 0;
  delay (300);
  while (f == 0) {
    IP = Serial.parseInt();
    if (IP > 0) {
      f = 1;
    }
  }
  delay (300);

  IPAddress ip(192, 168, 1, IP);
  Serial.print (ip);

  Serial.printf("Podkluchayus ", ssid);
  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.println(".");
  }
  Serial.println("soedinen");

  Udp.begin(localUdpPort);
  Serial.printf(" IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
}
Теперь интересность, заливаем.
Видим:
Роутер ловит esp по дефолтовому адресу 192,168,1,10 %)

Как только я ему скидываю в сериал число - идёт присваивание последнего байта, и начало инициализации подключения. Только вот на нём и останавливается. Т.е. дальше я получаю только "." и периодичностью в 0,5 сек. Т.е. застреваю в

Код:
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.println(".");
  }
Т.е. статус подключения, нам не возвращается как "подключённый".

Хотя при этом, старый IP перестаёт пинговаться, а новый начинает. Т.е. как бы связь есть и она как бы установлена. Но не подтверждена. Роутер так же видит девайс, но остаётся на стадии получения IP адреса.

Выкидываем нафиг проверку подключения. И опаньки, не только пингуется но так же шлются запросы и получаются ответы. Хотя роутер говорит что у нас всё равно на 10 (дефолтовом) IP всё висит.

Делаем println (WiFi.status()); он возвращает "6" т.е. либо WL_DISCONNECTED либо WL_CONNECT_FAILED что как бы, ни одно, ни другое не говорит о работоспособности системы, хотя она отлично себя чувствует. При доработке пакеты отлично и отправляются и принимаются, без нареканий.

Либо, я что-то не понимаю, почему статус "не едет", когда "едет", хотя роутер тоже упирается и говорит мол "получение IP". Помогите советом хотя бы, а то скоро меня уже в гугле забанят :( он ответов толковых не дал и не могу найти откуда собственно ноги растут. Может у кого был подобный опыт?
 

artko

New member
Подскажите, как-то можно перехватить исключение и подавить? Падает библиотека бота для телеграма, на этапе ssl подключения к серверу. Периодически, не всегда. И потом опять же не всегда нормально рестартует модуль, да и рестарта не хочется..
Decoding 30 results
0x4000e1b2: ?? ??:0
0x402303a7: more_comps at /Users/igrokhotkov/e/axtls/e1/crypto/bigint.c:1072
0x40230540: alloc at /Users/igrokhotkov/e/axtls/e1/crypto/bigint.c:1106
0x402307f2: regular_multiply at /Users/igrokhotkov/e/axtls/e1/crypto/bigint.c:822
0x402112cc: esp_yield at C:\Users\ARTEM\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/core_esp8266_main.cpp:56
0x4023134e: bi_barrett at /Users/igrokhotkov/e/axtls/e1/crypto/bigint.c:1289
0x402315a9: bi_mod_power at /Users/igrokhotkov/e/axtls/e1/crypto/bigint.c:1414
0x4023040c: trim at /Users/igrokhotkov/e/axtls/e1/crypto/bigint.c:1197
0x40232635: RSA_public at /Users/igrokhotkov/e/axtls/e1/crypto/rsa.c:242
(inlined by) RSA_encrypt at /Users/igrokhotkov/e/axtls/e1/crypto/rsa.c:276
0x4022e740: send_client_key_xchg at /Users/igrokhotkov/e/axtls/e1/ssl/tls1_clnt.c:352
0x4022eb41: do_clnt_handshake at /Users/igrokhotkov/e/axtls/e1/ssl/tls1_clnt.c:109
0x4020d127: ClientContext::_consume(unsigned int) at C:\Users\ARTEM\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WiFi\src/WiFiClientSecure.cpp:517
(inlined by) ClientContext::read(char*, unsigned int) at C:\Users\ARTEM\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WiFi\src\include/ClientContext.h:175
0x4022e538: do_handshake at /Users/igrokhotkov/e/axtls/e1/ssl/tls1.c:1481
(inlined by) basic_read at /Users/igrokhotkov/e/axtls/e1/ssl/tls1.c:1357
0x4022e8e0: do_client_connect at /Users/igrokhotkov/e/axtls/e1/ssl/tls1_clnt.c:154
0x4022d26e: ssl_new at /Users/igrokhotkov/e/axtls/e1/ssl/tls1.c:583
0x4022e690: ssl_read at /Users/igrokhotkov/e/axtls/e1/ssl/tls1.c:265
0x4020d599: SSLContext::connect(ClientContext*, char const*, unsigned int) at C:\Users\ARTEM\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WiFi\src/WiFiClientSecure.cpp:517
(inlined by) WiFiClientSecure::_connectSSL(char const*) at C:\Users\ARTEM\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WiFi\src/WiFiClientSecure.cpp:279
0x4020c9fe: WiFiClient::connect(IPAddress, unsigned short) at C:\Users\ARTEM\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WiFi\src/WiFiClient.cpp:149
0x4020d754: WiFiClientSecure::connect(IPAddress, unsigned short) at C:\Users\ARTEM\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WiFi\src/WiFiClientSecure.cpp:258
0x4020f52b: TelegramBOT::connectToTelegram(String) at C:\WORK\Arduino\libraries\TelegramBot-master\src/TelegramBOT.cpp:55
 

Casper

Member
Подскажите пожалуйста, как можно очистить память где хранятся наши файлы при перепрошивки? А то сохраняются все данные(( И где лежат файлы web интерфейса, чтобы можно было свой файл залить!?
 

krepton85

Member
И где лежат файлы web интерфейса, чтобы можно было свой файл залить!?
Все зависит от вашего скетча, которым вы загадили эту память. Вэб-интэрфейс может быть и в rom памяти (в самом скетче), а может быть загружен в виде html страниц (файлов) в SPIFFS файловую систему, ну а так же еще есть эмуляция EEPROM памяти, она тоже не затирается после прошивки.
Все можно скетчем соответствующим очистить. А можно найти чистый blank.bin нужного объема памяти. И прошить его.
 

Casper

Member
Все зависит от вашего скетча, которым вы загадили эту память. Вэб-интэрфейс может быть и в rom памяти (в самом скетче), а может быть загружен в виде html страниц (файлов) в SPIFFS файловую систему, ну а так же еще есть эмуляция EEPROM памяти, она тоже не затирается после прошивки.
Все можно скетчем соответствующим очистить. А можно найти чистый blank.bin нужного объема памяти. И прошить его.
Я использовал стандартный скетч WiFiManager там SPIFFS используется.
 

krepton85

Member
@Casper, пока не знаю, ни разу не пользовался этой библиотекой.

Где то видел еще одну библиотеку с примером, где можно было через браузер просматривать всю SPIFFS: удалять, сохранять туда файлы.
 
Последнее редактирование:

krepton85

Member
@Casper интересная ваша библиотека, но в ней не хватает одной плюшки - это возможность переконфегурировать wi fi если уже подключился esp8266 к роутару, нужно либо роутар отключить, что бы вновь подключится к точке доступа и перенастроить все, либо использовать отдельную кнопку для esp8266, которая будет переключать в режим точки доступа.
 

Casper

Member
@krepton85 А можете подсказать, где в этой библиотеке находятся файлы, которые заливаются и где это в коде написано!?
 

krepton85

Member

krepton85

Member
@Victor, ну оно то понятно что все уже написано за нас и должно работать как часы (NTP например :) ), но вот данный пример (который разработчик этой библиатеки предоставил) почему то у меня не заработал, все по прежнему на странице только 2 параметра ssid & pass и все.
 

qwertyhp

New member
Столкнулся с проблемой.

При попытке работы с Wemos D1 mini и LoLin MCU (на 340-м чипе USB) столкнулся с ошибкой еще на стадии проверки кода.
(Windows XP SP2 RUS + Arduino IDE 1.6.5 r2), Плата»NodeMCU 1.0 (ESP-12E Module), 80 MHz, Serial, 115200, 4M (3M SPIFFS)»
ВЫГЛЯДИТ СООБЩЕНИЕ ТАК :
—————————————————-
Изменена опция сборки, пересобираем все

C:\Documents and Settings\Миша\Application Data\Arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2/bin/xtensa-lx106-elf-g++ -D__ets__ -DICACHE_FLASH -U__STRICT_ANSI__ -IC:\Documents and Settings\Миша\Application Data\Arduino15\packages\esp8266\hardware\esp8266\2.3.0/tools/sdk/include -IC:\Documents and Settings\Миша\Application Data\Arduino15\packages\esp8266\hardware\esp8266\2.3.0/tools/sdk/lwip/include -IC:\DOCUME~1\МИША\LOCALS~1\Temp\build4095159779535408461.tmp/core -c -w -Os -g -mlongcalls -mtext-section-literals -fno-exceptions -fno-rtti -falign-functions=4 -std=c++11 -MMD -ffunction-sections -fdata-sections -DF_CPU=80000000L -DLWIP_OPEN_SRC -DARDUINO=10605 -DARDUINO_ESP8266_WEMOS_D1MINI -DARDUINO_ARCH_ESP8266 -DARDUINO_BOARD="ESP8266_WEMOS_D1MINI" -DESP8266 -IC:\Documents and Settings\Миша\Application Data\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266 -IC:\Documents and Settings\Миша\Application Data\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\variants\d1_mini C:\DOCUME~1\МИША\LOCALS~1\Temp\build4095159779535408461.tmp\sketch_mar16a.cpp -o C:\DOCUME~1\МИША\LOCALS~1\Temp\build4095159779535408461.tmp\sketch_mar16a.cpp.o

xtensa-lx106-elf-g++: error: И: No such file or directory
xtensa-lx106-elf-g++: error: А\LOCALS~1\Temp\build4095159779535408461.tmp/core: No such file or directory
xtensa-lx106-elf-g++: error: И: No such file or directory
xtensa-lx106-elf-g++: error: А\LOCALS~1\Temp\build4095159779535408461.tmp\sketch_mar16a.cpp: No such file or directory
xtensa-lx106-elf-g++: error: И: No such file or directory
xtensa-lx106-elf-g++: error: А\LOCALS~1\Temp\build4095159779535408461.tmp\sketch_mar16a.cpp.o: No such file or directory
Ошибка компиляции.
—————————————————-

При этом на самом деле папка/файл
build4095159779535408461.tmp\sketch_mar16a.cpp
на диске есть,
build4095159779535408461.tmp\sketch_mar16a.cpp.o
на диске НЕТ.

От компиляции к компиляции имя *.tmp папки/файла меняется, но ошибка остается.
/*
В исполняемых файлах, расположенных по адресу:
C:\Documents and Settings\Миша\Application Data\Arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\bin\

обнаружил такую строчку:
d:/ivan/projects/arduinoesp/toolchain/xtensa-lx106-elf/libexec/gcc/

Повторяется (в вариациях) во всех exe-файлах.
*/
Модули разные, источники модулей разные, проблема одна. Весь интернет перерыл, но ответа не нашел.
Ставил и IDE 1.6.7, и делал портативную - не помогает. НЕ КОМПИЛИРУЕТСЯ вообще никакой скетч, даже БЛИНК на встроенный диод. Ошибка всегда одна. Но при этом на ком-порте и как Wi-Fi устройство в сети и LoLin, и WeMos D1 mini видны без проблем. А поставить принципиально иную операционку сейчас нет возможности.

Помогите, пожалуйста!
 

Юрий Ботов

Moderator
Команда форума
Похоже на то что линкер не находит папку temp. Переопределите ее в windows (и общую и для конкретного пользователя) в другое более доступное место, без русских букв и длинных имен: screenshot.jpg
 
Сверху Снизу