Микроблог

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

FM RDS монитор «Марий Эл Радио» на столе: на экране песня Богдановой Натальи

Мне давно хотелось, чтобы на столе стоял маленький экран, который показывает, что сейчас в эфире «Марий Эл Радио» на 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.

Монитор с магнитной антенной на столе
Монитор и магнитная FM-антенна

Что на экране

  • 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, потом на сайте станции, а если ничего не нашлось, показывает логотип.

Возможности FM RDS монитора
Главное в одной картинке

Исходный код

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

ESP32 CYDRDA5807MLVGL105.5 FMMIT
← Все записи