ESP8266_WiFi_RADIO ESP_RADIO_onlinе_5.2 EN 583cb09d-a9c7-4119-8d90-ae6324e00899 02cb4dcb-1316-462f-a232-67875efbf524 ESP_RADIO_onlinе_1.2 ESP8266 RADIO ON 8389aad5-e0af-485a-9899-94cd2fd21899 fbdbd2db-8fae-48af-921c-4bea960effdc f2d97d12-ebdf-4f30-889d-ef3ea6a53ddf ESP8266 RADIO Проигрывание радиостанций с помощью только ESP8266 по wi fi, без дополнительных плат! Вход network - URL радиостанции, по умолчанию http: //jazz.streamr.ru/jazz-64.mp3 Папраметры: length_str - длина строки, принят 30. network - название точки доступа на ESP8266, я назвал esp_radio, можете поменять. При подключении ESP8266 к питанию создается точка доступа esp_radio, при подключении к нему открывается в веб браузере страница, в котором нужно поставить название вашей wi fi сети и пароль, ESP подключится к нему и заработает радио по умолчанию. Некоторые радиостанции: http://kpradio.hostingradio.ru:8000/ http://radio.horoshee.fm:8000/mp3 http://kpradio.hostingradio.ru:8000/russia.radiokp128.mp3 http://fomenkofm.hostingradio.ru:8002/fomenkoradio128.mp3 http://icecast.russkoeradio.cdnvideo.ru:8000/rr_m.mp3 http://music.myradio.ua/rep128.mp3 http://jazz.streamr.ru/jazz-128.mp3 http://87.110.219.34:8000/swhmp3 http://87.110.219.34:8000/plusmp3 http://91.90.255.111:80/MixFM_96 https://nashe1.hostingradio.ru:18000/nashe20-64.mp3 http://jazz.streamr.ru/jazz-64.mp3 1084 radiostation jazz.streamr.ru/jazz-64.mp3h 2d2ef667-20e6-4931-b1de-e514800489e2 322a8bbb-7673-49ef-aa15-16e7e13454fd if (ON) { if (newUrl) {newUrl = false; AUDIO_init(); } handleAudio(); } 104 system_update_cpu_freq(SYS_CPU_160MHZ); Serial.begin(115200); 68 #include <Arduino.h> *URL = radiostation; #include <ESP8266WiFi.h> #include "AudioFileSourceICYStream.h" #include "AudioFileSourceBuffer.h" #include "AudioGeneratorMP3.h" #include "AudioOutputI2SNoDAC.h" const char *mp3 ; AudioGeneratorMP3 *file ; AudioFileSourceICYStream *buff ; AudioFileSourceBuffer *out ; AudioOutputI2SNoDAC newUrl = true; bool const char *ptr = reinterpret_cast<const char *>(cbData); (void) isUnicode; char s1[32], s2[64]; strncpy_P(s1, type, sizeof(s1)); s1[sizeof(s1)-1]=0; strncpy_P(s2, string, sizeof(s2)); s2[sizeof(s2)-1]=0; Serial.printf("METADATA(%s) '%s' = '%s'\n", ptr, s1, s2); Serial.flush(); 295 void MDCallback void *cbData const char *type bool isUnicode const char *string const char *ptr = reinterpret_cast<const char *>(cbData); char s1[64]; strncpy_P(s1, string, sizeof(s1)); s1[sizeof(s1)-1]=0; Serial.printf("STATUS(%s) '%d' = '%s'\n", ptr, code, s1); Serial.flush(); 210 void StatusCallback void *cbData int code const char *string static int lastms = 0; if (mp3->isRunning()) { if (millis()-lastms > 1000) { lastms = millis(); Serial.printf("Running for %d ms...\n", lastms); Serial.flush(); } if (!mp3->loop()) mp3->stop(); } else { Serial.printf("MP3 done\n"); delay(1000); Serial.printf("Buffering restart"); ESP.restart(); } 344 void handleAudio file = new AudioFileSourceICYStream(URL); file->RegisterMetadataCB(MDCallback, (void*)"ICY"); buff = new AudioFileSourceBuffer(file, 4096); buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); out = new AudioOutputI2SNoDAC(); mp3 = new AudioGeneratorMP3(); mp3->RegisterStatusCB(StatusCallback, (void*)"mp3"); mp3->begin(buff, out); 357 void AUDIO_init radiostation b8cb5e21-2cae-4448-8903-34b347244e35 6d831ec3-1bb3-48bd-b5c2-2582ae017c49 c9ebc3ba-0b56-44e6-aa5b-2f592dbfbbb3 ESP8266 радио онлайн_1.2 Проигрывание радиостанций с помощью только ESP8266 по wi fi, без дополнительных плат! radiostation - URL радиостанции, по умолчанию http: //jazz.streamr.ru/jazz-64.mp3 Buff - буфер 2048, лучше 4096 или 8196, выбирать в зависимости от памяти ESP8266. Некоторые радиостанции(не проверены): http://kpradio.hostingradio.ru:8000/ http://radio.horoshee.fm:8000/mp3 http://kpradio.hostingradio.ru:8000/russia.radiokp128.mp3 http://fomenkofm.hostingradio.ru:8002/fomenkoradio128.mp3 http://icecast.russkoeradio.cdnvideo.ru:8000/rr_m.mp3 http://music.myradio.ua/rep128.mp3 http://jazz.streamr.ru/jazz-128.mp3 http://87.110.219.34:8000/swhmp3 http://87.110.219.34:8000/plusmp3 http://91.90.255.111:80/MixFM_96 https://nashe1.hostingradio.ru:18000/nashe20-64.mp3 http://jazz.streamr.ru/jazz-64.mp3 803 Buff 2048 da5d8133-740a-42e7-85d4-8faa46a5da7a 5120 aa8d1ea8-4112-4431-96f1-294744687bd7 if (ON) { if (newUrl) { newUrl = false; radiostation.toCharArray(rs_str, radiostation.length()+1); URL=rs_str; file = new AudioFileSourceICYStream(URL); file->RegisterMetadataCB(MDCallback, (void*)"ICY"); buff = new AudioFileSourceBuffer(file, Buff); buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); out = new AudioOutputI2SNoDAC(); mp3 = new AudioGeneratorMP3(); mp3->RegisterStatusCB(StatusCallback, (void*)"mp3"); mp3->begin(buff, out); } handleAudio(); } 540 system_update_cpu_freq(SYS_CPU_160MHZ); //Serial.begin(115200); 70 #include <Arduino.h> #include <ESP8266WiFi.h> #include "AudioFileSourceICYStream.h" #include "AudioFileSourceBuffer.h" #include "AudioGeneratorMP3.h" #include "AudioOutputI2SNoDAC.h" *mp3 ; AudioGeneratorMP3 *file ; AudioFileSourceICYStream *buff ; AudioFileSourceBuffer *out ; AudioOutputI2SNoDAC *URL = ""; const char newUrl = true; bool rs_str [60]; char const char *ptr = reinterpret_cast<const char *>(cbData); (void) isUnicode; // Punt this ball for now // Note that the type and string may be in PROGMEM, so copy them to RAM for printf char s1[32], s2[64]; strncpy_P(s1, type, sizeof(s1)); s1[sizeof(s1)-1]=0; strncpy_P(s2, string, sizeof(s2)); s2[sizeof(s2)-1]=0; Serial.printf("METADATA(%s) '%s' = '%s'\n", ptr, s1, s2); Serial.flush(); 406 const char *ptr = reinterpret_cast<const char *>(cbData); // Note that the string may be in PROGMEM, so copy it to RAM for printf char s1[64]; strncpy_P(s1, string, sizeof(s1)); s1[sizeof(s1)-1]=0; Serial.printf("STATUS(%s) '%d' = '%s'\n", ptr, code, s1); Serial.flush(); 285 static int lastms = 0; if (mp3->isRunning()) { if (millis()-lastms > 1000) { lastms = millis(); Serial.printf("Running for %d ms...\n", lastms); Serial.flush(); } if (!mp3->loop()) mp3->stop(); } else { Serial.printf("MP3 done\n"); delay(1000); Serial.printf("Buffering restart"); ESP.restart(); } 348 file = new AudioFileSourceICYStream(URL); file->RegisterMetadataCB(MDCallback, (void*)"ICY"); buff = new AudioFileSourceBuffer(file, Buff); buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); out = new AudioOutputI2SNoDAC(); mp3 = new AudioGeneratorMP3(); mp3->RegisterStatusCB(StatusCallback, (void*)"mp3"); mp3->begin(buff, out); 350 newUrl f4b8e8bb-1ad6-444f-9e89-b843626c648e 4d16261b-d172-4206-9aff-211fdf3bf018 df402981-0392-45e3-b0d0-c955bc066042 system_update_cpu_freq(SYS_CPU_160MHZ); //Serial.begin(115200); //newUrl= true; 85 #include <Arduino.h> #include <ESP8266WiFi.h> #include "AudioFileSourceICYStream.h" #include "AudioFileSourceBuffer.h" #include "AudioGeneratorMP3.h" #include "AudioOutputI2SNoDAC.h" *mp3 ; AudioGeneratorMP3 *file ; AudioFileSourceICYStream *buff ; AudioFileSourceBuffer *out ; AudioOutputI2SNoDAC *URL = ""; const char rs_str [60]; char ESP_RADIO_onlinе_1.4.1 Buff fc1de471-3bcb-49fc-a916-4bc82b7c5416 10c7d5a2-bb3f-42a1-a351-72272e17ec23 6b67b80c-ef1b-4323-9d5b-dc7f3b48b8ce ESP8266 радио онлайн_1.4.1 if (newUrl) { radiostation.toCharArray(rs_str, radiostation.length()+1); URL=rs_str; file = new AudioFileSourceICYStream(URL); file->RegisterMetadataCB(MDCallback, (void*)"ICY"); buff = new AudioFileSourceBuffer(file, Buff); buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); out = new AudioOutputI2SNoDAC(); mp3 = new AudioGeneratorMP3(); mp3->RegisterStatusCB(StatusCallback, (void*)"mp3"); mp3->begin(buff, out); } handleAudio(); 523 system_update_cpu_freq(SYS_CPU_160MHZ); //Serial.begin(115200); static int lastms = 0; if (mp3->isRunning()) { if (millis()-lastms > 1000) { lastms = millis(); Serial.printf("Running for %d ms...\n", lastms); Serial.flush(); } if (!mp3->loop()) mp3->stop(); } else { Serial.printf("MP3 done\n"); delay(1000); Serial.printf("Buffering restart"); ESP.restart(); } d98ac68c-07f9-4f99-bb06-0507552287fd ESP8266 радио онлайн_5.2 if (EN) { if (newUrl) { out = NULL; if (mp3) { mp3->stop(); delete mp3; mp3 = NULL; } if (buff) { buff->close(); delete buff; buff = NULL; } if (file) { file->close(); delete file; file = NULL; } radiostation.toCharArray(rs_str, radiostation.length()+1); URL=rs_str; file = new AudioFileSourceICYStream(URL); file->RegisterMetadataCB(MDCallback, (void*)"ICY"); buff = new AudioFileSourceBuffer(file, Buff); buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); out = new AudioOutputI2SNoDAC(); mp3 = new AudioGeneratorMP3(); mp3->RegisterStatusCB(StatusCallback, (void*)"mp3"); mp3->begin(buff, out); } handleAudio(); } 754 static int lastms = 0; if (mp3->isRunning()) { if (millis()-lastms > 1000) { lastms = millis(); Serial.printf("Running for %d ms...\n", lastms); Serial.flush(); } if (!mp3->loop()) mp3->stop(); } else { Serial.printf("MP3 done\n"); delay(1000); Serial.printf("Buffering restart"); ESP.restart(); } 342 En ESP8266_WiFi_RADIO_1 Volume 8f4922e6-0057-4ebb-906c-37a0ffc05631 b57e0b99-4d41-47e2-9b12-ebdc99d487d6 ba51b723-7e15-4ae6-a90f-feaeb14d0e9e ESP8266 WiFi радио_1 if (En) {r_stop=true; if (newUrl || restartURL) { restartURL=false; delete mp3; delete buff; delete file; radiostation.toCharArray(rs_str, radiostation.length()+1); URL=rs_str; file = new AudioFileSourceICYStream(URL); buff = new AudioFileSourceBuffer(file, Buff); out = new AudioOutputI2SNoDAC(); out->SetGain((float)Volume); Serial.printf_P(PSTR("Set volume: %d\n"), volume); mp3 = new AudioGeneratorMP3(); mp3->begin(buff, out); printRun=true; } if (mp3->isRunning()) { if (!mp3->loop()) mp3->stop(); if (printRun ) { printRun=false; Serial.printf("Radio = play\n"); Serial.flush(); } } else { Serial.printf("MP3 done\n"); restartURL = true; } } else if (r_stop) { r_stop=false; Serial.printf("Radio = stop\n"); printRun=true; } 1018 #include <Arduino.h> #include <ESP8266WiFi.h> #include "AudioFileSourceICYStream.h" #include "AudioFileSourceBuffer.h" #include "AudioGeneratorMP3.h" #include "AudioOutputI2SNoDAC.h" *mp3 ; AudioGeneratorMP3 *file ; AudioFileSourceICYStream *buff ; AudioFileSourceBuffer *out ; AudioOutputI2SNoDAC *URL = ""; const char rs_str [60]; char restartURL =true; bool printRun =false; bool r_stop = false; bool ESP8266_WiFi_Radio_izm1 ESP8266_WiFi_Radio_izm next_rs e2069a2f-0d57-48c3-a07c-4af8d9c3dbc9 ec1e3a0d-0d4a-4f41-bd7a-509fd8ec1616 c3c89ca6-6a68-476d-8367-7dd2e485fd30 ESP8266 WiFi Pадио_izm Проигрывание радиостанций с помощью только ESP8266 по wi fi, без дополнительных плат! radiostation - URL радиостанции newUrl - запуск установленной радиостанции, (импульсный сигнал) Buff - буфер 2048, лучше 4096 или 8196, выбирать в зависимости от памяти ESP8266. Volume - уровень сигнала с выхода RX Некоторые радиостанции (проверены, можно скопировать отсюда): http://icecast.russkoeradio.cdnvideo.ru:8000/rr_m.mp3 http://jazz.streamr.ru/jazz-64.mp3 http://stream0.radiostyle.ru:8000/rapicom http://nashe1.hostingradio.ru/rock-256 http://91.190.117.131:8000/live http://online.radiorecord.ru:8102/sd90_128 http://icecast.vgtrk.cdnvideo.ru/kulturafm_mp3_128kbps Цифры в конце URL (128kbps, 256) битрейт , ставьте не более 128, лучше еще меньше , чтобы не заикался. И уровень WiFi сети должна быть хорошей. 813 time 1000 250 039e50ce-87e6-4833-97ea-74c6042e5e57 2000 451739f7-8170-44db-bc23-391e41094018 if (En) {r_stop=true; if (newUrl || restartURL) { restartURL=false; next_rs=false; delete mp3; delete buff; delete file; radiostation.toCharArray(rs_str, radiostation.length()+1); URL=rs_str; file = new AudioFileSourceICYStream(URL); buff = new AudioFileSourceBuffer(file, Buff); out = new AudioOutputI2SNoDAC(); out->SetGain(((float)Volume)/100.0); Serial.printf_P(PSTR("Set Volume: %d\n"), Volume); mp3 = new AudioGeneratorMP3(); mp3->begin(buff, out); printRun=true; printRun1=true; } if (mp3->isRunning()) { if (!mp3->loop()) mp3->stop(); if (printRun ) { printRun=false; Serial.printf("Radio = play\n"); } } else { if (printRun1 ) { printRun1=false; Serial.printf("MP3 done\n"); } if (millis()-lastms > time) { lastms = millis(); next_rs= true; restartURL = true; } } } else if (r_stop) { r_stop=false; Serial.printf("Radio = stop\n"); printRun=true; } 1252 #include <Arduino.h> #include "AudioFileSourceICYStream.h" #include "AudioFileSourceBuffer.h" #include "AudioGeneratorMP3.h" #include "AudioOutputI2SNoDAC.h" *mp3 ; AudioGeneratorMP3 *file ; AudioFileSourceICYStream *buff ; AudioFileSourceBuffer *out ; AudioOutputI2SNoDAC *URL = ""; const char rs_str [60]; char restartURL =true; bool printRun =false; bool printRun1 =false; bool r_stop = false; bool lastms = 0; static int status_radio 517e1f77-84c4-47eb-981e-513050ece78b 11b3ac28-d0e1-4e61-9517-febaf9c4e202 295fb095-2437-4d0c-ac26-fd2871558b63 ESP8266 WiFi Pадио_izm1 Проигрывание радиостанций с помощью только ESP8266 по wi fi, без дополнительных плат! radiostation - URL радиостанции newUrl - запуск установленной радиостанции, (импульсный сигнал) Buff - буфер 2048, лучше 4096 или до 8196, выбирать в зависимости от памяти ESP8266. Volume - уровень сигнала с выхода RX Параметры: time - время через которое появится импульс на выходе next_rs при сбое или включении неработающей р/станции. Некоторые радиостанции (проверены, можно скопировать отсюда): http://icecast.russkoeradio.cdnvideo.ru:8000/rr_m.mp3 http://jazz.streamr.ru/jazz-64.mp3 http://stream0.radiostyle.ru:8000/rapicom http://nashe1.hostingradio.ru/rock-256 http://91.190.117.131:8000/live http://online.radiorecord.ru:8102/sd90_128 http://icecast.vgtrk.cdnvideo.ru/kulturafm_mp3_128kbps Цифры в конце URL (128kbps, 256) битрейт , ставьте не более 128, лучше еще меньше , чтобы не заикался. И уровень WiFi сети должна быть хорошей. 937 if (En) {r_stop=true; if (newUrl || restartURL) { restartURL=false; next_rs=false; delete mp3; delete buff; delete file; radiostation.toCharArray(rs_str, radiostation.length()+1); URL=rs_str; file = new AudioFileSourceICYStream(URL); buff = new AudioFileSourceBuffer(file, Buff); out = new AudioOutputI2SNoDAC(); out->SetGain(((float)Volume)/100.0); Serial.printf_P(PSTR("Set Volume: %d\n"), Volume); mp3 = new AudioGeneratorMP3(); mp3->begin(buff, out); printRun=true; printRun1=true; } if (mp3->isRunning()) { if (!mp3->loop()) mp3->stop(); if (printRun ) { printRun=false; Serial.printf("Radio = play\n"); status_radio = 1; } } else { if (printRun1 ) { printRun1=false; Serial.printf("MP3 done\n"); } if (millis()-lastms > time) { lastms = millis(); next_rs= true; restartURL = true; } } } else if (r_stop) { r_stop=false; Serial.printf("Radio = stop\n"); status_radio = 0; printRun=true; } 1265 singl_name 6540ef35-f930-44e0-a72f-5a1ea09bb305 ac42743e-184c-42a3-85c8-89493bee1b12 17c1c10f-7b8b-4021-9cbc-647e5f4c8a22 if (En) {r_stop=true; if (newUrl || restartURL) { restartURL=false; next_rs=false; out = NULL; singl_name = ""; if (mp3) { mp3->stop(); delete mp3; mp3 = NULL; } if (buff) { buff->close(); delete buff; buff = NULL; } if (file) { file->close(); delete file; file = NULL; } radiostation.toCharArray(rs_str, radiostation.length()+1); URL=rs_str; file = new AudioFileSourceICYStream(URL); buff = new AudioFileSourceBuffer(file, Buff); out = new AudioOutputI2SNoDAC(); out->SetGain(((float)Volume)/100.0); Serial.printf_P(PSTR("Set Volume: %d\n"), Volume); mp3 = new AudioGeneratorMP3(); mp3->begin(buff, out); printRun=true; printRun1=true; } if (mp3->isRunning()) { if (!mp3->loop()) mp3->stop(); if (printRun ) { printRun=false; Serial.printf("Radio = play\n"); } status_radio = true; } else { if (printRun1 ) { printRun1=false; Serial.printf("MP3 done\n"); } if (millis()-lastms > time) { lastms = millis(); next_rs= true; restartURL = true; } } } else { status_radio = false; if (r_stop) { r_stop=false; Serial.printf("Radio = stop\n"); printRun=true; } } 1431 #include <Arduino.h> #include "AudioFileSourceICYStream.h" #include "AudioFileSourceBuffer.h" #include "AudioGeneratorMP3.h" #include "AudioOutputI2SNoDAC.h" *mp3 ; AudioGeneratorMP3 *file ; AudioFileSourceICYStream *buff ; AudioFileSourceBuffer *out ; AudioOutputI2SNoDAC *URL = ""; const char rs_str [60]; char restartURL =true; bool printRun =false; bool printRun1 =false; bool r_stop = false; bool lastms = 0; static int const char *ptr = reinterpret_cast<const char *>(cbData); (void) isUnicode; // Punt this ball for now // Note that the type and string may be in PROGMEM, so copy them to RAM for printf char s1[32], s2[64]; strncpy_P(s1, type, sizeof(s1)); s1[sizeof(s1)-1]=0; strncpy_P(s2, string, sizeof(s2)); s2[sizeof(s2)-1]=0; Serial.printf("METADATA(%s) '%s' = '%s'\n", ptr, s1, s2); Serial.flush(); if (String(s1)=="StreamTitle") { singl_name = s2; } 482 void MDCallback void *cbData const char *type bool isUnicode const char *string const char *ptr = reinterpret_cast<const char *>(cbData); // Note that the string may be in PROGMEM, so copy it to RAM for printf char s1[64]; strncpy_P(s1, string, sizeof(s1)); s1[sizeof(s1)-1]=0; Serial.printf("STATUS(%s) '%d' = '%s'\n", ptr, code, s1); Serial.flush(); void StatusCallback void *cbData int code const char *string 907a7a62-91e9-4fe4-a97c-982281e88732 ESP8266 WiFi РАДИО Проигрывание радиостанций с помощью только ESP8266 по wi fi, без дополнительных плат! Выход звука на пинах ESP8266 GND и TX. Можно напрямую подключить наушники. Звук только моно. Входы: En - вкл и выкл блока; radiostation - URL радиостанции; newUrl - запуск установленной радиостанции, (импульсный сигнал); Buff - буфер от 2048, я ставил 4096 , выбирать в зависимости от памяти ESP8266; Volume - уровень сигнала с выхода RX. Выходы: status_radio - состояние радио, если включено true, иначе - false; next_rs - появится импульс при сбое или включении неработающей р/станции. singl_name - вывод имени исполнителя и трека. Параметры: time - время через которое появится импульс на выходе next_rs при сбое или включении неработающей р/станции. Некоторые радиостанции (проверены, можно скопировать отсюда): http://icecast.russkoeradio.cdnvideo.ru:8000/rr_m.mp3 http://jazz.streamr.ru/jazz-64.mp3 http://stream0.radiostyle.ru:8000/rapicom http://nashe1.hostingradio.ru/rock-256 http://91.190.117.131:8000/live http://online.radiorecord.ru:8102/sd90_128 http://icecast.vgtrk.cdnvideo.ru/kulturafm_mp3_128kbps Цифры в конце URL (128kbps, 256) битрейт , ставьте URL не более 128, лучше еще меньше , если заикается часто. И уровень WiFi сети должна быть хорошей. Проверял URL с битрейт 320, у меня радио работало хорошо! aidar_i 03/2019 1339 if (En) {r_stop=true; if (newUrl || restartURL) { restartURL=false; next_rs=false; out = NULL; singl_name = ""; if (mp3) { mp3->stop(); delete mp3; mp3 = NULL; } if (buff) { buff->close(); delete buff; buff = NULL; } if (file) { file->close(); delete file; file = NULL; } radiostation.toCharArray(rs_str, radiostation.length()+1); URL=rs_str; file = new AudioFileSourceICYStream(URL); file->RegisterMetadataCB(MDCallback, (void*)"ICY"); buff = new AudioFileSourceBuffer(file, Buff); buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); out = new AudioOutputI2SNoDAC(); out->SetGain(((float)Volume)/100.0); Serial.printf_P(PSTR("Set Volume: %d\n"), Volume); mp3 = new AudioGeneratorMP3(); mp3->RegisterStatusCB(StatusCallback, (void*)"mp3"); mp3->begin(buff, out); printRun=true; printRun1=true; } if (mp3->isRunning()) { if (!mp3->loop()) mp3->stop(); if (printRun ) { printRun=false; Serial.printf("Radio = play\n"); } status_radio = true; } else { if (printRun1 ) { printRun1=false; Serial.printf("MP3 done\n"); } if (millis()-lastms > time) { lastms = millis(); next_rs= true; restartURL = true; } } } else { status_radio = false; if (r_stop) { r_stop=false; Serial.printf("Radio = stop\n"); printRun=true; } } 1602 system_update_cpu_freq(SYS_CPU_160MHZ); Serial.begin(115200); 64 const char *ptr = reinterpret_cast<const char *>(cbData); (void) isUnicode; // Punt this ball for now // Note that the type and string may be in PROGMEM, so copy them to RAM for printf char s1[300], s2[300]; strncpy_P(s1, type, sizeof(s1)); s1[sizeof(s1)-1]=0; strncpy_P(s2, string, sizeof(s2)); s2[sizeof(s2)-1]=0; Serial.printf("METADATA(%s) '%s' = '%s'\n", ptr, s1, s2); Serial.flush(); if (String(s1)=="StreamTitle") { singl_name = s2; } 484 ESP8266_WiFi_RADIO_I2S 59ebb734-9440-4d14-8ff0-bf5e62078704 ESP8266 WiFi РАДИО_I2S (PCM5102) Проигрывание радиостанций с помощью ESP8266 по wi fi, c использованием дополнительной платы РСМ5102. Стерео! Качество звука отличное, исчезают помехи. Подключение: ESP8266 ESP pin - I2S PCM5102 -------------------------------------- GPIO2 (D4) -> LRCK GPIO3 (RX) -> DATA GPIO15(D8) -> BCLK В скобках Wemos D1 mini и тп. Входы: En - вкл и выкл блока; radiostation - URL радиостанции; newUrl - запуск установленной радиостанции, (импульсный сигнал); Buff - буфер 2048, я ставил 4096 , выбирать в зависимости от памяти ESP8266; Volume - уровень сигнала с выхода. Выходы: status_radio - состояние радио, если включено true, иначе - false; next_rs - появится импульс при сбое или включении неработающей р/станции. singl_name - вывод имени исполнителя и трека. Параметры: time - время через которое появится импульс на выходе next_rs при сбое или включении неработающей р/станции. Некоторые радиостанции (проверены, можно скопировать отсюда): http://icecast.russkoeradio.cdnvideo.ru:8000/rr_m.mp3 http://jazz.streamr.ru/jazz-64.mp3 http://stream0.radiostyle.ru:8000/rapicom http://nashe1.hostingradio.ru/rock-256 http://91.190.117.131:8000/live http://online.radiorecord.ru:8102/sd90_128 http://icecast.vgtrk.cdnvideo.ru/kulturafm_mp3_128kbps Цифры в конце URL (128kbps, 256) битрейт , ставьте не более 128, лучше еще меньше , чтобы не заикался. И уровень WiFi сети должна быть хорошей. 1399 if (En) {r_stop=true; if (newUrl || restartURL) { restartURL=false; next_rs=false; out = NULL; singl_name = ""; if (mp3) { mp3->stop(); delete mp3; mp3 = NULL; } if (buff) { buff->close(); delete buff; buff = NULL; } if (file) { file->close(); delete file; file = NULL; } radiostation.toCharArray(rs_str, radiostation.length()+1); URL=rs_str; file = new AudioFileSourceICYStream(URL); file->RegisterMetadataCB(MDCallback, (void*)"ICY"); buff = new AudioFileSourceBuffer(file, Buff); buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); out = new AudioOutputI2S(); out->SetGain(((float)Volume)/100.0); Serial.printf_P(PSTR("Set Volume: %d\n"), Volume); mp3 = new AudioGeneratorMP3(); mp3->RegisterStatusCB(StatusCallback, (void*)"mp3"); mp3->begin(buff, out); printRun=true; printRun1=true; } if (mp3->isRunning()) { if (!mp3->loop()) mp3->stop(); if (printRun ) { printRun=false; Serial.printf("Radio = play\n"); } status_radio = true; } else { if (printRun1 ) { printRun1=false; Serial.printf("MP3 done\n"); } if (millis()-lastms > time) { lastms = millis(); next_rs= true; restartURL = true; } } } else { status_radio = false; if (r_stop) { r_stop=false; Serial.printf("Radio = stop\n"); printRun=true; } } 1597 #include <Arduino.h> #include "AudioFileSourceICYStream.h" #include "AudioFileSourceBuffer.h" #include "AudioGeneratorMP3.h" #include "AudioOutputI2S.h" *mp3 ; AudioGeneratorMP3 *file ; AudioFileSourceICYStream *buff ; AudioFileSourceBuffer *out ; AudioOutputI2S *URL = ""; const char rs_str [60]; char restartURL =true; bool printRun =false; bool printRun1 =false; bool r_stop = false; bool lastms = 0; static int ESP8266_WiFi_RADIO_SPIRAM 3c2717a0-5638-48ea-8046-d1e2337f9c10 ESP8266 WiFi РАДИО с внешней памятью Проигрывание радиостанций с помощью только ESP8266 по wi fi, с дополнительной внешней памятью на микросхеме 23LC1024-ISN. Дополнительная память уменьшает количество перебоев, также радио работает еще 7-8 сек после сбоя (выключения) WiFi сети. Выход звука на пинах ESP8266 GND и TX. Можно напрямую подключить наушники. Звук только моно. Входы: En - вкл и выкл блока; radiostation - URL радиостанции; newUrl - запуск установленной радиостанции, (импульсный сигнал); Buff - размер буфера в доп памяти выбираем 128KByte (131072 байта); Volume - уровень сигнала с выхода RX. Выходы: status_radio - состояние радио, если включено true, иначе - false; next_rs - появится импульс при сбое или включении неработающей р/станции. singl_name - вывод имени исполнителя и трека. Параметры: time - время через которое появится импульс на выходе next_rs при сбое или включении неработающей р/станции. pin_Cs - подключение 1 вывода микросхемы памяти. По умолчанию GPIO 4 (D2). Некоторые радиостанции (проверены, можно скопировать отсюда): http://icecast.russkoeradio.cdnvideo.ru:8000/rr_m.mp3 http://jazz.streamr.ru/jazz-64.mp3 http://stream0.radiostyle.ru:8000/rapicom http://nashe1.hostingradio.ru/rock-256 http://91.190.117.131:8000/live http://online.radiorecord.ru:8102/sd90_128 http://icecast.vgtrk.cdnvideo.ru/kulturafm_mp3_128kbps Цифры в конце URL (128kbps, 256) битрейт , ставьте URL не более 128, лучше еще меньше , если заикается часто. И уровень WiFi сети должна быть хорошей. Проверял URL с битрейт 320, у меня радио работало хорошо! aidar_i 03/2019 1560 pin_Cs 4 CS (1 вывод микросхемы) 08291e5b-0149-4c68-9cc8-1b5b55e8f7e5 e33137e9-69c5-42cf-999e-9a1574fd1d61 if (En) {r_stop=true; if (newUrl || restartURL) { restartURL=false; next_rs=false; out = NULL; singl_name = ""; if (mp3) { mp3->stop(); delete mp3; mp3 = NULL; } if (buff) { buff->close(); delete buff; buff = NULL; } if (file) { file->close(); delete file; file = NULL; } radiostation.toCharArray(rs_str, radiostation.length()+1); URL=rs_str; file = new AudioFileSourceICYStream(URL); file->RegisterMetadataCB(MDCallback, (void*)"ICY"); buff = new AudioFileSourceSPIRAMBuffer(file, pin_Cs, Buff); buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); out = new AudioOutputI2SNoDAC(); out->SetGain(((float)Volume)/100.0); Serial.printf_P(PSTR("Set Volume: %d\n"), Volume); mp3 = new AudioGeneratorMP3(); mp3->RegisterStatusCB(StatusCallback, (void*)"mp3"); mp3->begin(buff, out); printRun=true; printRun1=true; } if (mp3->isRunning()) { if (!mp3->loop()) mp3->stop(); if (printRun ) { printRun=false; Serial.printf("Radio = play\n"); } status_radio = true; } else { if (printRun1 ) { printRun1=false; Serial.printf("MP3 done\n"); } if (millis()-lastms > time) { lastms = millis(); next_rs= true; restartURL = true; } } } else { status_radio = false; if (r_stop) { r_stop=false; Serial.printf("Radio = stop\n"); printRun=true; } } 1616 #include <Arduino.h> #include "AudioFileSourceICYStream.h" #include "AudioFileSourceSPIRAMBuffer.h" #include "AudioGeneratorMP3.h" #include "AudioOutputI2SNoDAC.h" *mp3 ; AudioGeneratorMP3 *file ; AudioFileSourceICYStream *buff ; AudioFileSourceSPIRAMBuffer *out ; AudioOutputI2SNoDAC *URL = ""; const char rs_str [60]; char restartURL =true; bool printRun =false; bool printRun1 =false; bool r_stop = false; bool lastms = 0; static int ESP8266_WiFi_RADIO_I2S_SPIRAM ESP_RADIO_onlinе_5.2 EN 583cb09d-a9c7-4119-8d90-ae6324e00899 02cb4dcb-1316-462f-a232-67875efbf524 ESP_RADIO_onlinе_1.2 ESP8266 RADIO ON 8389aad5-e0af-485a-9899-94cd2fd21899 fbdbd2db-8fae-48af-921c-4bea960effdc f2d97d12-ebdf-4f30-889d-ef3ea6a53ddf ESP8266 RADIO Проигрывание радиостанций с помощью только ESP8266 по wi fi, без дополнительных плат! Вход network - URL радиостанции, по умолчанию http: //jazz.streamr.ru/jazz-64.mp3 Папраметры: length_str - длина строки, принят 30. network - название точки доступа на ESP8266, я назвал esp_radio, можете поменять. При подключении ESP8266 к питанию создается точка доступа esp_radio, при подключении к нему открывается в веб браузере страница, в котором нужно поставить название вашей wi fi сети и пароль, ESP подключится к нему и заработает радио по умолчанию. Некоторые радиостанции: http://kpradio.hostingradio.ru:8000/ http://radio.horoshee.fm:8000/mp3 http://kpradio.hostingradio.ru:8000/russia.radiokp128.mp3 http://fomenkofm.hostingradio.ru:8002/fomenkoradio128.mp3 http://icecast.russkoeradio.cdnvideo.ru:8000/rr_m.mp3 http://music.myradio.ua/rep128.mp3 http://jazz.streamr.ru/jazz-128.mp3 http://87.110.219.34:8000/swhmp3 http://87.110.219.34:8000/plusmp3 http://91.90.255.111:80/MixFM_96 https://nashe1.hostingradio.ru:18000/nashe20-64.mp3 http://jazz.streamr.ru/jazz-64.mp3 radiostation jazz.streamr.ru/jazz-64.mp3h 2d2ef667-20e6-4931-b1de-e514800489e2 322a8bbb-7673-49ef-aa15-16e7e13454fd if (ON) { if (newUrl) {newUrl = false; AUDIO_init(); } handleAudio(); } system_update_cpu_freq(SYS_CPU_160MHZ); Serial.begin(115200); #include <Arduino.h> *URL = radiostation; #include <ESP8266WiFi.h> #include "AudioFileSourceICYStream.h" #include "AudioFileSourceBuffer.h" #include "AudioGeneratorMP3.h" #include "AudioOutputI2SNoDAC.h" const char *mp3 ; AudioGeneratorMP3 *file ; AudioFileSourceICYStream *buff ; AudioFileSourceBuffer *out ; AudioOutputI2SNoDAC newUrl = true; bool const char *ptr = reinterpret_cast<const char *>(cbData); (void) isUnicode; char s1[32], s2[64]; strncpy_P(s1, type, sizeof(s1)); s1[sizeof(s1)-1]=0; strncpy_P(s2, string, sizeof(s2)); s2[sizeof(s2)-1]=0; Serial.printf("METADATA(%s) '%s' = '%s'\n", ptr, s1, s2); Serial.flush(); void MDCallback void *cbData const char *type bool isUnicode const char *string const char *ptr = reinterpret_cast<const char *>(cbData); char s1[64]; strncpy_P(s1, string, sizeof(s1)); s1[sizeof(s1)-1]=0; Serial.printf("STATUS(%s) '%d' = '%s'\n", ptr, code, s1); Serial.flush(); void StatusCallback void *cbData int code const char *string static int lastms = 0; if (mp3->isRunning()) { if (millis()-lastms > 1000) { lastms = millis(); Serial.printf("Running for %d ms...\n", lastms); Serial.flush(); } if (!mp3->loop()) mp3->stop(); } else { Serial.printf("MP3 done\n"); delay(1000); Serial.printf("Buffering restart"); ESP.restart(); } void handleAudio file = new AudioFileSourceICYStream(URL); file->RegisterMetadataCB(MDCallback, (void*)"ICY"); buff = new AudioFileSourceBuffer(file, 4096); buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); out = new AudioOutputI2SNoDAC(); mp3 = new AudioGeneratorMP3(); mp3->RegisterStatusCB(StatusCallback, (void*)"mp3"); mp3->begin(buff, out); void AUDIO_init radiostation b8cb5e21-2cae-4448-8903-34b347244e35 6d831ec3-1bb3-48bd-b5c2-2582ae017c49 c9ebc3ba-0b56-44e6-aa5b-2f592dbfbbb3 ESP8266 радио онлайн_1.2 Проигрывание радиостанций с помощью только ESP8266 по wi fi, без дополнительных плат! radiostation - URL радиостанции, по умолчанию http: //jazz.streamr.ru/jazz-64.mp3 Buff - буфер 2048, лучше 4096 или 8196, выбирать в зависимости от памяти ESP8266. Некоторые радиостанции(не проверены): http://kpradio.hostingradio.ru:8000/ http://radio.horoshee.fm:8000/mp3 http://kpradio.hostingradio.ru:8000/russia.radiokp128.mp3 http://fomenkofm.hostingradio.ru:8002/fomenkoradio128.mp3 http://icecast.russkoeradio.cdnvideo.ru:8000/rr_m.mp3 http://music.myradio.ua/rep128.mp3 http://jazz.streamr.ru/jazz-128.mp3 http://87.110.219.34:8000/swhmp3 http://87.110.219.34:8000/plusmp3 http://91.90.255.111:80/MixFM_96 https://nashe1.hostingradio.ru:18000/nashe20-64.mp3 http://jazz.streamr.ru/jazz-64.mp3 Buff da5d8133-740a-42e7-85d4-8faa46a5da7a aa8d1ea8-4112-4431-96f1-294744687bd7 if (ON) { if (newUrl) { newUrl = false; radiostation.toCharArray(rs_str, radiostation.length()+1); URL=rs_str; file = new AudioFileSourceICYStream(URL); file->RegisterMetadataCB(MDCallback, (void*)"ICY"); buff = new AudioFileSourceBuffer(file, Buff); buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); out = new AudioOutputI2SNoDAC(); mp3 = new AudioGeneratorMP3(); mp3->RegisterStatusCB(StatusCallback, (void*)"mp3"); mp3->begin(buff, out); } handleAudio(); } system_update_cpu_freq(SYS_CPU_160MHZ); //Serial.begin(115200); #include <Arduino.h> #include <ESP8266WiFi.h> #include "AudioFileSourceICYStream.h" #include "AudioFileSourceBuffer.h" #include "AudioGeneratorMP3.h" #include "AudioOutputI2SNoDAC.h" *mp3 ; AudioGeneratorMP3 *file ; AudioFileSourceICYStream *buff ; AudioFileSourceBuffer *out ; AudioOutputI2SNoDAC *URL = ""; const char newUrl = true; bool rs_str [60]; char const char *ptr = reinterpret_cast<const char *>(cbData); (void) isUnicode; // Punt this ball for now // Note that the type and string may be in PROGMEM, so copy them to RAM for printf char s1[32], s2[64]; strncpy_P(s1, type, sizeof(s1)); s1[sizeof(s1)-1]=0; strncpy_P(s2, string, sizeof(s2)); s2[sizeof(s2)-1]=0; Serial.printf("METADATA(%s) '%s' = '%s'\n", ptr, s1, s2); Serial.flush(); const char *ptr = reinterpret_cast<const char *>(cbData); // Note that the string may be in PROGMEM, so copy it to RAM for printf char s1[64]; strncpy_P(s1, string, sizeof(s1)); s1[sizeof(s1)-1]=0; Serial.printf("STATUS(%s) '%d' = '%s'\n", ptr, code, s1); Serial.flush(); static int lastms = 0; if (mp3->isRunning()) { if (millis()-lastms > 1000) { lastms = millis(); Serial.printf("Running for %d ms...\n", lastms); Serial.flush(); } if (!mp3->loop()) mp3->stop(); } else { Serial.printf("MP3 done\n"); delay(1000); Serial.printf("Buffering restart"); ESP.restart(); } file = new AudioFileSourceICYStream(URL); file->RegisterMetadataCB(MDCallback, (void*)"ICY"); buff = new AudioFileSourceBuffer(file, Buff); buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); out = new AudioOutputI2SNoDAC(); mp3 = new AudioGeneratorMP3(); mp3->RegisterStatusCB(StatusCallback, (void*)"mp3"); mp3->begin(buff, out); newUrl f4b8e8bb-1ad6-444f-9e89-b843626c648e 4d16261b-d172-4206-9aff-211fdf3bf018 df402981-0392-45e3-b0d0-c955bc066042 system_update_cpu_freq(SYS_CPU_160MHZ); //Serial.begin(115200); //newUrl= true; #include <Arduino.h> #include <ESP8266WiFi.h> #include "AudioFileSourceICYStream.h" #include "AudioFileSourceBuffer.h" #include "AudioGeneratorMP3.h" #include "AudioOutputI2SNoDAC.h" *mp3 ; AudioGeneratorMP3 *file ; AudioFileSourceICYStream *buff ; AudioFileSourceBuffer *out ; AudioOutputI2SNoDAC *URL = ""; const char rs_str [60]; char ESP_RADIO_onlinе_1.4.1 Buff fc1de471-3bcb-49fc-a916-4bc82b7c5416 10c7d5a2-bb3f-42a1-a351-72272e17ec23 6b67b80c-ef1b-4323-9d5b-dc7f3b48b8ce ESP8266 радио онлайн_1.4.1 if (newUrl) { radiostation.toCharArray(rs_str, radiostation.length()+1); URL=rs_str; file = new AudioFileSourceICYStream(URL); file->RegisterMetadataCB(MDCallback, (void*)"ICY"); buff = new AudioFileSourceBuffer(file, Buff); buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); out = new AudioOutputI2SNoDAC(); mp3 = new AudioGeneratorMP3(); mp3->RegisterStatusCB(StatusCallback, (void*)"mp3"); mp3->begin(buff, out); } handleAudio(); system_update_cpu_freq(SYS_CPU_160MHZ); //Serial.begin(115200); static int lastms = 0; if (mp3->isRunning()) { if (millis()-lastms > 1000) { lastms = millis(); Serial.printf("Running for %d ms...\n", lastms); Serial.flush(); } if (!mp3->loop()) mp3->stop(); } else { Serial.printf("MP3 done\n"); delay(1000); Serial.printf("Buffering restart"); ESP.restart(); } d98ac68c-07f9-4f99-bb06-0507552287fd ESP8266 радио онлайн_5.2 if (EN) { if (newUrl) { out = NULL; if (mp3) { mp3->stop(); delete mp3; mp3 = NULL; } if (buff) { buff->close(); delete buff; buff = NULL; } if (file) { file->close(); delete file; file = NULL; } radiostation.toCharArray(rs_str, radiostation.length()+1); URL=rs_str; file = new AudioFileSourceICYStream(URL); file->RegisterMetadataCB(MDCallback, (void*)"ICY"); buff = new AudioFileSourceBuffer(file, Buff); buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); out = new AudioOutputI2SNoDAC(); mp3 = new AudioGeneratorMP3(); mp3->RegisterStatusCB(StatusCallback, (void*)"mp3"); mp3->begin(buff, out); } handleAudio(); } static int lastms = 0; if (mp3->isRunning()) { if (millis()-lastms > 1000) { lastms = millis(); Serial.printf("Running for %d ms...\n", lastms); Serial.flush(); } if (!mp3->loop()) mp3->stop(); } else { Serial.printf("MP3 done\n"); delay(1000); Serial.printf("Buffering restart"); ESP.restart(); } En ESP8266_WiFi_RADIO_1 Volume 8f4922e6-0057-4ebb-906c-37a0ffc05631 b57e0b99-4d41-47e2-9b12-ebdc99d487d6 ba51b723-7e15-4ae6-a90f-feaeb14d0e9e ESP8266 WiFi радио_1 if (En) {r_stop=true; if (newUrl || restartURL) { restartURL=false; delete mp3; delete buff; delete file; radiostation.toCharArray(rs_str, radiostation.length()+1); URL=rs_str; file = new AudioFileSourceICYStream(URL); buff = new AudioFileSourceBuffer(file, Buff); out = new AudioOutputI2SNoDAC(); out->SetGain((float)Volume); Serial.printf_P(PSTR("Set volume: %d\n"), volume); mp3 = new AudioGeneratorMP3(); mp3->begin(buff, out); printRun=true; } if (mp3->isRunning()) { if (!mp3->loop()) mp3->stop(); if (printRun ) { printRun=false; Serial.printf("Radio = play\n"); Serial.flush(); } } else { Serial.printf("MP3 done\n"); restartURL = true; } } else if (r_stop) { r_stop=false; Serial.printf("Radio = stop\n"); printRun=true; } #include <Arduino.h> #include <ESP8266WiFi.h> #include "AudioFileSourceICYStream.h" #include "AudioFileSourceBuffer.h" #include "AudioGeneratorMP3.h" #include "AudioOutputI2SNoDAC.h" *mp3 ; AudioGeneratorMP3 *file ; AudioFileSourceICYStream *buff ; AudioFileSourceBuffer *out ; AudioOutputI2SNoDAC *URL = ""; const char rs_str [60]; char restartURL =true; bool printRun =false; bool r_stop = false; bool ESP8266_WiFi_Radio_izm1 ESP8266_WiFi_Radio_izm next_rs e2069a2f-0d57-48c3-a07c-4af8d9c3dbc9 ec1e3a0d-0d4a-4f41-bd7a-509fd8ec1616 c3c89ca6-6a68-476d-8367-7dd2e485fd30 ESP8266 WiFi Pадио_izm Проигрывание радиостанций с помощью только ESP8266 по wi fi, без дополнительных плат! radiostation - URL радиостанции newUrl - запуск установленной радиостанции, (импульсный сигнал) Buff - буфер 2048, лучше 4096 или 8196, выбирать в зависимости от памяти ESP8266. Volume - уровень сигнала с выхода RX Некоторые радиостанции (проверены, можно скопировать отсюда): http://icecast.russkoeradio.cdnvideo.ru:8000/rr_m.mp3 http://jazz.streamr.ru/jazz-64.mp3 http://stream0.radiostyle.ru:8000/rapicom http://nashe1.hostingradio.ru/rock-256 http://91.190.117.131:8000/live http://online.radiorecord.ru:8102/sd90_128 http://icecast.vgtrk.cdnvideo.ru/kulturafm_mp3_128kbps Цифры в конце URL (128kbps, 256) битрейт , ставьте не более 128, лучше еще меньше , чтобы не заикался. И уровень WiFi сети должна быть хорошей. time 039e50ce-87e6-4833-97ea-74c6042e5e57 451739f7-8170-44db-bc23-391e41094018 if (En) {r_stop=true; if (newUrl || restartURL) { restartURL=false; next_rs=false; delete mp3; delete buff; delete file; radiostation.toCharArray(rs_str, radiostation.length()+1); URL=rs_str; file = new AudioFileSourceICYStream(URL); buff = new AudioFileSourceBuffer(file, Buff); out = new AudioOutputI2SNoDAC(); out->SetGain(((float)Volume)/100.0); Serial.printf_P(PSTR("Set Volume: %d\n"), Volume); mp3 = new AudioGeneratorMP3(); mp3->begin(buff, out); printRun=true; printRun1=true; } if (mp3->isRunning()) { if (!mp3->loop()) mp3->stop(); if (printRun ) { printRun=false; Serial.printf("Radio = play\n"); } } else { if (printRun1 ) { printRun1=false; Serial.printf("MP3 done\n"); } if (millis()-lastms > time) { lastms = millis(); next_rs= true; restartURL = true; } } } else if (r_stop) { r_stop=false; Serial.printf("Radio = stop\n"); printRun=true; } #include <Arduino.h> #include "AudioFileSourceICYStream.h" #include "AudioFileSourceBuffer.h" #include "AudioGeneratorMP3.h" #include "AudioOutputI2SNoDAC.h" *mp3 ; AudioGeneratorMP3 *file ; AudioFileSourceICYStream *buff ; AudioFileSourceBuffer *out ; AudioOutputI2SNoDAC *URL = ""; const char rs_str [60]; char restartURL =true; bool printRun =false; bool printRun1 =false; bool r_stop = false; bool lastms = 0; static int status_radio 517e1f77-84c4-47eb-981e-513050ece78b 11b3ac28-d0e1-4e61-9517-febaf9c4e202 295fb095-2437-4d0c-ac26-fd2871558b63 ESP8266 WiFi Pадио_izm1 Проигрывание радиостанций с помощью только ESP8266 по wi fi, без дополнительных плат! radiostation - URL радиостанции newUrl - запуск установленной радиостанции, (импульсный сигнал) Buff - буфер 2048, лучше 4096 или до 8196, выбирать в зависимости от памяти ESP8266. Volume - уровень сигнала с выхода RX Параметры: time - время через которое появится импульс на выходе next_rs при сбое или включении неработающей р/станции. Некоторые радиостанции (проверены, можно скопировать отсюда): http://icecast.russkoeradio.cdnvideo.ru:8000/rr_m.mp3 http://jazz.streamr.ru/jazz-64.mp3 http://stream0.radiostyle.ru:8000/rapicom http://nashe1.hostingradio.ru/rock-256 http://91.190.117.131:8000/live http://online.radiorecord.ru:8102/sd90_128 http://icecast.vgtrk.cdnvideo.ru/kulturafm_mp3_128kbps Цифры в конце URL (128kbps, 256) битрейт , ставьте не более 128, лучше еще меньше , чтобы не заикался. И уровень WiFi сети должна быть хорошей. if (En) {r_stop=true; if (newUrl || restartURL) { restartURL=false; next_rs=false; delete mp3; delete buff; delete file; radiostation.toCharArray(rs_str, radiostation.length()+1); URL=rs_str; file = new AudioFileSourceICYStream(URL); buff = new AudioFileSourceBuffer(file, Buff); out = new AudioOutputI2SNoDAC(); out->SetGain(((float)Volume)/100.0); Serial.printf_P(PSTR("Set Volume: %d\n"), Volume); mp3 = new AudioGeneratorMP3(); mp3->begin(buff, out); printRun=true; printRun1=true; } if (mp3->isRunning()) { if (!mp3->loop()) mp3->stop(); if (printRun ) { printRun=false; Serial.printf("Radio = play\n"); status_radio = 1; } } else { if (printRun1 ) { printRun1=false; Serial.printf("MP3 done\n"); } if (millis()-lastms > time) { lastms = millis(); next_rs= true; restartURL = true; } } } else if (r_stop) { r_stop=false; Serial.printf("Radio = stop\n"); status_radio = 0; printRun=true; } singl_name 6540ef35-f930-44e0-a72f-5a1ea09bb305 ac42743e-184c-42a3-85c8-89493bee1b12 17c1c10f-7b8b-4021-9cbc-647e5f4c8a22 if (En) {r_stop=true; if (newUrl || restartURL) { restartURL=false; next_rs=false; out = NULL; singl_name = ""; if (mp3) { mp3->stop(); delete mp3; mp3 = NULL; } if (buff) { buff->close(); delete buff; buff = NULL; } if (file) { file->close(); delete file; file = NULL; } radiostation.toCharArray(rs_str, radiostation.length()+1); URL=rs_str; file = new AudioFileSourceICYStream(URL); buff = new AudioFileSourceBuffer(file, Buff); out = new AudioOutputI2SNoDAC(); out->SetGain(((float)Volume)/100.0); Serial.printf_P(PSTR("Set Volume: %d\n"), Volume); mp3 = new AudioGeneratorMP3(); mp3->begin(buff, out); printRun=true; printRun1=true; } if (mp3->isRunning()) { if (!mp3->loop()) mp3->stop(); if (printRun ) { printRun=false; Serial.printf("Radio = play\n"); } status_radio = true; } else { if (printRun1 ) { printRun1=false; Serial.printf("MP3 done\n"); } if (millis()-lastms > time) { lastms = millis(); next_rs= true; restartURL = true; } } } else { status_radio = false; if (r_stop) { r_stop=false; Serial.printf("Radio = stop\n"); printRun=true; } } #include <Arduino.h> #include "AudioFileSourceICYStream.h" #include "AudioFileSourceBuffer.h" #include "AudioGeneratorMP3.h" #include "AudioOutputI2SNoDAC.h" *mp3 ; AudioGeneratorMP3 *file ; AudioFileSourceICYStream *buff ; AudioFileSourceBuffer *out ; AudioOutputI2SNoDAC *URL = ""; const char rs_str [60]; char restartURL =true; bool printRun =false; bool printRun1 =false; bool r_stop = false; bool lastms = 0; static int const char *ptr = reinterpret_cast<const char *>(cbData); (void) isUnicode; // Punt this ball for now // Note that the type and string may be in PROGMEM, so copy them to RAM for printf char s1[32], s2[64]; strncpy_P(s1, type, sizeof(s1)); s1[sizeof(s1)-1]=0; strncpy_P(s2, string, sizeof(s2)); s2[sizeof(s2)-1]=0; Serial.printf("METADATA(%s) '%s' = '%s'\n", ptr, s1, s2); Serial.flush(); if (String(s1)=="StreamTitle") { singl_name = s2; } void MDCallback void *cbData const char *type bool isUnicode const char *string const char *ptr = reinterpret_cast<const char *>(cbData); // Note that the string may be in PROGMEM, so copy it to RAM for printf char s1[64]; strncpy_P(s1, string, sizeof(s1)); s1[sizeof(s1)-1]=0; Serial.printf("STATUS(%s) '%d' = '%s'\n", ptr, code, s1); Serial.flush(); void StatusCallback void *cbData int code const char *string 27663be8-6f0b-40e3-863a-4f3c798c4d9d ESP8266 WiFi РАДИО с внешней памятью и I2S (PCM5102) Проигрывание радиостанций с помощью ESP8266 по wi fi, с дополнительной внешней памятью на микросхеме 23LC1024-ISN и платой АЦП РСМ5102. Дополнительная память уменьшает количество перебоев, также радио работает еще 7-8 сек после сбоя (выключения) WiFi сети. C PCM5102. Стерео! Качество звука отличное, исчезают помехи. Разгружается ESP8266. Входы: En - вкл и выкл блока; radiostation - URL радиостанции; newUrl - запуск установленной радиостанции, (импульсный сигнал); Buff - размер буфера в доп памяти выбираем 128KByte (131072 байта); Volume - уровень сигнала с выхода RX. Выходы: status_radio - состояние радио, если включено true, иначе - false; next_rs - появится импульс при сбое или включении неработающей р/станции. singl_name - вывод имени исполнителя и трека. Параметры: time - время через которое появится импульс на выходе next_rs при сбое или включении неработающей р/станции. pin_Cs - подключение 1 вывода микросхемы памяти. По умолчанию GPIO 4 (D2). Некоторые радиостанции (проверены, можно скопировать отсюда): http://icecast.russkoeradio.cdnvideo.ru:8000/rr_m.mp3 http://jazz.streamr.ru/jazz-64.mp3 http://stream0.radiostyle.ru:8000/rapicom http://nashe1.hostingradio.ru/rock-256 http://91.190.117.131:8000/live http://online.radiorecord.ru:8102/sd90_128 http://icecast.vgtrk.cdnvideo.ru/kulturafm_mp3_128kbps Цифры в конце URL (128kbps, 256) битрейт , ставьте URL не более 128, лучше еще меньше , если заикается часто. И уровень WiFi сети должна быть хорошей. Проверял URL с битрейт 320, у меня радио работало хорошо! aidar_i 03/2019 1562 pin_Cs CS (1 вывод микросхемы) 08291e5b-0149-4c68-9cc8-1b5b55e8f7e5 e33137e9-69c5-42cf-999e-9a1574fd1d61 if (En) {r_stop=true; if (newUrl || restartURL) { restartURL=false; next_rs=false; out = NULL; singl_name = ""; if (mp3) { mp3->stop(); delete mp3; mp3 = NULL; } if (buff) { buff->close(); delete buff; buff = NULL; } if (file) { file->close(); delete file; file = NULL; } radiostation.toCharArray(rs_str, radiostation.length()+1); URL=rs_str; file = new AudioFileSourceICYStream(URL); file->RegisterMetadataCB(MDCallback, (void*)"ICY"); buff = new AudioFileSourceSPIRAMBuffer(file, pin_Cs, Buff); buff->RegisterStatusCB(StatusCallback, (void*)"buffer"); out = new AudioOutputI2S(); out->SetGain(((float)Volume)/100.0); Serial.printf_P(PSTR("Set Volume: %d\n"), Volume); mp3 = new AudioGeneratorMP3(); mp3->RegisterStatusCB(StatusCallback, (void*)"mp3"); mp3->begin(buff, out); printRun=true; printRun1=true; } if (mp3->isRunning()) { if (!mp3->loop()) mp3->stop(); if (printRun ) { printRun=false; Serial.printf("Radio = play\n"); } status_radio = true; } else { if (printRun1 ) { printRun1=false; Serial.printf("MP3 done\n"); } if (millis()-lastms > time) { lastms = millis(); next_rs= true; restartURL = true; } } } else { status_radio = false; if (r_stop) { r_stop=false; Serial.printf("Radio = stop\n"); printRun=true; } } 1611 system_update_cpu_freq(SYS_CPU_160MHZ); Serial.begin(115200); #include <Arduino.h> #include "AudioFileSourceICYStream.h" #include "AudioFileSourceSPIRAMBuffer.h" #include "AudioGeneratorMP3.h" #include "AudioOutputI2S.h" *mp3 ; AudioGeneratorMP3 *file ; AudioFileSourceICYStream *buff ; AudioFileSourceSPIRAMBuffer *out ; AudioOutputI2S *URL = ""; const char rs_str [60]; char restartURL =true; bool printRun =false; bool printRun1 =false; bool r_stop = false; bool lastms = 0; static int const char *ptr = reinterpret_cast<const char *>(cbData); (void) isUnicode; // Punt this ball for now // Note that the type and string may be in PROGMEM, so copy them to RAM for printf char s1[300], s2[300]; strncpy_P(s1, type, sizeof(s1)); s1[sizeof(s1)-1]=0; strncpy_P(s2, string, sizeof(s2)); s2[sizeof(s2)-1]=0; Serial.printf("METADATA(%s) '%s' = '%s'\n", ptr, s1, s2); Serial.flush(); if (String(s1)=="StreamTitle") { singl_name = s2; } ESP8266RADIO 9a12ed04-b635-43b0-852a-85d95557133f