esp32: wifi + bluetooth classic
- Войдите на сайт для отправки комментариев
Пнд, 08/08/2022 - 18:23
Есть работающий проект на ESP-WROOM-32 (ESP32 DEVKITV1). Устройство успешно соединяется с нейрогарнитурой через библиотеку BluetoothSerial (1.6.0), получает и обрабатывает от неё пакеты, реализует обратную связь с пользователем. Всё работает прекрасно. Но когда я решил прикрутить библиотеку WifiManager чтобы поднять телеграм-бота, выяснилось, что wifi падает сразу после создания объекта BluetoothSerial.
Это я где-то туплю, или можно как-то сделать без привлечения дополнительных модулей, вроде HC-05, HC-06?
ПатамушО у блюпупа приоритет, йоптэ!
Про это я где-то читал. А как лечить то? Вроде как-то в menuconfig можно выбрать настройки совместного использования, это поможет? И как воспользоваться menuconfig-ом, я просто только arduino-ide пока что пользовался...
P.S.: Имелась в виду версия прошивки, в которую входит BluetoothSerial - 1.0.6, опечатался.
О, попробую заюзать esp_coex_preference_set(SW_COEXIST_PREFERENCE_BALANCE) ...
Пробуй, пробуй и ещё раз пробуй. Нам только отпиши, чодакак.
Попробовал esp_coex_preference_set(ESP_COEX_PREFER_BALANCE);. Ноль реакции. Вот как это выглядит в логах, сразу после создания объекта BluetoothSerial вылазит "WIFI_REASON: 200":
E (64) psram: PSRAM ID read error: 0xffffffff
*wm:[1] AutoConnect
*wm:[2] ESP32 event handler enabled
*wm:[2] Setting Hostnames: nfm
*wm:[2] Setting WiFi hostname
*wm:[2] Connecting as wifi client...
*wm:[2] setSTAConfig static ip not set, skipping
*wm:[1] Connecting to SAVED AP: zenbooster
*wm:[1] connectTimeout not set, ESP waitForConnectResult...
*wm:[2] Connection result: WL_CONNECTED
*wm:[1] AutoConnect: SUCCESS
*wm:[2] Connected in 2927 ms
*wm:[1] STA IP Address: 192.168.1.134
The device started in master mode, make sure remote BT device is on!
*wm:[2] [EVENT] WIFI_REASON: 200
*wm:[2] [EVENT] WIFI_REASON: 200
*wm:[2] [EVENT] WIFI_REASON: 200
*wm:[2] [EVENT] WIFI_REASON: 201
*wm:[2] [EVENT] WIFI_REASON: NO_AP_FOUND
*wm:[2] [EVENT] WIFI_REASON: 201
*wm:[2] [EVENT] WIFI_REASON: NO_AP_FOUND
*wm:[2] [EVENT] WIFI_REASON: 201
*wm:[2] [EVENT] WIFI_REASON: NO_AP_FOUND
*wm:[2] [EVENT] WIFI_REASON: 201
*wm:[2] [EVENT] WIFI_REASON: NO_AP_FOUND
Новые данные!
Я сделал минимальный пример для воспроизведения проблемы. Если на вайфай поднять простой вэбсервер, он работает. Если поднять телеграм бота, то проблема воспроизводится. Как свет дадут - запощу )
BOT_TOKEN и CHAT_ID надо только заполнить...
Т.к. успевает вызваться только
- то видимо, дело в WiFiClientSecure ...
Продолжай докладывать обстаканофку!!!
Продолжай докладывать обстаканофку!!!
А всё, приплыли. Помогайте ) Подозреваю (судя по прочитанному на форумах, коментах, стэкэксченчжах, не помню где...), что проблема решена в прошивке версии 2.0+, но на этих прошивках только блютус-slave работает, а мастер - нет.
Самое главное - модуль к вифи подключается нормально?
Если ДА - ищите ветку от paha с ботом. Я от-туда сериал под телеграмм делал. Около года тестовый модуль работает без сбоев.
В том то и дело, что от вифи отваливается...
Чего то не нашёл...
https://esp8266.ru/forum/threads/deljus-opytom-prostoj-telegram-bot-bez-...
Нашёл.
Перед командой боту - вифи.бегин.
Как вариант перед работой вифи выключить блютуз, а после включить.
надо подписаться пожалуй
https://esp8266.ru/forum/threads/deljus-opytom-prostoj-telegram-bot-bez-biblioteki.5490/
Нашёл.
Попробовал. Post - метод возвращает -1, если попробовать отправить сообщение от имени бота после вызова BluetoothSerial::begin. Если отправлять до этого вызова - работает.
Перед командой боту - вифи.бегин.
Как вариант перед работой вифи выключить блютуз, а после включить.
По поводу вифи.бегин - я пробовал инициализировать вифи после инициализации синезуба - так тоже не работает.
Выключить блютуз... У меня устанавливается соединение с гарнитурой от 3 до 5 секунд, а сама гарнитура постоянно шлёт пакеты, раз в секунду. Если выключать блютуз, раз в секунду пакеты принимать не получится...
Пока всё ровно, на одну антенну одновременно не могут работать и передатчик и приемник.
WebServer с BlueToothSerial работает.
О! Это уже радует. Тоесть можно обменяться пакетами данных одновременно и по бп и вифи?
Может можно и второй АЦП запустить с вифи???
могут, в сотовом жеж работают, нужен циркулятор, он там есть (в сотовом телефоне)
Дома ещё раз проверю, будет ли работать вэбсервер при активном обмене данными по блютуз. Пока что проблема возникает, если обмен по вайфай происходит с использованием ssl...
ua6em --- ты сам то хоть понял, что сказал?
более чем!
Ща до компа доберусь - объясню.
Кстати, решением проблемы могла бы быть реализация класса WiFiClientSecure без использования ssl api. Надо будет прикинуть, насколько это реально...
Проверил. Поднял webserver, страницы загружаются, пакеты от гарнитуры приходят!
Нашел реализацию бота на SSLClient для ардуины. Попробую прикрутить...
Оффтоп: я хочу всё собрать в герметичной коробке. Внутри плата, динамик, аккум 18650 и приемник беспроводной зарядки. Будет кнопка ещё антивандальная с подсветкой rgb. Динамик будет в нужные моменты воспроизводить белый шум, и возможно сигналы от интервального таймера. Как сделать, чтоб и динамик было слышно, и в ванну (к примеру) можно было уронить без последствий? Может динамик от старой мобилы к стенке корпуса приделать... Хотя может и обычного из бт колонки хватит...
есть "вибрационные динамики" (хз как точее определить), т.е. которые крепяться к почти любой поверхности и сама поверхность уже выводит звук. может вам такой надо прикпрепить на внутренюю сторону коробки ?
Думал об этом. Они могут нормально шум воспроизводить? И есть ли компактные варианты?
О, круто, вроде такого:
https://youtu.be/QCx-2N6-qLM
Или вот, ещё лучше:
Попробовал завести AsyncTelegram2 на SSLClient через WiFiClient. Завелось на половину. В общем данные ходят в обоих направлениях, но видимо есть какой-то баг в либе бота ) Когда я делаю sendto из сетапа, сообщение доходит до телеги и я его вижу. Когда я отправляю сообщение из телеги, я его вижу только в логах. Т.е. либа его получает, пытается распарсить, но getNewMessage или как там его, говорит, что ничего не пришло. Причем сам текст, который отправлял - вижу в логах.
Главное, обходной путь найден )
Покидал файлы отсюда:
https://github.com/cotestatnt/AsyncTelegram2/tree/master/src
в папку со скетчем, что бы сделать вывод в serial нужных значений в нужных местах. Подключил заголовки через
а оно работает! Сделал как было (удалил исходники либы из папки со скетчем), всё равно работает.
В ide установлена версия 2.1.3. При этом github говорит: "master is up to date with all commits from 2.1.3.".
Правда перед этим в ide плату ещё пришлось поменять с dev на wrover, что-то там перестало собираться...
В общем вывод такой, что проблему вызывает ssl api, которое использует WiFiClientSecure, или то, как он это api использует. А может BluetoothSerial тоже использует, но как-то не так.
А SSLClient работает! )
P.S.: На самом деле, включив отладочные сообщения, подозреваю, что WiFiClientSecure просто не хватало памяти, а SSLClient потребляет памяти меньше...
Думал об этом. Они могут нормально шум воспроизводить?
если вы не оговорите более четко что есть "шум" - ответ да. Ведь шум - это и отбойный мотолок и шуршшание мыши в сене. Уж какой-нибудь звук динамик произведет наверняка:)
- Некое подобие белого шума, необязательно чтоб он прям строго математически был белым. Достаточно, что бы просто было шипение...
Пришлось ещё повозиться, чтоб разнести код BT и wifi в разные потоки. Хотел сначала, чтоб вэбсервер крутился в своём потоке, а бот в своём. В итоге так не получилось, ни с AsyncWebServer ни просто с WebServer. Пробовал даже на семафорах разделять доступ к использованию wifi...
Получилось, когда завёл отдельный поток для wifi вообще. Т.е. вся инициализация происходит в основном потоке, а обработка новых подключений к вэбсерверу, проверка новых сообщений боту происходит в отдельном потоке. И это работает! ))
Уважаю. Если не сложно, параметры потоков напиши (стек, приоритет и прочее), что бы другие себе голову не ломали.
Код BT выполняется в основном потоке. Всё, что связано с Wifi в отдельном.
Как-то так:
- но эпопея продолжается ) При попытке сохранить некоторое значение в NVS по команде телеграм-боту, происходит перезагрузка... Если закоментить вызов putString объекта Preferences, перезагрузки не происходит. Если из обработчика таймера убрать вызов dac_output_voltage(DAC_CHANNEL_1, val) то тоже работает. Можно конечно семафор поставить, но всё таки интересно, как одно с другим связано...
Можно конечно семафор поставить, но всё таки интересно, как одно с другим связано...
Семафор не помог. Помогло timer_pause / timer_start на время выполнения записи в NVS. При этом даже щелчков никаких не заметно в динамике.
Ещё можно будет как нибудь попробовать оставить в обработчике таймера только xSemaphoreGiveFromISR, завести ещё одну задачу, которая будет делать take для этого семафора, чтобы синхронизироваться с таймером, и выполнять dac_output_voltage(DAC_CHANNEL_1, val). А запись в NVS при этом попробовать делать с и без синхронизации с семафором.
Ура! Ура! Ура! =)
Вот, что получилось:
https://github.com/zenbooster/zenbooster
- каждый день пользуюсь, по этому будут по возможности исправляться баги, добавляться фичи. Бывало такое, что что-то добавишь, и реконнект к Bluetooth отваливается. Но всегда лечилось высвобождением дополнительной памяти, либо путём урезания размеров стека каких нибудь задач, либо отказом от каких-то фич. Например, я хотел по окончании сессии медитации выводить график функции отражающей уровень медитации либо на странице вэбсервера, либо скидывать картинку с графиком от имени телеграм бота. Но похоже на это не хватит памяти. Крайний раз всю голову сломал, почему реконнект не работает. Отключил буфер припасенный для графика, и всё заработало, т.к. стало больше свободной памяти )
Возможно, ещё прикручу MQTT для отправки данных на свой сервер. А по окончании сессии можно будет уже кидать ссылку в телеграмм на страницу сервера с графиком.
https://youtu.be/huRiIhcoKzM
Ура! Ура! Ура! =)
Вот, что получилось:
https://github.com/zenbooster/zenbooster
- каждый день пользуюсь, по этому будут по возможности исправляться баги, добавляться фичи. Бывало такое, что что-то добавишь, и реконнект к Bluetooth отваливается. Но всегда лечилось высвобождением дополнительной памяти, либо путём урезания размеров стека каких нибудь задач, либо отказом от каких-то фич. Например, я хотел по окончании сессии медитации выводить график функции отражающей уровень медитации либо на странице вэбсервера, либо скидывать картинку с графиком от имени телеграм бота. Но похоже на это не хватит памяти. Крайний раз всю голову сломал, почему реконнект не работает. Отключил буфер припасенный для графика, и всё заработало, т.к. стало больше свободной памяти )
Возможно, ещё прикручу MQTT для отправки данных на свой сервер. А по окончании сессии можно будет уже кидать ссылку в телеграмм на страницу сервера с графиком.
https://youtu.be/huRiIhcoKzM
круто конечно, но лично для себя я новый Фобос заказал, 48 каналов однако