Решил я собрать информационный дисплей, такой, чтобы были все показания видны. Что-то среднее между метеостанцией и календарем. Однако, в процессе изготовления такого устройства вскрылось поразительное множество нюансов. Хотел бы рассказать о них, уверен, что сохраню этим поступком несколько часов вашей жизни.
Translation to English is here. Также, основной канал в telegram.
Опишу в начале ситуацию, при которой все произошло...
Первая версия информационного дисплея была собрана в espeasy, поэтому проблем я никаких не испытал. Вот тут писал:
А вот тут были видео:
Отлично, урок истории закончен, переходим в этот год. Постоянно работающая подсветка, за 2 года, здорово просела и данные стали почти не видны. Температура на улице и время — это конечно хорошо, но не хватает прогноза погоды и еще каких-нибудь вспомогательных данных. Так зародился новый проект, который я решил собирать уже на espHome. Я потратил время на отрисовку иконок, писал тут:
И вот, дорисовав иконки и собрав проект, я встретил проблему: ESP не подключается к сети WiFi, притом роутер регистрирует плату, если отключить дисплей. Естественно, я предположил проблемы с модулем WiFi. Поясню ход мыслей, спустя некоторое время, после включения esp, появлялась резервная точка доступа, к которой можно было подключиться, открывалась страница приветствия, на которой можно было выбрать правильную точку доступа и тогда проект начинал работать. Однако, все равно это все работало достаточно криво.
Ниже первый комплект решений, который связан именно с WiFi:
Первым делом я решил настроить параметр reboot_timeout, но любое число не позволяло заставить плату работать. Так же и не помогли параметры power_save_mode и fast_connect. Но это мой случай, вот в этой теме описано, что это помогает:
РЕШЕНО / ВРЕМЕННОЕ РЕШЕНИЕ: я перешел на одну точку доступа и установил fast_connect: true. Теперь она каждый раз подключается в течение 7 секунд. Больше нет разницы между блоком питания переменного тока и последовательным портом USB.
Тут появляется первое упоминание про проблемы с питанием esp8266. А вот про режим сохранения энергии:
Пытаться: power_save_mode: none
Искал похожие проблемы на github и обнаружил, что Wi-Fi может не отвечать, если этот параметр включен по умолчанию.
Для решения проблем с питанием, рекомендуют и конденсаторы, и катушки, и разные источники питания. Нет ни одного 100% решения, но каждому помогает свое.
Однако, в конце статьи есть еще одно интересное решение проблемы. Таким образом, мы подходим ко второму комплекту решения этой и других проблем:
Если к плате подключены датчики i2c (особенно дисплей), используйте эту строку кода, чтобы отложить настройку датчиков i2c.
i2c:
setup_priority: -100
Говорю сразу, у меня это тоже не сработало, но идея отличная. Мне это неоднократно помогало в других проектах с другими проблемами☺. Вот описание про приоритеты настройки:
priority (Optional, float): The priority to execute your custom initialization code. A higher value means a high priority and thus also your code being executed earlier. Please note this is an ESPHome-internal value and any change will not be marked as a breaking change. Defaults to 600. Priorities (you can use any value between them too):
800.0: This is where all hardware initialization of vital components is executed. For example setting switches to their initial state.
600.0: This is where most sensors are set up.
250.0: At this priority, WiFi is initialized.
200.0: Network connections like MQTT/native API are set up at this priority.
-100.0: At this priority, pretty much everything should already be initialized.
т.е. изменив для всех процессов приоритет -100, мы дождемся пока плата подключится к сети и уже потом будем работать с нашими дисплеями. Приоритеты всегда полезны, когда начинаются какие-то проблемы.
Продолжая исследовать проблемы с WiFi, можем найти третий комплект решений с сетью решение:
На точке доступа, к которой подключаются все ваши ESP (или все ваши точки доступа), измените пропускную способность канала на ФИКСИРОВАННУЮ на 20 МГц, а не на АВТО.
Алгоритм подключения esp может использовать ширину канала 40 МГц в качестве схемы подключения по умолчанию и это может быть проблемой. Мне придется покопаться в разделе WiFi спецификаций чипа 8266, чтобы более полно понять, что происходит.
Я пробовал это на точке доступа, к которой подключаются как nodemcu, так и D1 mini, и это «решает» проблему.
К сожалению, в некоторых точках доступа реализованы ошибочные стандарты 802.11. Устройство, который я только что купил за 500 долларов, является абсолютным мусором. ESP, а также другие устройства, такие как Mac и iPad, также имеют проблемы с этой точкой доступа.
Мои верные Ubiquity надежны, но esp требуется настройки полосы пропускания канала 20 МГц, чтобы оставаться на связи. В противном случае они циклически подключаются/отключаются.
Есть некоторые задокументированные странности WiFi, особенно в отношении ширины канала WiFi на этих устройствах, когда они разогнаны, так что это может быть место для поиска
И вот я вроде уже описал три разных комплекта решений, но для меня ничего не изменилось, плата то работает, то нет. Идем в поисковик и ищем еще возможные решения. Находим страничку, на которой уже расписана и такая же как у меня проблема с WiFi и решение. Таким образом открывается четвертый комплект решений:
Проблема: "Дисплей использует I2C протокол. Максимальная скорость для Wemos D1 похоже 100khz, что выглядит слишком медленно для обновления дисплея в 5s! Как результат, похоже это нарушает требования по железу для ESPHome "планировщика" не тратить более 10ms. Накоеце, остальные компоненты не имеют шанс на работу."
Поэтому я не стал разбираться и подвергать это сомнению, а зря, однако это сработало. Вот описание дисплея:
update_interval был выставлен в 60с и все заработало.
На самом деле, я копнул не в проблему дисплея, а в проблему i2c в esphome. Нет доказательств, что проблема именно в нем, но в ESPEasy все работало без каких-либо проблем. Также, все упоминания о проблемах с i2c указывали на ESPHome.
Дальнейшие ответы по i2c можно найти и на других страницах:
Тут указывается, что нужно изменить время обновления со стандартной 1с до 2с и все заработает, однако это не единственное решение. Вот еще одно интересное решение, правда мы не можем на него рассчитывать:
У меня есть ESP8266, которая не подключается, как и Ваша. Я добавил случайный переключатель GPIO (ни к чему не подключенный), и когда все скомпилировалось, то подключилось нормально. Я не могу это объяснить, хитрое оборудование? Просто странно. Это было проблемой в течение некоторого времени, и никто, кажется, не может добраться до сути.
Там же можно узнать, что проблема появляется и исчезает случайно:
спасибо за советы, я попробовал update_interval: 3s, и все снова начало работать. Никогда не нуждался в этом раньше, но, возможно, что-то изменилось с более поздними версиями esphome.
или вот:
Я имею дело с двумя sonoff, которые не подключаются после того, как я обновил их сегодня.
А в конце страницы мы находим еще одно решение, так появляется пятый комплект решений:
Для тех, у кого также есть эта проблема, НО они не хотят менять update_interval, решение, измените частоту шины I²C на 800kHz, у меня сработало, и я смог сохранить значение по умолчанию update_interval, равное 1 с.
Идем дальше, следующая тема, которая описывает и нашу проблему и такое же решение:
Я уже видел несколько других людей с проблемами подключения к WiFi, где в журналах просто указано «Истекло время аутентификации» или «Запрос зонда не выполнен» и т. д. Я думаю, что я на один шаг ближе к пониманию почему это может быть...
Я использовал OLED-экран с кнопкой. В течение нескольких тестов у меня не было никаких проблем, ESPHome подключился к ESP. Однако, после того как я добавил еще несколько вещей в свой YAML, он стал вести себя все более и более... странно.
Затем я снова начал отключать компоненты, такие как i2c, чтобы больше не активировать OLED, и, к удивлению, ESP снова подключился. Конечно, все еще были некоторые проблемы с подключением, но они возникали гораздо реже, чем с активным OLED. Затем я начал слегка сгибать OLED-экран, совсем чуть-чуть, в надежде, что он будет меньше мешать процессору ESP, и, возможно, это просто эффект плацебо, но теперь он успешно подключался почти каждый раз (с отключенным i2c).
Затем, я снова включил i2c, и проблемы вернулись. Поэтому я подозреваю, что проблема с помехами является причиной проблем с WiFi. До сих пор я почти исключительно видел, как люди сообщают о проблемах с Wi-Fi, как здесь, с OLED-экранами, так что, может быть, это действительно так? Хотя не уверен, что это можно исправить на стороне программного обеспечения с помощью ESPHome (тайминги?) или это нужно исправить, защитив экран физически.
Интересная мысль, и я находил еще несколько раз упоминание, что действительно такое поведение происходит именно из-за проблем с питанием... но это уже описано выше.
Однако, дисплей тоже имеет значение, как и количество информации, которое на нем отображается.
Я понял, что как только я использую все доступное разрешение 128x64 моего OLED-экрана, например, нарисовав заполненный прямоугольник, он перестанет подключаться с обычным сообщением «Аутентификация истекла». Однако, если я уменьшу прямоугольник примерно до 110x55, он все равно будет успешно подключаться.
И это уже хорошо, подтверждается теория про скорость шины, что уже была описана выше: измените частоту шины I²C на 800kHz. Т.е. стандартной скорости работы шины i2c не хватает для отрисовки дисплея и контроллер только этим и занимается, а на WiFi уже нет времени. Доказательством этого есть такая цитата:
Простое решение: просто установите частоту i2c выше. Я использовал 400 кГц, и все работает безупречно! Не уверен, что это ошибка ESPHome, но разве это не должно работать со стандартными 50 кГц?
Что же это за частота? Вот описание i2c компонента:
В разных топиках рекомендуют изменять параметр scan на false. Но мне не помогло, да и проблема у меня явно происходит не на этапе сканирования устройств.
If ESPHome should do a search of the I²C address space on startup. Defaults to true.
Второй важный параметр - frequency, про него я писал несколько раз выше.
Set the frequency the I²C bus should operate on. Defaults to 50kHz. Values are 10kHz, 50kHz, 100kHz, 200kHz, … 800kHz
Что же, статья подошла к концу. Я описал множество советов по решению проблемы. Конечно, хочется вместо "многобукв" написать простое и универсальное решение, но его нет, да и так не бывает. Я тоже не буду вам рассказывать сказок, электроника - сложная вещь, поэтому так легко копировать проекты и так сложно создавать свои новые. Но и не все так плохо, интернет открыл нам путь к знаниям, поэтому встретившись с проблемой - не нужно расстраиваться. Как говорится: дорогу осилит идущий. Но не стоит впадать и в крайности, иногда проблему можно и отложить, и позвать на помощь друзей/коллег/сообщество. Ищите решения, пробуйте разные запросы, не сдавайтесь!
Всех с наступившим новым годом!
Мой блог является некоммерческим, поэтому позитивный комментарий, лайк или репост поможет публикациям выходить чаще и развивать канал☺.
Также публикации можно найти на других площадках: Instagram, telegram (RU, EN, DE), Medium, LiveJournal, YouTube, Reddit