• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Разработка ‘библиотеки’ малого 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, поэтому и нет модификатора.
Так происходит и-зта того что флэш кэшируется и в какой то момент код обработчика прерываний может быть вытеснен из кэша. Когда возникает прерывание оно должно быть обработано немедленно и если в кэше этого кода нет - система упадет.
Учитывайте что во флэш не могут размещаться также и все функции вызываемые из обработчика прерываний.
А не подскажете, где про это можно почитать подробнее?

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

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