Разработка ‘библиотеки’ малого webсервера на esp8266.

pvvx

Активный участник сообщества
Я извиняюсь за настойчивость, но это правда для меня важно.
Pvvx, возможно ли эту "фичу" убрать, или это нереально?
Конкретнее что там вам мешает?
Вчера несколько часов был соединен свисток USB с AP и ничего не отключилось.
Отключение от AP ESP происходит когда station ESP соединяется с AP на другом канале. Канал меняется, а это SoftAP.
Замечено, что от AP ESP отключает только другие соединения, типа если к ней подключена другая ESP в качестве клиента или клиент на RTL871x. Гнев направляйте Espressif.
 

aloika

Active member
Отключение от AP ESP происходит когда station ESP соединяется с AP на другом канале. Канал меняется, а это SoftAP.
Это я знаю, это не то.

Вчера несколько часов был соединен свисток USB с AP и ничего не отключилось.
Сейчас еще раз проверил. Станцию ни к чему не подключаю. Подключаюсь только к АР.

1. Win10. При отсутствии обращений к страничке происходит отключение через примерно 3 минуты. "Свисток" - Realtek RTL8188EU. Пока обращения к страничке есть - соединение держится.
2. Андроид. Пока андроид не спит - соединение держится даже при отсутствии обращений к страничке. Как только засыпает - соединение пропадает. Но при пробуждении Андроид пересоединяется к АР сам, без дополнительных движений.
 

pvvx

Активный участник сообщества
1. Win10. При отсутствии обращений к страничке происходит отключение через примерно 3 минуты. "Свисток" - Realtek RTL8188EU. Пока обращения к страничке есть - соединение держится.
2. Андроид. Пока андроид не спит - соединение держится даже при отсутствии обращений к страничке. Как только засыпает - соединение пропадает. Но при пробуждении Андроид пересоединяется к АР сам, без дополнительных движений.
Поставьте старую версию SDK. У меня в винде такого не происходит и "чинить" нечего.
Тем более пора выкинуть ESP8266 на совсем. Обновлений SDK на него похоже не будет, ошибки Espressif не чинит годами, сам чип морально устарел.
ESP8266 это не рабочий вариант.
Пример - пытаюсь измерить ток и напряжение на модуле ESP-32S через INA219:
Снимок1214.gif Снимок1215.gif Снимок1216.gif
Постоянно идут дыры в приеме-передаче. Чисто, только тогда, когда нет рядом работающих других модулей WiFi. И то, даже когда ESP8266 в отельной закрытой железной коробке с роутером (AP), то и там наблюдаются большие дырки в приеме-передаче. Часто при них в лог пишет всякую китайскую лабуду с цифрами.
При рядом работающих WiFi вообще нет гарантии, что station не отвалиться до перезагрузки модуля.
Модули с ESP8266 имеют ужасно низкую защиту от внешних помех. Иногда достаточно просто ткунуть отверткой на gnd и модуль перезагружается.
На других модулях, не Espressif, таких (описанных тут) проблем нет.

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

Т.к. Espressif не дает исходников это никогда не исправят.
 
Последнее редактирование:

vad7

Active member
@aloika, андроид наверно сам переподключается, а винда не хочет, может в ней какие настройки подкрутить.
Так как инициатор соединения не esp, то в ней ничего и не подкрутишь, по известной причине...
 

pvvx

Активный участник сообщества
@aloika, андроид наверно сам переподключается, а винда не хочет, может в ней какие настройки подкрутить.
Так как инициатор соединения не esp, то в ней ничего и не подкрутишь, по известной причине...
Не в этом дело. Всё сложнее.
Берем модуль RTL00 c прошивкой AT. Соединяем с AP ESP8266.
Код:
# ATPW=3
[MEM] After do cmd, available heap 101160+21992
# ATPN=TESP8266,0123456789
RTL8195A[Driver]: set ssid [TESP8266]
RTL8195A[Driver]: start auth to 1a:fe:34:fa:39:2d
RTL8195A[Driver]: auth success, start assoc
RTL8195A[Driver]: association success(res=1)
RTL8195A[Driver]: set pairwise key to hw: alg:4(WEP40-1 WEP104-5 TKIP-2 AES-4)
RTL8195A[Driver]: set group key to hw: alg:2(WEP40-1 WEP104-5 TKIP-2 AES-4) keyid:1
Interface 0 IP address: 192.168.3.2
Time at start 102310 ms.
[MEM] After do cmd, available heap 100000+21992
#
RTL8195A[Driver]: sta recv deauth reason code(2) sta:1a:fe:34:fa:39:2d
auto reconnect ...
RTL8195A[Driver]: set ssid [TESP8266]
RTL8195A[Driver]: start auth to 1a:fe:34:fa:39:2d
RTL8195A[Driver]: auth success, start assoc
RTL8195A[Driver]: association success(res=1)
RTL8195A[Driver]: set pairwise key to hw: alg:4(WEP40-1 WEP104-5 TKIP-2 AES-4)
RTL8195A[Driver]: set group key to hw: alg:2(WEP40-1 WEP104-5 TKIP-2 AES-4) keyid:1
Interface 0 IP address: 192.168.3.2
Time at start 160168 ms.
RTL8195A[Driver]: sta recv deauth reason code(6) sta:1a:fe:34:fa:39:2d
RTL8195A[Driver]: sta recv deauth reason code(6) sta:1a:fe:34:fa:39:2d
auto reconnect ...
RTL8195A[Driver]: set ssid [TESP8266]
RTL8195A[Driver]: start auth to 1a:fe:34:fa:39:2d
RTL8195A[Driver]: auth success, start assoc
RTL8195A[Driver]: association success(res=1)
RTL8195A[Driver]: set pairwise key to hw: alg:4(WEP40-1 WEP104-5 TKIP-2 AES-4)
RTL8195A[Driver]: set group key to hw: alg:2(WEP40-1 WEP104-5 TKIP-2 AES-4) keyid:1
Interface 0 IP address: 192.168.3.2
Time at start 231224 ms.
RTL8195A[Driver]: sta recv deauth reason code(6) sta:1a:fe:34:fa:39:2d
RTL8195A[Driver]: sta recv deauth reason code(6) sta:1a:fe:34:fa:39:2d
auto reconnect ...
RTL8195A[Driver]: set ssid [TESP8266]
RTL8195A[Driver]: start auth to 1a:fe:34:fa:39:2d
RTL8195A[Driver]: auth success, start assoc
RTL8195A[Driver]: association success(res=1)
RTL8195A[Driver]: set pairwise key to hw: alg:4(WEP40-1 WEP104-5 TKIP-2 AES-4)
RTL8195A[Driver]: set group key to hw: alg:2(WEP40-1 WEP104-5 TKIP-2 AES-4) keyid:1
Interface 0 IP address: 192.168.3.2
Time at start 271227 ms
Выписал времена соединения от старта, после реконекта:
Time at start 102310 ms.
Time at start 160168 ms. - дельта 57858 ms
Time at start 231224 ms. - дельта 71056 ms
Time at start 271227 ms. - дельта 40003 ms
Time at start 314241 ms. - дельта 43014 ms
Time at start 353227 ms. - дельта 38986 ms
Time at start 393227 ms. - дельта 40000 ms
Далее соединяемся к роутеру... всё - навеки. Ранее пробовал до суток. Реконектов нет.
Вот почему ESP выкидывает RTL c такой периодичностью?
 

Sprut

New member
Поставил (1.5.2). Поведение такое же... значит, какой-то местный у меня эффект.
ну так ведь:
"Свисток" - Realtek RTL8188EU
Берем модуль RTL00 ... ESP выкидывает RTL
Андроид сам может вайфай гасить когда спать ложится, в настройках нужно порыть и отключить это если не нужно
 

Sprut

New member
RTL-ы до меня пока не дошли, разбираюсь с ESP, для меня веб-морда на мк это то, что я искал, прощайте кнопки и экранчики ))

Проблема с i2c:

Подключил по i2c датчик напряжения ina226, SCL и SDA подтянуты к VCC сопротивлениями по 9,1кОм

Подправил инициализацию в i219ws.htm:
Код:
function onOpen(evt) {
...
websocket.send("ovl$=0x245FF"); // ina226 CONFIG
И пересчёт:
Код:
function onMessage(evt) {
...
            shunt = 2; // 2 мОм, 2512 - 1Вт максимум, sqrt(1/0,002)=22,36 А максимум для сопротивления
            newval = (newval*2.5/shunt).toFixed(2); // Ток в мА, 2,5 мкВ/bit, 81,92 мВ максимум, 40,96 А предел измерения
...
            newval = (newval*0.00125).toFixed(3); // Напряжение в В, 1,25 мВ/bit, 40,96 В предел измерения, 36В предел для ina226
всё работает как надо

Но когда цепляю на шину второе устройство, просто подключаю - без инициализации, пробовал температурный датчик - si7021 и i2c pwm - PCA9685, показания сбиваются, они начинают как-то мешать обмену по i2c, в чём может быть проблема?

Пробовал менять time на 354, не помогает:
Код:
if(i2c_init(ina_pin_scl, ina_pin_sda, 54)) {    // (4,5,54); // 354
 

pvvx

Активный участник сообщества
Но когда цепляю на шину второе устройство, просто подключаю - без инициализации, пробовал температурный датчик - si7021 и i2c pwm - PCA9685, показания сбиваются, они начинают как-то мешать обмену по i2c, в чём может быть проблема?
Наверно емкости или длина проводов мешают. 9 кОм мало для проводов более 10 см и нескольких устройств на 400 кГц I2C.
RTL-ы до меня пока не дошли
Они предпочтительнее - там аппаратный I2C с DMA
 
Последнее редактирование:

aloika

Active member
Чем больше ковыряешься с ESP, тем больше возникает каких-то странных вопросов.

Вот, например:
- На основе "свалки" пытаюсь сделать тут кое-что. Добавил в проект несколько своих файлов с десятком функций и т.д. Для того, чтобы прошивка работала корректно, обязательно каждый раз после редактирования исходников нужно выполнять цель clean и только потом - all. Если сделать просто all и залить - вылетает с исключением. Приходится каждый раз по 3 минуты сидеть, ждать компиляции.

- Вот такая функция
Код:
reg_sct_bits_1(get_addr_gpiox_mux(MISO_PIN), 1<<GPIO_MUX_PULLUP_BIT, 0); // отключили PU у MISO
при запуске не срабатывает, все равно остается PU у этой ноги. А если ее запустить через какое-то время после запуска, по таймеру - срабатывает... Не могу найти, почему так.

- Про эту же функцию - она определена так (pvvx-ом):

Код:
void ICACHE_FLASH_ATTR reg_sct_bits_1(volatile uint32 * addr, uint32 bits, uint32 val)
{
    uint32 x = *addr;
    if(val == 3) x ^= bits;
    else if(val) x |= bits;
    else x &= ~ bits;
    *addr =  x;
}
Вопрос - зачем здесь volatile? А если без него, то что будет?

- Читал пример gpio_isr.c, "много думал" (с)
Почему функция-обработчик прерывания определена как static void GPIOs_intr_handler(void) ?
Я пробовал определить void ICACHE_FLASH_ATTR GPIOs_intr_handler(void) - тоже работает нормально. Но почему-то же pvvx именно так написал, какой в этом смысл, кто знает?
 

Sprut

New member
Наверно емкости или длина проводов мешают. 9 кОм мало для проводов более 10 см и нескольких устройств на 400 кГц I2C
Длина минимальная, сантиметров 5 максимум. 9кОм мало в каком смысле, номинал нужно увеличить или уменьшить? i2c устройство прижимает линию к земле и чем больше скорость обмена тем меньше должно быть сопротивление подтяжки, чтобы фронт был круче.
 

Sprut

New member
зачем здесь volatile?
volatile говорит компилятору не оптимизировать

Почему функция-обработчик прерывания определена как static void GPIOs_intr_handler(void) ?
"Чтобы не засорять проект лишними именами, рекомендуется определять функции как статические. Это делается добавлением слова static перед заголовком функции. В результате чего область
действия функции сужается и она становится доступной (видимой) только в текущем модуле (файле)." Романов Е. Л. http://ermak.cs.nstu.ru/cprog
 

aloika

Active member
"Чтобы не засорять проект лишними именами, рекомендуется определять функции как статические. Это делается добавлением слова static перед заголовком функции. В результате чего область
действия функции сужается и она становится доступной (видимой) только в текущем модуле (файле)." Романов Е. Л. http://ermak.cs.nstu.ru/cprog
Ну да, это понятно - просто сузить область видимости... А почему нет модификатора ICACHE_FLASH_ATTR ?
 

aloika

Active member
Ну вот еще из области магии:

Если объявить в начале файла глобальную переменную uint32 counter DATA_IRAM_ATTR - то нормально. А если uint8 counter DATA_IRAM_ATTR - то всё, циклическая перезагрузка. Ну вот как до этого догадаться было?
А если, кстати просто uint32 counter - то тоже нормально.
 

pvvx

Активный участник сообщества
Вопрос - зачем здесь volatile? А если без него, то что будет?
По тому, что переменная указывает на регистр, а он имеет атрибут volatile. Компилятор при этом вставляет специальные команды, типа сброса "кешей" и т.д., кроме описанного в понятии volatile для СИ.
Если читали заголовки темы - здесь не обсуждаю умения писать на СИ и прочие языки. А так-же web-свалка не является учебным пособием по языкам. Там бардак - я не проф.программист и не поддерживаю какие-либо стандартные концепции - я их использую где и когда захочу и без разбора. :)
 

sharikov

Active member
Ну да, это понятно - просто сузить область видимости... А почему нет модификатора ICACHE_FLASH_ATTR ?
Обработчик прерывания не может размещаться в FLASH, поэтому и нет модификатора.
Так происходит и-зта того что флэш кэшируется и в какой то момент код обработчика прерываний может быть вытеснен из кэша. Когда возникает прерывание оно должно быть обработано немедленно и если в кэше этого кода нет - система упадет.
Учитывайте что во флэш не могут размещаться также и все функции вызываемые из обработчика прерываний.
 

aloika

Active member
Обработчик прерывания не может размещаться в FLASH, поэтому и нет модификатора.
Так происходит и-зта того что флэш кэшируется и в какой то момент код обработчика прерываний может быть вытеснен из кэша. Когда возникает прерывание оно должно быть обработано немедленно и если в кэше этого кода нет - система упадет.
Учитывайте что во флэш не могут размещаться также и все функции вызываемые из обработчика прерываний.
А не подскажете, где про это можно почитать подробнее?

Проблема в том, что если убрать модификатор у обработчика прерывания и из всех вложенных функций, то система валится сразу после запуска. Видимо, что-то куда-то не влезает.

Как тогда нужно делать? У меня идея пока такая - по прерыванию устанавливать флаг, а по таймеру проверять наличие этого флага. И если флаг есть, то уже выполнять то, что надо в прерывании. Так нормально будет?
 
Последнее редактирование:
Сверху Снизу