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

Олег Поляков

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

radio0.jpg

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

Компоненты, необходимые для сборки:
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" опцию "Huge App".
6. После того как скетч успешно скомпилировался обязательно:
- в папку библиотек Arduino\libraries\Adafruit_GFX_Library перепишите файл glcdfont.c из архива скетча.
- туда же обязательно перепишите из архива скетча папку FontsRus, даже если не планируете использовать.
7. Попробуйте скомпилировать скетч. При отсутствии необходимых библиотек доустановите их из среды Arduino IDE. (Используйте версию библиотеки IRremote не выше 3.0.0).
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-карты
59.4 Mb в zip-архиве

Arduino IDE и необходимые библиотеки
Скетч успешно компилировался на Arduino IDE версий 2.0.9 и 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
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


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

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

radio03.jpg

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

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

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

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

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

Вложения

Изменено:

Chemergez

✩✩✩✩✩✩✩
3 Мар 2023
7
2
На схеме S3, по тексту C3. Так на чем оно у Вас собрано? Я сак полагаю все таки на S3? У C3 пинов кот наплакал.
 
  • Лойс +1
Реакции: Олег Поляков

iponkada2

★✩✩✩✩✩✩
10 Апр 2024
78
32
Попробую на st7789 запустить, библиотека общая только немного поправить вывод.
 

samand587

★✩✩✩✩✩✩
31 Май 2021
104
29
Привет! Есть какие изменения в релизе от тестового варианта?
 

yurij75

✩✩✩✩✩✩✩
3 Мар 2025
2
0
Попробовал, на проверке скетча куча ошибок, ставил все по описанию. ёрадио без проблем шьется. Ардуино 1.8.19
 

Вложения

Изменено:

Olegsan

✩✩✩✩✩✩✩
13 Мар 2025
13
1
@Олег Поляков, скажи пожалуйста - сд карту в какой системе форматировать и какая иерархия папок там ? какая правильная библиотека звука , понятно 2 версия, но по ссылке висит 3.12. Скомпилировал ,залил , сд прицепил - не оживает. на некоторых выводах меандр и всё. Собрал каюсь не всё - есп,дисплей,сд. В сети устройства нет, светодиод молчит ,экран тож молчит. До этого е-радио заливал в плату- и светодиод отображал сеть и сеть была ,дисплей правда был 7789, но тож всё отображал.
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
137
127
www.1812.ru
@Olegsan,
1. FAT32.
2. Содержимое sd-карты есть в соответствующей папке zip-архива проекта.
3. В Arduino IDE желательно через Library выставить и установить для каждой используемой библиотеки допустимую версию.
Чтобы сборка заработала очень важно подобрать и esp, и дисплей, и dac согласно указанной спецификации.
 

VILUKAS

✩✩✩✩✩✩✩
22 Мар 2025
6
0
заменил библиотеки, теперь другая ошибка:
In file included from D:\mikromedia\InternetRadio\InternetRadio.ino:149:
C:\Users\1\Documents\Arduino\libraries\Adafruit_GFX_Library/FontsRus/mMediaDigital32.h:2090:16: error: 'mMediaDigitalpt8b32Bitmaps' was not declared in this scope
(uint8_t *)mMediaDigitalpt8b32Bitmaps,
^~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Users\1\Documents\Arduino\libraries\Adafruit_GFX_Library/FontsRus/mMediaDigital32.h:2090:16: note: suggested alternative: 'mMediaDigital32pt8bBitmaps'
(uint8_t *)mMediaDigitalpt8b32Bitmaps,
^~~~~~~~~~~~~~~~~~~~~~~~~~
mMediaDigital32pt8bBitmaps
D:\mikromedia\InternetRadio\InternetRadio.ino: In function 'void GetPlayInfo()':
InternetRadio:932:28: error: 'class Audio' has no member named 'getVUlevel'; did you mean 'getVolume'?
int iVUlevel = map(audio.getVUlevel(), 0, maxVUlevel, 0, 100);
^~~~~~~~~~
getVolume
InternetRadio:936:24: error: 'class Audio' has no member named 'getVUlevel'; did you mean 'getVolume'?
maxVUlevel = audio.getVUlevel();
^~~~~~~~~~
getVolume
D:\mikromedia\InternetRadio\InternetRadio.ino: In function 'void CheckVolume()':
InternetRadio:1106:40: error: 'class Audio' has no member named 'getVUlevel'; did you mean 'getVolume'?
c_volume = (c_volume + map(audio.getVUlevel(), 0, 50000, 0, 21)) / 2;
^~~~~~~~~~
getVolume
D:\mikromedia\InternetRadio\InternetRadio.ino: In function 'void aruVolume()':
InternetRadio:1138:78: error: no matching function for call to 'Audio::setVolume(int, int)'
if (current_volume > (volume + vk)) audio.setVolume(current_volume - 1, 1);
^
In file included from D:\mikromedia\InternetRadio\InternetRadio.ino:10:
C:\Users\1\Documents\Arduino\libraries\ESP32-audioI2S-master\src/Audio.h:179:10: note: candidate: 'void Audio::setVolume(uint8_t)'
void setVolume(uint8_t vol);
^~~~~~~~~
C:\Users\1\Documents\Arduino\libraries\ESP32-audioI2S-master\src/Audio.h:179:10: note: candidate expects 1 argument, 2 provided
InternetRadio:1139:78: error: no matching function for call to 'Audio::setVolume(int, int)'
if (current_volume < (volume + vk)) audio.setVolume(current_volume + 1, 1);
^
In file included from D:\mikromedia\InternetRadio\InternetRadio.ino:10:
C:\Users\1\Documents\Arduino\libraries\ESP32-audioI2S-master\src/Audio.h:179:10: note: candidate: 'void Audio::setVolume(uint8_t)'
void setVolume(uint8_t vol);
^~~~~~~~~
C:\Users\1\Documents\Arduino\libraries\ESP32-audioI2S-master\src/Audio.h:179:10: note: candidate expects 1 argument, 2 provided
D:\mikromedia\InternetRadio\screen.ino: In function 'void update_display_info()':
screen:265:26: error: 'mMediaDigital32pt8b' was not declared in this scope
tft.setFont(&mMediaDigital32pt8b);
^~~~~~~~~~~~~~~~~~~

D:\mikromedia\InternetRadio\screen.ino:265:26: note: suggested alternative: 'mMediaDigitalC32pt8b'
tft.setFont(&mMediaDigital32pt8b);
^~~~~~~~~~~~~~~~~~~
mMediaDigitalC32pt8b
c_volume = (c_volume + map(audio.getVUlevel(), 0, 50000, 0, 21)) / 2; - подкрасило эту строку.
 

VILUKAS

✩✩✩✩✩✩✩
22 Мар 2025
6
0
Ядро 2.0.9.
In file included from D:\mikromedia\InternetRadio\InternetRadio.ino:149:
C:\Users\1\Documents\Arduino\libraries\Adafruit-GFX-Library-master/FontsRus/mMediaDigital32.h:2090:16: error: 'mMediaDigitalpt8b32Bitmaps' was not declared in this scope
(uint8_t *)mMediaDigitalpt8b32Bitmaps,
^~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Users\1\Documents\Arduino\libraries\Adafruit-GFX-Library-master/FontsRus/mMediaDigital32.h:2090:16: note: suggested alternative: 'mMediaDigital32pt8bBitmaps'
(uint8_t *)mMediaDigitalpt8b32Bitmaps,
^~~~~~~~~~~~~~~~~~~~~~~~~~
mMediaDigital32pt8bBitmaps
D:\mikromedia\InternetRadio\screen.ino: In function 'void update_display_info()':
screen:265:26: error: 'mMediaDigital32pt8b' was not declared in this scope
tft.setFont(&mMediaDigital32pt8b);
^~~~~~~~~~~~~~~~~~~
D:\mikromedia\InternetRadio\screen.ino:265:26: note: suggested alternative: 'mMediaDigitalC32pt8b'
tft.setFont(&mMediaDigital32pt8b);
^~~~~~~~~~~~~~~~~~~
mMediaDigitalC32pt8b
Несколько библиотек найдено для "SD.h"
Используется: C:\Users\1\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.9\libraries\SD
Не используется: C:\Program Files (x86)\Arduino\libraries\SD
Несколько библиотек найдено для "WiFi.h"
Используется: C:\Users\1\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.9\libraries\WiFi
Не используется: C:\Program Files (x86)\Arduino\libraries\WiFi
exit status 1
'mMediaDigital32pt8b' was not declared in this scope
 

VILUKAS

✩✩✩✩✩✩✩
22 Мар 2025
6
0
библиотеки пытался ставить в Ардуино согласно версий и качать с Гитхаба- результат тот же.
Почему то тормозится на шрифтах, хотя папку Русфонт в билиотеку вложил, файл с шрифтами заменил.
Пробовал версии 3.07, 2.17, 2.09 - результат тот же.
 

Olegsan

✩✩✩✩✩✩✩
13 Мар 2025
13
1
@VILUKAS, точно не могу вспомнить, но эта ошибка ушла после ,то-ли ядро поменял ,то-ли библиотеку....много времени потерял на этом. скомпилировал, загрузил - а в ответ тишина. дергает меандр по выводам и всё. там ещё и со звуком та же история . ..забил , ё-радио залил- запело. а ежели в этом проекте вся аппаратная часть так жестко завязана - то наверно проще у автора бинарник попросить выложить для успешных повторов проекта.
 

Олег Поляков

★★★✩✩✩✩
18 Янв 2022
137
127
www.1812.ru
@VILUKAS, скачайте ещё раз архив проекта, распакуйте и перепишите папку FontsRus в C:\Users\1\Documents\Arduino\libraries\Adafruit-GFX-Library-master\

Вы в шаге от успешной компиляции.
 

vglukas

✩✩✩✩✩✩✩
5 Мар 2025
14
2
Я это делал уже трижды, и все три раза на позиции - tft.setFont(&mMediaDigital32pt8b); компиляция заканчивается
 

vglukas

✩✩✩✩✩✩✩
5 Мар 2025
14
2
Попробую завтра еще понизить библиотеку, если не сработает, на этом поставим точку.
 

Olegsan

✩✩✩✩✩✩✩
13 Мар 2025
13
1
@vglukas, попробуйте убрать лишние библиотеки на которые ругается из папки , а что за Adafruit-GFX-Library-master .? у меня без мастера версия. сильно также влияет кириллица в путях-дорогах.имя пользователя я у себя менял .
 

iponkada2

★✩✩✩✩✩✩
10 Апр 2024
78
32
@vglukas,
автор Вам сказал что нужно сделать - папку из прошивки FontsRus нужно скопировать в библиотеку Adafruit-GFX-Library, похожее действие делается в Ё-радио для русификации только там заменяем файл в библиотеке, а здесь добавляем папку.
 
Изменено: