FM RDS монитор для «Марий Эл Радио» на ESP32

Мне давно хотелось, чтобы на столе стоял маленький экран, который показывает, что сейчас в эфире «Марий Эл Радио» на 105.5 FM: что передаёт RDS, какая песня играет, с фото исполнителя, как в приложении, и сколько людей слушают нас в интернете. Покупать готовое не стал и собрал сам.
Из чего собрано
- ESP32-2432S028, его ещё называют «Cheap Yellow Display». Это плата с Wi‑Fi, экраном 2.8" 320×240 и RGB-светодиодом на обороте.
- RRD-102 v2.0, FM-приёмник на чипе RDA5807M с декодером RDS.
- Магнитная FM-антенна и акриловый корпус.
Соединяются они четырьмя проводами от разъёма CN1: красный на 3V3, жёлтый на IO27 (SDA), синий на IO22 (SCL) и чёрный на GND. Модуль я припаял прямо к оргстеклу корпуса с обратной стороны, а антенну подключил к выводу ANT.

Что на экране
- RDS: название станции отдельной строкой и RadioText в две строки на всю ширину.
- «Сейчас в эфире»: исполнитель и песня, обрезанные так же, как в нашем приложении, и фото исполнителя.
- Полное название со всем, что в скобках: автор, версия, ремикс.
- Слушатели онлайн: одно общее число по «Марий Эл Радио» и МЕТР 12.
- Уровень сигнала, Wi‑Fi и заставка PirogovLab при включении.
Кнопок нет совсем. Частота зашита на 105.5 МГц, экран развёрнут на 180°, интерфейс сделан на LVGL в тёмном минималистичном стиле. Весь текст виден целиком, без многоточий и бегущей строки.

Что пришлось решать
- Инвертированные цвета. Сначала экран показывал только синий, чёрный и белый, а фото выходили негативом. Оказалось, что у этой панели ILI9341 цвета инвертированы, и всё исправил один вызов
invertDisplay(true). - Мерцание и «крестики». Фон с градиентом давал сетку из-за дизеринга, поэтому я сделал его сплошным. Надписи теперь перерисовываются, только когда текст действительно поменялся, и экран не мигает.
- Названия со скобками. Icecast и ICY-теги отдают название без того, что в скобках, а там бывает самое важное. Полное название в итоге нашлось в текстовом файле эфира
mer.txt, и теперь берётся оттуда. - Шина I²C. На длинных проводах приёмник иногда сбивался. Я снизил частоту шины до 50 кГц, и прошивка теперь сама проверяет настроенную частоту и при сбое перестраивается обратно на 105.5.
- Индикатор с задней стороны. Когда всё в порядке, светодиод горит ровным зелёным. Если пропал Wi‑Fi, данные или сигнал, он мигает красным и синим, как полицейская мигалка, и это видно даже через всю комнату.
- Wi‑Fi в новом месте. Если знакомой сети нет, устройство само поднимает точку доступа MariRadio-Setup. С телефона выбираешь сеть и вводишь пароль, а запомнить он может до пяти сетей.
Ещё я пробовал добавить индикатор уровня звука. Но эта схема ухудшила приём, и я вернул всё как было: надёжный RDS важнее.

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

Исходный код
Прошивка, схема подключения, список деталей и инструкция по сборке выложены на GitHub под лицензией MIT. Если соберёте такой же для своей станции, напишите мне в Telegram, будет интересно посмотреть!