27 МОСКОВСКАЯ ВСТРЕЧА
Форум самогонщиков Сайт Барахолка Магазин 27 МОСКОВСКАЯ ВСТРЕЧА

WEB интерфейс к HelloDistiller на ESP8266

Форум самогонщиков Автоматика
1 ... 19 20 21 22 23 24 25 ... 45 22
Phisik Куратор Екатеринбург 688 1.5K
Отв.420  21 Дек. 20, 12:10
ЗЫ Я здесь новичек.Andy117, 21 Дек. 20, 08:31
Просто вам дают время поразбираться самостоятельно, а то народ чуть чего бежит сразу спрашивать, вместо того, чтобы монтаж проверить.

ЕСП на борту с мегой не работает. Много раз уже об этом писали.

Подключите ЕСП просто к компьютеру и посмотрите, что она там шлет в UART. Можете ей пинг попосылать и посмотреть ответ.

Может у вас просто связи нет, плавающий контакт и т.п. Поэтому и кнопки не работают и пинга нет. Скорость убавьте до 9600.
Andy117 Бакалавр Новосибирск 74 46
Отв.421  21 Дек. 20, 17:53
ЕСП на борту с мегой не работает.Phisik, 21 Дек. 20, 12:10
Уже понял. Заменил пока на Wemos D1.
Подключите ЕСП просто к компьютеру и посмотрите, что она там шлет в UART. Можете ей пинг попосылать и посмотреть ответ.Phisik, 21 Дек. 20, 12:10
Попробую конечно. Но вроде как если поставить MQTT_SERIAL_PING_CHECK 1 и MQTT_DEBUG 1, то видно что передает, что принимает.
Одновременно можно все действия понять глядя в mqtt.cpp
Это периодическая посылка данных MEGA -> ESP:
[MQTT][MEGA] Sent: lcd1=D9 N=   0 O=   0
[MQTT][MEGA] Sent: lcd2=Dt=   0 It=   0
[MQTT][MEGA] Sent: IspReg=101
[MQTT][MEGA] Sent: StatMachine=0
[MQTT][MEGA] Sent: DDopInfo=0
[MQTT][MEGA] Sent: t_kub=230
[MQTT][MEGA] Sent: t_col=0
[MQTT][MEGA] Sent: t_tsa=0
[MQTT][MEGA] Sent: work_time=00:09:18


Это я кнопку вправо нажал в Вебе и ЕСП передала ее Меге
[MQTT][MEGA] Rcvd: keystrokes=R

Т.е. обмен идет нормально
Но вот
[INFO][MEGA] Starting ping-pong UART test. Sending ping...

Ага, это в функции void handleMqttSerial() (Получение данных от ESP):
if (millis() - lastUartSendPingTime > pingPeriod) {
#if MQTT_DEBUG
 DEBUG_SERIAL.println(F("[INFO][MEGA] Starting ping-pong UART test. Sending ping..."));^M
#endif // MQTT_DEBUG
 lastUartSendPingTime = millis();
 MQTT_SERIAL.println("ping");
}
По таймеру (const int pingPeriod = 14444) пора посылать сообщение "ping" и ждать на него ответ.

А ответа нет. Нет уже 2 минуты.
Тогда переинициализируется UART.

if (millis() - lastUartRcvPingTime > 123456L) {
lastUartRcvPingTime = millis();
MQTT_SERIAL.begin(MQTT_SERIAL_BAUDRATE, MQTT_SERIAL_MODE);
DEBUG_SERIAL.println(F("[WARN][MEGA] MQTT UART seems to lost connection. Reinitializing UART..."));
}

Т.е. остальной обмен идет в обе стороны и может продолжаться несколько часов. А ответ на "ping" так ни разу и не пришел.
Хотя мы ждем
// answer to ping from ESP
if (strncmp_P(uartBuffer, PSTR("ping"), MQTT_BUFFER_SIZE) == 0) {
#if MQTT_DEBUG
 DEBUG_SERIAL.println("[INFO][MEGA] Ping was received. Sending pong...");
#endif // MQTT_DEBUG
 lastUartRcvPingTime = millis();
 MQTT_SERIAL.println("pong");
 currentIndex = 0;
 break;
}

И черт бы с ним, если бы все это работало. Но оно через неопределенное время виснет. По крайней мере имею в виду себя. Точнее виснет на уровне ESP->MQTT, а через некоторое время и Веб. Хотя Мега при этом и железные кнопки работают. Было бы хуже, если наоборот.
Разбираться кто там и что, тем более, что код для ESP закрыт, не хочется.
Тем более, что можно применить пусть не решение, ugly hack - отловить момент зависона ЕСП и ресетнуть его. Благо поднимается он за несколько (6-8) секунд и на основной процесс не влияет. Но управлять с дивана приятнее Смеющийся
Вот для этого и хотел убедиться, что действительно на "ping" должен прийти ответ.
Я уже и без возврата каретки (\n) ловил, и "pong" вместо "ping". Хотя посмотрел в двоичном файле прошивки, ping есть, pong'а нет.

ЗЫ Завернул все в спойлер, чтоб такая портянка глаза не мозолила, но все моргать стало. Видно не любит много вложенностей. Убрал, не моргает, но все видно
Phisik Куратор Екатеринбург 688 1.5K
Отв.422  21 Дек. 20, 18:48, через 55 мин
Спасибо за исследование. Отключите MQTT_SERIAL_PING_CHECK 0. Глянул свой код - я его отключил, т.к. все равно не помогает.
#define MQTT_PING_CHECK 0 // Send ping-pong messages over serial, deprecated, does not help
#define MQTT_SERIAL_CHECK 1 // Added 23-02-2020: Reboot if there are no data from serial for 5 mins
Никто вам не мешает вывести свободный пин на reset ESPшки и дергать ею каждые 15-30 минут. Я не видел чтобы отваливался MQTT. Там стандартные библиотеки для работы с ним. Скорее всего глючные. Но за 2 годы вы первый кто с этим столкнулся. Попробуйте антенну припаять. Может просто вай-фай слабый. Поменяйте ЕСПшку - бывает у них иногда вай-фай просто отваливается намертво.
mosjka1 Бакалавр Koblenz 50 5
Отв.423  21 Дек. 20, 19:17, через 30 мин
у тебя Период шим 600 секунд, т.е. клапан голов должен включаться раз в 10 минут на 2 секунды(-200). Это для отбора "периодикой". Ты ждал 10минут?limon, 20 Дек. 20, 19:39

Теперь все понятно и работает как надо. Спасибо

Вот мой синхрофазотрон Улыбающийся
16085674105174391700913003381444.jpg
16085674105174391700913003381444. WEB интерфейс к HelloDistiller на ESP8266. Автоматика.
Mim Кандидат наук Ульяновск 438 71
Отв.424  21 Дек. 20, 19:37, через 20 мин
ДобрыйMim, 14 Дек. 20, 23:54
кажется допёрло)) по аналогии))) в меню setting-редактирование меню настроек- сменить 0 на 1. Извиняйте ,только учусь!)
mosjka1 Бакалавр Koblenz 50 5
Отв.425  23 Дек. 20, 03:10
что не так, почему не отображается "PowDistil"? В настройках указанно 3060 Вт.

Unbenannt.PNG
Unbenannt. WEB интерфейс к HelloDistiller на ESP8266. Автоматика.
сообщения удалены (4)
Andy117 Бакалавр Новосибирск 74 46
Отв.426  23 Дек. 20, 12:16
Поставил антену, наметился прогресс - отвалы MQTT стали стабильными, примерно раз в 2 часа. При этом постмортемная картика показывает нехватку памяти.
MQTT low memory freeze-2.png
MQTT low memory freeze-2. WEB интерфейс к HelloDistiller на ESP8266. Автоматика.

Да и так смотрю в Вебе ползунок доступной памяти как песочные часы, движется медленно, но уверенно. Memory leak? Но почему у других нет?
Может это в незарегистрированной версии не все процедуры отрабатываются?
Попрошу ключик, хотя нет уверенности, что капитально собирать буду на этом железе.
сообщение удалено
Phisik Куратор Екатеринбург 688 1.5K
Отв.427  23 Дек. 20, 12:23, через 7 мин
почему не отображается "PowDistil"?mosjka1, 23 Дек. 20, 03:10
Потому что на первой странице отображаются только статусы, а не настройки. esp/status. можешь через пользовательский параметр передать, только зачем, если сверху есть фильтр настроек.

Добавлено через 2мин.:

Memory leak?Andy117, 23 Дек. 20, 12:16
Не замечал. Работало сутками без отвалов.

Добавлено через 2мин.:

Может это в незарегистрированной версии не все процедуры отрабатываются?Andy117, 23 Дек. 20, 12:16
MQTT никак не ограничен. Возможно пакеты теряются, а она ждет пока они вернуться и хранит их в памяти. Попробуй другую есп-шку. За 2 года ни у кого таких проблем не было.

Поиграйся с QoS может поможет... Попробуй другой сервер, может твоя сборка москиты кривая
сообщение удалено
Phisik Куратор Екатеринбург 688 1.5K
Отв.428  23 Дек. 20, 13:05, через 43 мин
Да, вот еще. Можно esp/crash-log глянуть, возможно там яснее станет почему она падает.
Andy117 Бакалавр Новосибирск 74 46
Отв.429  23 Дек. 20, 13:10, через 5 мин
MQTT никак не ограничен. Возможно пакеты теряются, а она ждет пока они вернуться и хранит их в памяти. Попробуй другую есп-шку. За 2 года ни у кого таких проблем не было.Phisik, 23 Дек. 20, 12:23
ESP испробовал 2 совершенно разные. А утечки могут быть в другом месте.
Ну, на примере файловых операций - открыл файл, поработал, закончил работать (закрыл). Все работает. В демо вставил проверку лицензии. Открыл файл, отказал пользователю в работе. А так как не было окончания работы, то и процедура закрытия вызвана не была, а ресурс не освобожден. Типа того.
Очень похоже. Потому как в Вебе мало памяти, он повис, часы не идут. Но обмен с сервером MQTT идет. Т.е. сеть есть, MQTT работает, данные для посылки оттуда то беруться (скорее всего и с Мегой связь есть). Эх, надо в следующий раз в такой момент по MQTT вручную пообмениваться, кнопки для индикации понажимать. Причем это длиться может минут 5-40. Потом, скорее всего, и на обмен уже сил не хватает и дальше отвал по таймауту.

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

Добавлено через 8мин.:

А резистор в цепи антенного разьема перепаял?skuzmi, 23 Дек. 20, 12:56
Нет, но у меня есть штатное гнездо под антену и антена со штатным разъемом. Вряд ли его ставили туда пихать, коли что то перепаивать нужно было.
Работать стало НАМНОГО лучше. На уровне отдельной ESP.
Это, кстати, к вопросу о глючности роботдиновской связки MEGA+ESP. Многие, в том числе и я, работали с ней как есть, без антены. И ловили глюки.
Сейчас переключаю с внутренней на внешнюю ESP - разницы нет.
Надо будет для интереса уровень сигнала на них посмотреть, если есть чем.
Phisik Куратор Екатеринбург 688 1.5K
Отв.430  23 Дек. 20, 13:24, через 15 мин
Работать стало НАМНОГО лучше.Andy117, 23 Дек. 20, 13:10
Я еще раз повторю, в 100000 раз наверно. Я пробовал всячески эти спаренные модули. Они не работают! что с антенной, что без. Там отваливается вай-фай. Неконтролируемо. Потеря пакетов идет.

Надо брать обычный NodeMCU и с ним все работает
Andy117 Бакалавр Новосибирск 74 46
Отв.431  23 Дек. 20, 13:34, через 10 мин
Надо брать обычный NodeMCU и с ним все работаетPhisik, 23 Дек. 20, 13:24
Переключаюсь на Wemos D1, отдельная плата и она под рукой. Но на ней было то же самое.
ESP-12F в пути.

Сейчас как раз завис, памяти 5,4К.
Отправил запрос:
mosquitto_pub -d -q 2 -h ${SERVER} -t '/esp/mod/keystrokes' -m "R"

В Вебе, естесственно, ничего. А вот на LCD экране сменился экран на следующий. Сеть работает, MQTT пока тоже.
Phisik Куратор Екатеринбург 688 1.5K
Отв.432  23 Дек. 20, 13:37, через 3 мин
Переключаюсь на Wemos D1, отдельная плата и она под рукой. Но на ней было то же самое.Andy117, 23 Дек. 20, 13:34
Может еще с роутером проблема? Был один роутер, с которым работать не хотели еспшки
сообщение удалено
Andy117 Бакалавр Новосибирск 74 46
Отв.433  23 Дек. 20, 16:11
Может еще с роутером проблема? Был один роутер, с которым работать не хотели еспшкиPhisik, 23 Дек. 20, 13:37
Спасибо за ключ. Вввел, перегрузил. Третий час работает без зависонов. Память как примагничена к 23,1кВ - чуть отойдет в сторону и снова возвращается.
Похоже я был прав по поводу причин зависаний.
Ладно, едем дальше.
Phisik Куратор Екатеринбург 688 1.5K
Отв.434  23 Дек. 20, 16:28, через 17 мин
Похоже я был прав по поводу причин зависаний.Andy117, 23 Дек. 20, 16:11
Если в дальнейшем подтвердиться, то мой косяк Улыбающийся
serjrv Кандидат наук Камышин 382 205
Отв.435  23 Дек. 20, 23:43
Phisik, я конечно не знаю как у тебя реализовано, но есть такой момент с ESP`шками (точнее с кривыми библиотеками) - если нет коннекта, будут проблемы. На ESP32 делаю так:
if (WiFi.status() == WL_CONNECTED && ConnectMQTT()) SendDataMQTT(); // собственно передача
В функуции ConnectMQTT() проверяю не отвалились ли от MQTT сервака, если отвалились "if (!mqttclient.connected())" делаем переподключение, и только в удачном случае с подключением закидываем данные в буфер для передачи, как собственно и саму передачу.
Andy117 Бакалавр Новосибирск 74 46
Отв.436  24 Дек. 20, 04:44
Если в дальнейшем подтвердиться...Phisik, 23 Дек. 20, 16:28
10 часов без зависа.
Phisik Куратор Екатеринбург 688 1.5K
Отв.437  24 Дек. 20, 11:15
я конечно не знаю как у тебя реализовано, но есть такой момент с ESP`шкамиserjrv, 23 Дек. 20, 23:43
Я использую AsyncMqttClient, там в момент отвала должно событие приходить в обработчик. Я его как-то обрататываю. Я точно не помню сейчас уже, но оно вроде нормально реконнектилось.
Обработчик ошибок
void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {
   DEBUG_TS_PRINTLN(F("[INFO] Disconnected from MQTT server"));

   String strReason;
   switch (reason) {
   case AsyncMqttClientDisconnectReason::TCP_DISCONNECTED:
      strReason = "TCP_DISCONNECTED";
      break;
   case AsyncMqttClientDisconnectReason::MQTT_UNACCEPTABLE_PROTOCOL_VERSION:
      strReason = "MQTT_UNACCEPTABLE_PROTOCOL_VERSION";
      break;
   case AsyncMqttClientDisconnectReason::MQTT_IDENTIFIER_REJECTED:
      strReason = "MQTT_IDENTIFIER_REJECTED";
      break;
   case AsyncMqttClientDisconnectReason::MQTT_SERVER_UNAVAILABLE:
      strReason = "MQTT_SERVER_UNAVAILABLE";
      break;
   case AsyncMqttClientDisconnectReason::MQTT_MALFORMED_CREDENTIALS:
      strReason = "MQTT_MALFORMED_CREDENTIALS";
      break;
   case AsyncMqttClientDisconnectReason::MQTT_NOT_AUTHORIZED:
      strReason = "MQTT_NOT_AUTHORIZED";
      break;
   case AsyncMqttClientDisconnectReason::ESP8266_NOT_ENOUGH_SPACE:
      strReason = "ESP8266_NOT_ENOUGH_SPACE";
      break;
   case AsyncMqttClientDisconnectReason::TLS_BAD_FINGERPRINT:
      strReason = "TLS_BAD_FINGERPRINT";
      break;
   default:
      break;
   }
   // Log only first 3 errors to save syslog from error flood
   if(mqttErrorCnt<3) {
      SYSLOG_PRINTLN(String(F("[INFO] Потеряно соединение с MQTT сервером. Код ошибки: ")) + strReason);
      mqttErrorCnt++;
      if(mqttErrorCnt>2) {
         SYSLOG_PRINTLN(F("[INFO] Запись ошибок MQTT прекращена до следующего успешного соединения."));
      }
   }    

   if (WiFi.isConnected() && bMqttEnabled) {
      mqttReconnectTimer.once(2, __connectToMqtt);
   }
}
Лог реконнекта24-12-20 13:21:58> [INFO] Потеряно соединение с MQTT сервером. Код ошибки: TCP_DISCONNECTED
24-12-20 13:22:00> [INFO] Пытаемся подключиться к MQTT серверу: broker.hivemq.com
24-12-20 13:22:00> [INFO] Соединение с MQTT сервером установлено!
Это, конечно, не исключает кривой библиотеки, которая не присылает событие в обработчик...
serjrv Кандидат наук Камышин 382 205
Отв.438  24 Дек. 20, 21:47
Phisik, глянул мельком библиотеку AsyncMqttClient, сильно конечно не разбирался, но один напряжный момент с пере подключение к WiFi в примерах бросился в глаза:
Исходный вариант
void connectToWifi() {
  Serial.println("Connecting to Wi-Fi...");
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
}
как минимум надо так:
Модификация
void connectToWifi() {
  Serial.println("Connecting to Wi-Fi...");
  WiFi.disconnect(true);
  WiFi.mode(...); // ... - WIFI_AP_STA или WIFI_STA (в зависимости какой режим нужен)
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
}
Т.е. надо предварительно очистить структуру данных и убить ранее созданный класс, а затем уже создавать новый: WiFi.begin(...).
Есть еще такие функции: WiFi.reconnect() - переподключение с убитием старого класса но старой структурой, или WiFi.setAutoReconnect(true) - автоматическое пере подключение.

p.s. Если надумаешь попробовать функцию WiFi.setAutoReconnect(true), обязательно проверь на утечку памяти. В старых версиях SDK для ESP8266 точно работала, по крайней мере рулежка фито-светом с ней в аквариуме работает без глюков уже лет 5. А вот в новом проекте на ESP32 данная функция вызывает утечку памяти, так что приходится как выше описывал пере подключаться.

Добавлено через 1ч. 33мин.:

И к стати боюсь я прав, судя по первому твоему посту и уточнением про "Особенности работы с wifi". Так что попробуй мой вариант. Если проблема останется, можно будет более детально по разбираться.

Добавлено через 3мин.:

Забыл уточнить, WiFi.reconnect() вызывается каждый раз при пропадании связи, а WiFi.setAutoReconnect(true) один раз при удачном подключении к домашней WiFi сети.
Phisik Куратор Екатеринбург 688 1.5K
Отв.439  25 Дек. 20, 11:20
WiFi.setAutoReconnect(true), обязательно проверь на утечку памяти.serjrv, 24 Дек. 20, 21:47
Утечек вроде бы нет в нормальном режиме работы. Видимо проблема с пустым ключем где-то. Вчера попробовал - в демо режиме действительно память улетает. Но где - сходу не нашел.
Если надумаешь попробовать функцию WiFi.setAutoReconnect(true)serjrv, 24 Дек. 20, 21:47
С WiFi я долго экспериментировал. То ли у меня чипы не удачные, то ли чего. Но добиться стабильной работы я не смог. По итогу я добавил библиотеку AsycPing и каждые 5 минут проверяю коннет до шлюза с перезапуском WiFi или всего чипа, при отсутствии связи.
Текущая инициализация WiFi (если интересно)
bool ICACHE_FLASH_ATTR setupWiFi() {
   DEBUG_TS_PRINTLN(F("[INFO] Starting WiFi initialization"));
   
   // Drop all connections on reset
   WiFi.disconnect(true);
   WiFi.mode(WIFI_OFF); // Turn transmitter off
   delay(1000);           //   Wait a while

   // Disable saving wifi config into SDK flash area
   WiFi.persistent(false);      

   if (wifiMode == WIFI_MODE_STA) {
      WiFi.mode(WIFI_STA);
      
      if (ipType == IP_TYPE_STATIC) {
         // Disable auto connect features, sometimes it resulted in some bugs - static ip gets lost on reconnect
         WiFi.setAutoConnect(false);
         WiFi.setAutoReconnect(false);

         DEBUG_TS_PRINT(F("[INFO] Setting up static IP... "));
         bool result = WiFi.config(stationIP, stationGw, stationMask, stationGw, IPAddress(8, 8, 8, Крутой);
         DEBUG_PRINTLN(result ? "Done" : "Failed");
      } else {
         // Set DHCP mode explicitly in case when we have just switched from static IP
         WiFi.config(0u, 0u, 0u);
      }
      WiFi.begin(ssid, password);
      WiFi.hostname(hostname);

      // Enable reconnect only, don't write anything to flash
      WiFi.setAutoReconnect(true);

      // Inform user we are trying to connect
      DEBUG_TS_PRINTF_P(PSTR("[INFO] Trying to connect to \"%s\" with pass \"%s\""), ssid, password);

      // Wait until we connect or timeout pass
      unsigned long startTime = millis();
      while (WiFi.status() != WL_CONNECTED && millis() - startTime < 30000) {
         DEBUG_PRINT(F("."));
         delay(500);
      }

      // We now out of the while loop, either time is out or we connected
      if (WiFi.status() != WL_CONNECTED) {
         DEBUG_PRINTLN(" Failed!");
         return false;
      }

      DEBUG_PRINTLN(" Connected!");

      DEBUG_TS_PRINT(F("[INFO] Client IP address: "));
      DEBUG_PRINTLN(WiFi.localIP());
      DEBUG_TS_PRINT(F("[INFO] Station MAC address: "));
      DEBUG_PRINTLN(WiFi.macAddress());
      DEBUG_TS_PRINT(F("[INFO] DNS Server: "));
      DEBUG_PRINTLN(WiFi.dnsIP());
      DEBUG_TS_PRINT(F("[INFO] RSSI: "));
      DEBUG_PRINT(WiFi.RSSI());
      DEBUG_PRINTLN(F(" dBm"));

      wifiReconnectNum++;

   }   else { // if (wifiMode == WIFI_MODE_STA)
      WiFi.setAutoConnect(true);
      WiFi.mode(WIFI_AP);
      
      //    Set factory defaults manually in case when we have just switched from static IP
      WiFi.softAPConfig(IPAddress(10,0,0,1), IPAddress(10,0,0,1), IPAddress(255,255,255,0));

      WiFi.softAP(ssid, password);
      WiFi.hostname(hostname);
      
      WiFi.setAutoReconnect(true);

      DEBUG_TS_PRINT(F("[INFO] AP SSID: "));
      DEBUG_PRINTLN(ssid);
      DEBUG_TS_PRINT(F("[INFO] AP IP address: "));
      DEBUG_PRINTLN(WiFi.softAPIP());
      DEBUG_TS_PRINT(F("[INFO] AP MAC address: "));
      DEBUG_PRINTLN(WiFi.softAPmacAddress());
   } // if (wifiMode == WIFI_MODE_STA)

   // Setup MQTT client
   // We do it here since mqtt uart baud rate & credentials could be changed in settings will be applied on wifi restart
#if MQTT_ENABLED
   setupMqtt();
#endif

   enableWebServices();

   return true;
}