АУДИО Интернет-радио microMedia на ESP32-S3

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
194
158
www.1812.ru
Интернет-радио + аудиоплеер + часы-будильник с боем и курантами на ESP32-S3

Версия 2.23 от 28 апреля 2025 г.

radio0.jpg

Устройство обладает следующим функционалом:
1. Может работать с практически неограниченным списком радиостанций. Причём переключение между станциями происходит мгновенно.
2. Управление радио осуществляется и элементами управления на самом радио, и через web-интерфейс, и через ИК-пульт.
3. Точно так же как и в смартфоне (планшете) организовано подключение радио по wi-fi к интернету. Сохраняются все ранее использованные точки доступа и при повторном попадании прибора в зону их действия соединение с интернетом не требует повторной авторизации.
4. Радио имеет три режима работы: интернет-радио, часы, музыкальный проигрыватель.
5. В режиме музыкального проигрывателя осуществляется воспроизведение звуковых файлов с sd-карты. Пока реализована вложенность папок с аудио-файлами равная единице.
6. В режиме интернет-радио можно фильтровать весь список радиостанций по двум параметрам: жанр (20 жанров) и локация (6 локаций).
7. И в режиме радио, и в режиме проигрывателя поддерживается дополнительный маркер "избранное".
8. Реализована очень полезная функция - автоматический уровень громкости, которая выравнивает громкость звучания разных интернет-станций.
9. В web-интерфейс встроен простой редактор списка радиостанций, который позволяет управлять списками станций в самом устройстве.
10. Проверен и введен по умолчанию список из более 4 000 интернет-станций с указанием их жанра и локации.
11. Разработано и вшито в прошивку 7 цветовых схем интерфейса экрана интернет-радио.
12. Реализовано управление яркостью экрана интернет-радио.
13. Реализован режим энергосбережения (выключения подсветки экрана).
14. Реализованы функции выключения и включения по заданному времени.
15. Реализованы куранты часов (каждый час, каждые пол-часа, каждые 15 и 45 минут). Можно установить один из 7 типов звучания курантов или выставить озвучивание текущего времени голосом.
16. Для людей с плохим зрением реализовано озвучивание меню управления интернет-радио голосом.
17. В режиме радио реализована функция анализа качества связи с интернет-станцией и восстановление соединения при критичном ухудшении или потере связи с сайтом радиостанции.
18. Реализована блокировка/снятие блокировки нажатия кнопок и вращения энкодера - полезная опция для интернет-радио в карманном исполнении.
19. Реализованы функции "случайная радио-станция" для режима радио и "случайная композиция" для режима аудиопроигрывателя.
20. На дисплее устройства и в его web-интерфейсе реализовано отображение состояние заряда питающего аккумулятора.

Компоненты, необходимые для сборки:
1. Модуль ESP32-S3 (обязательный элемент). Тестировалось на модуле ESP32-S3 Dual USB разработки AITEXM ROBOT.
2. Модуль DAC PCM5102 (обязательный элемент).
3. Дисплей 1.8 TFT SPI 128x160 with sd-card reader - ST7735 TFT (обязательный элемент).
4. Энкодер с кнопкой (обязательный элемент).
5. Модуль усилителя НЧ LM4881 или любой подходящий аналог (факультативный элемент).
6. Инфракрасный беспроводной модуль дистанционного управления HX1838 (TL1838) с пультом (факультативный элемент).
7. Транзистор 2N3906 или аналог (если хотите регулировать яркость дисплея).
8. Три резистора 1кОм.
9. Выключатель питания.
10. Разъём внешнего питания type-c (мама).
11. Один - два аудио-разъёма 3.5 стерео (мама).
12. sd-карта не более 32 Гб.

Порядок сборки, прошивки и настройки.

1. Соберите устройство, согласно приложенной принципиальной схеме.
2. Скачайте и распакуйте архив скетча. (Избегайте кириллических символов в путях к скетчу и библиотекам).
3. В Arduino IDE откройте файл InternetRadio.ino.
4. Установите в настройках Arduino IDE свою плату ESP-32.
5. Установите в пункте настроек "Partition scheme" опцию "Minimal SPIFFS (1.9MB APP with OTA/190KB SPIFFS)" и остальные параметры, согласно прилагаемому скриншоту:
ide05.jpg
6. Перед компиляцией скетча обязательно:
- в папку библиотек Arduino\libraries\Adafruit_GFX_Library перепишите файл glcdfont.c из архива скетча.
- туда же обязательно перепишите из архива скетча папку FontsRus, даже если не планируете использовать.
7. Попробуйте скомпилировать скетч. При отсутствии необходимых библиотек доустановите их из среды Arduino IDE. (Рекомендованные версии библиотек смотрите в отдельном списке ниже данной инструкции).
8. На предварительно отформатированную в FAT32 sd-карту запишите содержимое архива папки SD-card.
9. Вставьте sd-карту в слот на модуле дисплея.
10. Теперь всё готово для заливки прошивки в ESP-32. Загрузите скетч на плату.

Если всё сделано правильно, то:
1. При включении в wi-fi радио объявляет себя как "microMedia".
2. Первым делом смартфон нужно подключить к этой сети. Пароль: 12345678.
3. Далее открыть в браузере адрес 192.168.4.1 и там уже настроить соединение интернет-радио с интернетом.
Выберите ваш роутер из списка и введите пароль доступа. В случае успеха вы услышите первые звуки интернет-трансляции первой станции из большого списка станций.
4. После чего для управления интернет-радио через web-интерфейс необходимо узнать ip-адрес самого устройства в сети. Для этого достаточно нажать один раз кнопку BUTTON и в нижней части всплывшего на дисплее окошка с меню посмотреть и вбить в адресную строку web-браузера вашего компьютера (планшета, смартфона) отображаемый ip-адрес.

Принципиальная схема
schemas.png

(Контроллер зарядки и питания устройства на принципиальной схеме не изображены).

Архив скетча, шрифтов для дисплея и содержимое sd-карты
65.1 Mb в zip-архиве

Arduino IDE и необходимые библиотеки
Скетч успешно компилировался на Arduino IDE версий 2.0.17 и 2.3.3.


ESP32-audioI2S-master (https://github.com/schreibfaul1/ESP32-audioI2S) - версия 2.0.0
GyverEncoder (https://github.com/GyverLibs/GyverEncoder) - версия 4.10
GyverButton (https://github.com/GyverLibs/GyverButton) - версия 3.8
IRremote (https://github.com/Arduino-IRremote/Arduino-IRremote) - версия 3.5.0 - критично. На более высоких версиях будут ошибки компиляции.
Adafruit GFX Library (https://github.com/adafruit/Adafruit-GFX-Library) - версия 1.11.9 (Если с этой версией вместо русских букв "козябры", то используйте версию 1.11.0).
Adafruit ST7735 and ST7789 Library (https://github.com/adafruit/Adafruit-ST7735-Library)- версия 1.10.4
GyverPortal (https://github.com/GyverLibs/GyverPortal) - версия 3.6.6
ESP32Time (https://github.com/fbiego/ESP32Time) - версия 2.0.5
NTPClient от Fabrice Weinberg (https://github.com/arduino-libraries/NTPClient) - версия 3.2.1

(вверх)(вниз) - в режимах "Радио", "Проигрыватель" и "Часы" - увеличение / уменьшение громкости; в меню - перемещение курсора по вертикали
(вправо)(влево) - в режимах "Радио", "Проигрыватель" и "Часы" - переключение станций или композиций; в меню - перемещение курсора по горизонтали или включение/выключение опций
(OK) - главное меню и подменю
(*) - смена режима между "Радио" и "Проигрыватель"
(#) - включение выключение звука
(1) - часы или радио / проигрыватель
(2) - переключение между списакми "Избранное" и "Всё" для радио и проигрывателя
(3) - случайная станция радио / случайная композиция проигрывателя
(4) - смена жанра назад
(5) - все жанры
(6) - смена жанра вперёд
(7) - смена локации радиостанции назад
(8) - все страны
(9) - смена локации радиостанции вперёд
(0) - включение / выключение

Версия 2 интернет-радио:
radio01.jpg

Версия 1 интернет-радио:
radio02.jpg

radio03.jpg

web01.jpgweb02.jpgweb03.jpgweb04.jpgweb05.jpgweb07.jpgweb08.jpgweb09.jpg

Обзор 1-й версии интернет-радио

Обзор 2-й версии интернет-радио

Мной были разработаны и собраны два устройства. Ещё одно в рамках тестирования было собрано участником форума samand587.

Версия 1.20. По факту - 2.20. Изначальная версия скетча, опубликованная здесь на форуме.

Версия 2.21. С помощью участника форума Сергея (sergggg) в схему и в скетч добавлено отображение состояния заряда аккумуляторной батареи.
Схема подключения: к минусовому контакту АКБ подключается резистор 100 кОм; к плюсовому контакту - резистор 200 кОм; оба резистора соединяются свободными контактами на пине 4 ESP-32.
Состояние заряда АКБ отображается в режимах "Радио" и "Проигрыватель" в верхнем правом углу дисплея интернет-радио в виде пиктограммы, а так же через web-интерфейс в правом верхнем углу шапки страницы, напротив надписи "интернет-радио". В web-интерфейсе можно через настройки в разделе "Экран и шрифт" установить в каких единицах будет отображаться текущий заряд АКБ: в процентах или в вольтах.

web10.jpgbattery.jpg

Версия 2.22. Доработана индикация заряда АКБ на дисплее устройства. Теперь, помимо пиктограммы с изображением батарейки, левее отображается состояние заряда в процентах или в вольтах, в зависимости от настроек индикации.
battery1.jpgbattery2.jpg

Версия 2.23.
1. Добавлена новая цветовая схема интерфейса "Калейдоскоп".
2. Сделано обновление прошивки с sd-карты. Для этого неообходимо откомпилировать скетч с Partition Scheme "Minimal SPIFFS". Файл прошивки firmware.bin выложить в корень sd-карты.
3. Оптимизирована процедура индексации аудио-файлов в папках Проигрывателя.

Буду признателен за конструктивную критику, указания на ошибки (куда ж без них!), сообщения об успешных повторах устройства с фотографиями ваших реализаций и прочее. Спасибо за внимание!
 

Вложения

Изменено:

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
194
158
www.1812.ru
Сегодня выпущена версия 2.21 прошивки. Архив с прошивкой обновлён.
С помощью участника форума Сергея (sergggg) в схему и в скетч добавлено отображение состояния заряда аккумуляторной батареи.
Схема подключения: к минусовому контакту АКБ подключается резистор 100 кОм; к плюсовому контакту - резистор 200 кОм; оба резистора соединяются свободными контактами на пине 4 ESP-32.
Состояние заряда АКБ отображается в режимах "Радио" и "Проигрыватель" в верхнем правом углу дисплея интернет-радио в виде пиктограммы, а так же через web-интерфейс в правом верхнем углу шапки страницы, напротив надписи "интернет-радио". В web-интерфейсе можно через настройки в разделе "Экран и шрифт" установить в каких единицах будет отображаться текущий заряд АКБ: в процентах или в вольтах.
battery.jpg
web10.jpg
 

Olegsan

✩✩✩✩✩✩✩
13 Мар 2025
24
3
@Олег Поляков, добрый день. доехала до меня плата , собрал ,запустил - но ,не могу войти в вэб морду. подключится подключился, а вот 192.168.4.1 телефон ругается, говорит не пущу, не проверенный сайт.пробегает мельком вэб морда..скажи пожалуйста ,через сд карту как прописать свой роутер,имя и пароль,есть такая возможность ?
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
194
158
www.1812.ru
@Olegsan, так не проще ли будет тогда зайти по 192.168.4.1 с компа, с которого прошивался?

через сд карту как прописать свой роутер,имя и пароль,есть такая возможность ?
Есть, но это более длинный путь.
 
Изменено:

Olegsan

✩✩✩✩✩✩✩
13 Мар 2025
24
3
@Олег Поляков, с компа пробовал , 10ка сказала фигвам. с компа я захожу в ерадио только через свисток(китайцы его щас дюже хвалят , там типа и вф6 и бт5, правда только под 10кой работает , но и правда без проблем) и только ,когда всё в одной сети, а через шнурок 10ка блокирует , или не то что-то делаю. грешил поначалу на s3 - то есть сигнал от нее то нет, сколупнул крышку, по мануалу целая развязка должна быть до антенны- а у меня что-то похожее на ёмкость, но звонится, что под рукой было- повесил на волосках стало поустойчивей, перестал сигнал пропадать, а 192.168.4.1 ускользает , вот потому и ищу разные способы прописать роутер
 

iponkada2

★★✩✩✩✩✩
10 Апр 2024
125
57
@Olegsan, на карте памяти есть wifi.in вместо чёрточек вписывается сеть и пароль, сеть - прямое название, а пароль как-то зашифрован можете попробовать прописать. Или на фото замените на свои. Сам не пробовал.
 

Вложения

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
194
158
www.1812.ru
@Olegsan,тогда всё-таки придётся использовать длинный путь.
Добавьте временно следующий код в Setup скетча.
C++:
lp.pass = "ваш пароль";
Serial.println(String(XORENC(lp.pass, password_key)));
Откройте файл wifi.ini, который находится в папке WiFi на sd-карте. Введите отдельной строкой ваш ssid и следом через разделитель "|" скопируйте из консоли и вставьте зашифрованный пароль:
C++:
ваш ssid|ваш закодированный пароль
--------------eof--------------
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
194
158
www.1812.ru
Выпустил обновление прошивки, доведя индикацию заряда АКБ до логического завершения. Теперь уровень заряда отображается в % и в вольтах на дисплее устройства в зависимости от выставленной настройки в web-интерфейсе.
battery1.jpgbattery2.jpg
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
194
158
www.1812.ru
@Zee0n, если использовать библиотеку SoapESP32, то при первом приближении проблем не вижу. Однако, более сложной видится задача бесшовно встроить DLNA в пользовательский интерфейс. Скорее всего к существующим "Радио" и "Проигрыватель" придётся добавлять отдельный режим "Медиа".
 
  • Лойс +1
Реакции: Zee0n и iponkada2

Zee0n

✩✩✩✩✩✩✩
27 Мар 2025
7
0
Что-то карту совсем не видит и изображение странное на экране
photo_2025-04-13_20-34-56.jpg
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
194
158
www.1812.ru
@Zee0n, пожалуйста, проверьте пины подключения и, если всё подключено правильно, а результата нет, то попробуйте поменять на другие в этом месте:
C++:
#define SD_CS 35
#define SPI_MOSI 36
#define SPI_MISO 37
#define SPI_SCK 38
 
  • Лойс +1
Реакции: Zee0n

Sturdm

✩✩✩✩✩✩✩
4 Июн 2021
9
2
Вылезла ошибка компиляции :

C:\Users\MyPC\Desktop\InternetRadio\InternetRadio.ino: In function 'void setup()':
C:\Users\MyPC\Desktop\InternetRadio\InternetRadio.ino:537:44: error: 'ADC_ATTEN_DB_12' was not declared in this scope
adc1_config_channel_atten(USER_ADC_CHAN, ADC_ATTEN_DB_12);
^~~~~~~~~~~~~~~
C:\Users\MyPC\Desktop\InternetRadio\InternetRadio.ino:537:44: note: suggested alternative: 'ADC_ATTEN_DB_11'
adc1_config_channel_atten(USER_ADC_CHAN, ADC_ATTEN_DB_12);
^~~~~~~~~~~~~~~
ADC_ATTEN_DB_11
Несколько библиотек найдено для "Audio.h"
Используется: C:\Users\MyPC\Documents\Arduino\libraries\ESP32-audioI2S-master
Не используется: C:\Users\MyPC\Documents\Arduino\libraries\Audio
Несколько библиотек найдено для "WiFi.h"
Используется: C:\Users\MyPC\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.9\libraries\WiFi
Не используется: C:\Users\MyPC\Documents\Arduino\libraries\WiFi
Несколько библиотек найдено для "SD.h"
Используется: C:\Users\MyPC\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.9\libraries\SD
Не используется: C:\Users\MyPC\AppData\Local\Arduino15\libraries\SD
exit status 1

Compilation error: 'ADC_ATTEN_DB_12' was not declared in this scope

Если в коде удалить :

// Инициализация АЦП для контроля заряда аккумулятора
#ifndef BATTERY_OFF
// Настройка и инициализация АЦП
adc1_config_width(ADC_WIDTH_BIT_12);
adc1_config_channel_atten(USER_ADC_CHAN, ADC_ATTEN_DB_12);

// Расчет характеристик АЦП т.е. коэффициенты усиления и смещения
esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_12, ADC_WIDTH_BIT_12, 0, &adc1_chars);
#endif
то компиляция успешна. Где надо подправить?
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
194
158
www.1812.ru
@Sturdm, попробуйте вместо ADC_ATTEN_DB_12 использовать альтернативный вариант ADC_ATTEN_DB_11.
Или добавить в начале скетча: #define ADC_ATTEN_DB_12 3
 

Zee0n

✩✩✩✩✩✩✩
27 Мар 2025
7
0
@Олег Поляков,
photo_2025-04-14_11-20-15.jpg
Сделал пины как в ёRadio, экран и карта определилась, карточка конечно определяется через раз, пока не понял причину неконтакта, вопрос следующий: а нельзя вообще убрать подтверждение нажатия кнопки энкодера для запуска веб-сервера и раздачи DHCP?
И куда именно это вставить в код скетча для того, чтобы прописать XOR пароля на карту?
lp.pass = "ваш пароль";
Serial.println(String(XORENC(lp.pass, password_key)));
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
194
158
www.1812.ru
@Zee0n, по первому вопросу: можно, достаточно целиком закомментировать безусловный цикл, который можно найти в web.ino через поиск по "Connect your". (Исходники не под рукой, поэтому пишу по памяти).
По второму вопросу порядок действий я написал тут: https://community.alexgyver.ru/threads/internet-radio-micromedia-na-esp32-s3.13089/post-184580
Код можно временно вставить в setup().
 
Изменено:

Sturdm

✩✩✩✩✩✩✩
4 Июн 2021
9
2
@Олег Поляков
Не идёт .В первом варианте предлагает альтернативу предыдущей записи. Во втором -куча красных уведомлений..
Попытаться прошиться бинарниками но там тоже мне не понятных два файла с необычными расширениями..
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
194
158
www.1812.ru
@Zee0n, да вроде всё просто. В Arduino IDE включаете через "Инструменты" - "Монитор порта" консоль и оттуда копируете закодированный пароль в файл wifi.ini на sd-карту. Минимум телодвижений.
Управление энкодером:
  • поворот вправо/влево - предыдушая/следующая станция в режиме "Радио" или предыдущая/следующая композиция в режиме "Проигрыватель".
  • нажатие и поворот вправо/влево - регулировка громкости.
  • одинарное нажатие - изменение режима ("Радио", "Часы", "Проигрыватель") по кругу.
  • долгое нажатие - включение/выключение звука трансляции или воспроизведения.
 

Zee0n

✩✩✩✩✩✩✩
27 Мар 2025
7
0
закодированный
В том и дело, что не удавалось получить зашифрованный пароль без ошибок, проще в монитор вставить команду как на ёрадио и приконнектится

И еще нет возможности листать список станций энкодером, чтобы они были перед глазами, пролистнул на нужную, выбрал и она включилась
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
194
158
www.1812.ru
@Zee0n, я не знаю почему у вас не работает штатная простая процедура ввода и сохранения настроек wifi, которая заложена в web-интерфейс прошивки. Она может сохранять любое количество точек доступа к Сети в файл wifi.ini для последующего автоматического подключения к ранее используемым точкам доступа. Я тестировал этот механизм. Он должен работать.

@Zee0n,
И еще нет возможности листать список станций энкодером, чтобы они были перед глазами, пролистнул на нужную, выбрал и она включилась
Да, такой способ навигации у меня не сделан. В планах следующей версии прошивки.
 
Изменено:

Sturdm

✩✩✩✩✩✩✩
4 Июн 2021
9
2
Компиляция успешна на версии 2.0.17 была 3.2.0 .
Пойду заказывать компоненты
Кстати Ваша предыдущая версия этого проекта 1.2 компиляция без проблем и на версии 3.2.0
 
Изменено:
  • Лойс +1
Реакции: Олег Поляков