#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, который решит все эти проблемы 🙂