веб-сервер arudino слишком медленный — возможно, использует очередь?

#arduino #i2c #esp8266

#arduino #i2c #esp8266

Вопрос:

Я реализовал базовый контроллер освещения для выключателей Livolo, используя ESP8266, на котором работает веб-сервер, и библиотеку, которую я нашел для коммутаторов livolo, использующих передатчик RF433.

у меня нет никаких проблем с кодом как таковым.. (и я могу опубликовать его, если требуется) веб-сервер прослушивает запрос, а затем вызывает функцию для отправки сигнала rf433 (что занимает около 2 секунд — поскольку протокол livolo в основном повторяет одно и то же 100 раз).).

проблема в том, что веб-сервер / весь arduino / esp8266 «блокируется» во время отправки радиосигнала — на срок до 2 секунд.

если я просто прослушиваю веб-сервер и, скажем, просто записываю строку в последовательный отладчик, она молниеносно … может многократно повторять ее раз в секунду.

обычно это нормально, но система домашней автоматизации, которая отправляет веб-запросы, с которыми я работаю, не ждет.. итак, если он отправляет, скажем, 10 запросов подряд (выключите все индикаторы), мой маленький веб-сервер в основном не может идти в ногу, поскольку esp8266 занят радиовещанием, он отстает, а затем система, отправляющая запросы, получает ошибки сокета.. к сожалению, я не могу изменить систему, которая отправляет.

я попытался реализовать как базовую очередь FIFO, но, по сути, возникает та же проблема. Мне интересно, не лучше ли реализовать два arudino (esp8266) с промежуточной шиной типа i2c? один веб-сервер может принимать запросы и помещать их в очередь, а другой может лениво считывать очередь и выполнять отправку RF…

мне было интересно, есть ли у кого-нибудь предложения по а) это правильный путь? б) какую шину я должен использовать между аппаратными средствами .. в) любой пример реализации удаленного чтения очереди?

любые мысли с благодарностью.. я могу поделиться кодом с веб-сервером и т.д., если требуется, но это довольно простая реализация веб-сервера arudino esp8266, и это не совсем то, где я застрял.. я думаю, меня больше интересует пример кода, который показывает, что один элемент оборудования считывает очередь, реализованную на другом, если это имеет смысл?

Комментарии:

1. возможно, вы сможете использовать разделительную плату gpio для обработки радиочастотной отправки таким образом, чтобы не перегружать esp, но 2-й esp (особенно 01) был бы дешевле и работал бы очень хорошо: «двухъядерный» дизайн.

2. спасибо за предложение.. да, у меня начали отказывать 2 чипа по сравнению с i2c.

Ответ №1:

ESPAsyncWebServer был создан именно для этой цели — он обрабатывает все веб-запросы асинхронно и очень быстро. Я могу запрашивать свои локальные устройства (а также бесчисленные производственные устройства) 10-20 раз в секунду без проблем в течение нескольких дней. Я, например, запрашиваю данные о питании переменного тока в своем основном цикле и предоставляю сохраненные данные через веб-сервер. Запрос данных может занимать столько времени, сколько требуется через UART (обычно ~ 500 мс), но веб-запросы всегда будут обслуживаться, как только они поступят

Пусть основной цикл запускает логику RF и сохраняет данные как глобальные (или эквивалентные), и пусть веб-сервер просто отправляет сохраненное значение клиенту

Комментарии:

1. это звучит именно так, как я хочу.. Я проверю это, спасибо!

Ответ №2:

Я могу придумать два решения

1) Прерывания

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

2) Два устройства (с прерываниями!)

Подключите два Arduino по шине i2c. Первый будет прослушивать входящие веб-запросы, а затем связываться со вторым для выполнения заданной команды (по шине i2c). Второй будет использовать прерывания для прослушивания входящих команд. Прерывание добавит каждую команду в очередь, и основной цикл программы выполнит самую последнюю команду.

Комментарии:

1. спасибо, я начал использовать 2 esp8266, используя i2c, один ведущий и другой подчиненный, а затем узнал, что esp8266 не может быть подчиненным.. итак, я использовал Arduino nano в качестве ведомого устройства, а затем с трудом передавал данные между двумя.. Я думаю, я попробую ESPAsyncWebServer, предложенный ниже, если это сработает, проблема решена на одном чипе .. если нет, похоже, либо на 2 чипа с i2c, либо дождитесь Esp32, который решит все эти проблемы 🙂