Уважаемые посетители сайта esp8266.ru!
Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram
Внесу небольшую лепту, как входящий в тему, что я вижу и чего мне хотелось бы.
1. Очень хочется описание библиотек и команд, под среду Arduino IDE , прямо вот выворачивает ручки. К примеру есть AT команда по выводу всех подключённых IP, вот есть ли она в IDE и где, чего и как, ну очень надо и очень хочется.
2. Отлов глюков, я так и не понял до конца то ли баг, то ли фича, в общем когда зашиваю какой-нибудь тестовый скетч, для подключения к моей сети или создания точки и т.д. Обязательно создаётся ещё одна точка доступа, более того, создаётся и пингуется. Сначала была ESPap, сейчас TestESP. ESP NodeMCU использую.
3. Более адекватная документация. К примеру если в Ардуино совпадает распиновка платы со средой, то тут засада. На плате распиновка одна по портам, а в среде не распиновка платы, а распиновка GPIO.
1. Очень хочется описание библиотек и команд, под среду Arduino IDE , прямо вот выворачивает ручки. К примеру есть AT команда по выводу всех подключённых IP, вот есть ли она в IDE и где, чего и как, ну очень надо и очень хочется.
2. Отлов глюков, я так и не понял до конца то ли баг, то ли фича, в общем когда зашиваю какой-нибудь тестовый скетч, для подключения к моей сети или создания точки и т.д. Обязательно создаётся ещё одна точка доступа, более того, создаётся и пингуется. Сначала была ESPap, сейчас TestESP. ESP NodeMCU использую.
3. Более адекватная документация. К примеру если в Ардуино совпадает распиновка платы со средой, то тут засада. На плате распиновка одна по портам, а в среде не распиновка платы, а распиновка GPIO.
В первую очередь благодарю автора за его работу, спасибо!
С самого начала возникло несколько вопросов. Сделал установку по инструкции, установилась версия 2.3.0. В качестве примера загружаю скетч OTA и тут же при компиляции получаю ошибку, что метод ArduinoOTA.getCommand() не существует. Смотрю ArduinoOTA.h - и правда, нет этого метода. После чего лезу за исходниками в интернет и вижу, что тут все в порядке. Чтобы запустить скрипт переписал файлы на компе файлами с интернета, все заработало. Правда папку cores оставил прежнюю - при замене новой возникали ошибки, ничего не компилировалось. Вопроса в части установки два - почему при установке по инструкции качается не последняя версия файлов с интернета и что делать с папкой cores (как ее правильно заменить новой)?
Второй вопрос по OTA обновлению. Скетч с примером запущен на плате, подключение к роутеру установлено. Переключаюсь с COM-порта на IP-адрес, запускаю Монитор порта и получаю запрос на ввод пароля. Но пароль в скрипте не указан! И даже если установить пароль, то все равно пароль не подходит. Вопрос - возможно, существует какой-то пароль по-умолчанию?
Всех с наступающим. В преддверии нового года, сталкиваюсь с новыми заморочками
Поигравшись, и с началом понимания, приходят новые желания....
Суть такова. Сделать немного унифицированный код. А именно, возможность задавать параметры сети и подключения "сторонними" средствами. Это зачастую бывает очень удобно, при сборке каких-нибудь конструкторов.
Коротенько. Вводные: используется 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. В коде он уже вписан как
Отлично, можем прописывать, но вот ньюанс, он может быть "волшебным" при работе в других 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". Помогите советом хотя бы, а то скоро меня уже в гугле забанят он ответов толковых не дал и не могу найти откуда собственно ноги растут. Может у кого был подобный опыт?
Подскажите, как-то можно перехватить исключение и подавить? Падает библиотека бота для телеграма, на этапе 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
Подскажите пожалуйста, как можно очистить память где хранятся наши файлы при перепрошивки? А то сохраняются все данные(( И где лежат файлы web интерфейса, чтобы можно было свой файл залить!?
Все зависит от вашего скетча, которым вы загадили эту память. Вэб-интэрфейс может быть и в rom памяти (в самом скетче), а может быть загружен в виде html страниц (файлов) в SPIFFS файловую систему, ну а так же еще есть эмуляция EEPROM памяти, она тоже не затирается после прошивки.
Все можно скетчем соответствующим очистить. А можно найти чистый blank.bin нужного объема памяти. И прошить его.
Все зависит от вашего скетча, которым вы загадили эту память. Вэб-интэрфейс может быть и в rom памяти (в самом скетче), а может быть загружен в виде html страниц (файлов) в SPIFFS файловую систему, ну а так же еще есть эмуляция EEPROM памяти, она тоже не затирается после прошивки.
Все можно скетчем соответствующим очистить. А можно найти чистый blank.bin нужного объема памяти. И прошить его.
@Casper интересная ваша библиотека, но в ней не хватает одной плюшки - это возможность переконфегурировать wi fi если уже подключился esp8266 к роутару, нужно либо роутар отключить, что бы вновь подключится к точке доступа и перенастроить все, либо использовать отдельную кнопку для esp8266, которая будет переключать в режим точки доступа.
@Victor, ну оно то понятно что все уже написано за нас и должно работать как часы (NTP например ), но вот данный пример (который разработчик этой библиатеки предоставил) почему то у меня не заработал, все по прежнему на странице только 2 параметра ssid & pass и все.
При попытке работы с 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 видны без проблем. А поставить принципиально иную операционку сейчас нет возможности.
Похоже на то что линкер не находит папку temp. Переопределите ее в windows (и общую и для конкретного пользователя) в другое более доступное место, без русских букв и длинных имен: