Notebook
Jaroslav Lukesh
lukesh na seznam.cz
Pátek Červenec 27 01:41:36 CEST 2018
ESP8266Audio a Wifimulti. Je tam palcový přepínač a původní vypínač na volbu
stanic (celkem 20, ale naprogramováno je jen 10 - je to bída tam něco
vybrat). Potřebuje to kvalitní signál wifi (má to moc malý buffer), ale v
pohodě lze použít druhou ESP8266 kde je wifi router/extender na dohled v
místnosti, která signál vyčistí od kolizí a pak to jede pěkně.
StreamMP3fromHTTP je funkční kód, tohle jsem z něj udělal, jsou tam nějaké
úpravy pro zajištění funkčnosti i v obtížných podmínkách.
#include <Arduino.h>
//#include <pgmspace.h>
//#include <WString.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti wifiMulti;
#include "AudioFileSourceICYStream.h"
#include "AudioFileSourceBuffer.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2SNoDAC.h"
// To run, set your ESP8266 build to 160MHz, update the SSID info, and
upload.
// Select V1.4 Prebuilt as IwIP Variant. 256 kbps stations will work now.
// Enter your WiFi setup here:
const char *SSID = "WEBRADIO";
const char *PASSWORD = "wartburg";
// Randomly picked URL
//const char *URL="http://streaming.shoutcast.com/80sPlanet?lang=en-US";
const char *URL0 PROGMEM ="http://ice3.abradio.cz/pohadka128.mp3";
const char *URL1 PROGMEM ="http://pool.cdn.lagardere.cz/web-pg-pohadky";
const char *URL2 PROGMEM ="http://ice3.abradio.cz/povidka128.mp3";
const char *URL3 PROGMEM ="http://pool.cdn.lagardere.cz/web-pg-pisnicky";
const char *URL4 PROGMEM ="http://85.143.216.212:8025/stream";
const char *URL5 PROGMEM ="http://193.242.149.55:8000/kfm";
const char *URL6 PROGMEM ="http://epdop.hostingradio.ru:8033/rdd128.mp3";
const char *URL7 PROGMEM ="http://relay.myradio.ua/mihail-krug128.mp3";
const char *URL8 PROGMEM =http://ic2.101.ru:8000/c8_1;
const char *URL9 PROGMEM ="http://mp3stream4.abradio.cz/humor128.mp3";
const char *URL10 PROGMEM ="http://";
const char *URL11 PROGMEM ="http://";
const char *URL12 PROGMEM ="http://";
const char *URL13 PROGMEM ="http://";
const char *URL14 PROGMEM ="http://";
const char *URL15 PROGMEM ="http://";
const char *URL16 PROGMEM ="http://";
const char *URL17 PROGMEM ="http://";
const char *URL18 PROGMEM ="http://";
const char *URL19 PROGMEM ="http://";
AudioGeneratorMP3 *mp3;
AudioFileSourceICYStream *file;
AudioFileSourceBuffer *buff;
AudioOutputI2SNoDAC *out;
// Called when a metadata event occurs (i.e. an ID3 tag, an ICY block, etc.
void MDCallback(void *cbData, const char *type, bool isUnicode, const char
*string)
{
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();
}
// Called when there's a warning or error (like a buffer underflow or decode
hiccup)
void StatusCallback(void *cbData, int code, 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 StartPlayer(){
readStanice();
file->RegisterMetadataCB(MDCallback, (void*)"ICY");
// buff = new AudioFileSourceBuffer(file, 2048);
buff = new AudioFileSourceBuffer(file, 5*1024);
buff->RegisterStatusCB(StatusCallback, (void*)"buffer");
mp3 = new AudioGeneratorMP3();
mp3->RegisterStatusCB(StatusCallback, (void*)"mp3");
mp3->begin(buff, out);
}
void StopPlaying()
{
if (mp3) {
mp3->stop();
delete mp3;
mp3 = NULL;
}
if (buff) {
buff->close();
delete buff;
buff = NULL;
}
if (file) {
file->close();
delete file;
file = NULL;
}
}
void readStanice(){ // normálnà piny jsou D0,1,2,5,6,7 - použijeme
D2,5,6,7, má to pullup, takže negované
if (digitalRead(D1)){
if ( digitalRead(D2) and digitalRead(D5) and digitalRead(D6) and
digitalRead(D7)) file = new AudioFileSourceICYStream(URL0);
else if ( digitalRead(D2) and digitalRead(D5) and digitalRead(D6) and
!digitalRead(D7)) file = new AudioFileSourceICYStream(URL1);
else if ( digitalRead(D2) and digitalRead(D5) and !digitalRead(D6) and
digitalRead(D7)) file = new AudioFileSourceICYStream(URL2);
else if ( digitalRead(D2) and digitalRead(D5) and !digitalRead(D6) and
!digitalRead(D7)) file = new AudioFileSourceICYStream(URL3);
else if ( digitalRead(D2) and !digitalRead(D5) and digitalRead(D6) and
digitalRead(D7)) file = new AudioFileSourceICYStream(URL4);
else if ( digitalRead(D2) and !digitalRead(D5) and digitalRead(D6) and
!digitalRead(D7)) file = new AudioFileSourceICYStream(URL5);
else if ( digitalRead(D2) and !digitalRead(D5) and !digitalRead(D6)
and digitalRead(D7)) file = new AudioFileSourceICYStream(URL6);
else if ( digitalRead(D2) and !digitalRead(D5) and !digitalRead(D6)
and !digitalRead(D7)) file = new AudioFileSourceICYStream(URL7);
else if ( !digitalRead(D2) and digitalRead(D5) and digitalRead(D6) and
digitalRead(D7)) file = new AudioFileSourceICYStream(URL8);
else if ( !digitalRead(D2) and digitalRead(D5) and digitalRead(D6) and
!digitalRead(D7)) file = new AudioFileSourceICYStream(URL9);
} else {
if ( digitalRead(D2) and digitalRead(D5) and digitalRead(D6) and
digitalRead(D7)) file = new AudioFileSourceICYStream(URL0);
else if ( digitalRead(D2) and digitalRead(D5) and digitalRead(D6) and
!digitalRead(D7)) file = new AudioFileSourceICYStream(URL1);
else if ( digitalRead(D2) and digitalRead(D5) and !digitalRead(D6) and
digitalRead(D7)) file = new AudioFileSourceICYStream(URL2);
else if ( digitalRead(D2) and digitalRead(D5) and !digitalRead(D6) and
!digitalRead(D7)) file = new AudioFileSourceICYStream(URL3);
else if ( digitalRead(D2) and !digitalRead(D5) and digitalRead(D6) and
digitalRead(D7)) file = new AudioFileSourceICYStream(URL4);
else if ( digitalRead(D2) and !digitalRead(D5) and digitalRead(D6) and
!digitalRead(D7)) file = new AudioFileSourceICYStream(URL5);
else if ( digitalRead(D2) and !digitalRead(D5) and !digitalRead(D6)
and digitalRead(D7)) file = new AudioFileSourceICYStream(URL6);
else if ( digitalRead(D2) and !digitalRead(D5) and !digitalRead(D6)
and !digitalRead(D7)) file = new AudioFileSourceICYStream(URL7);
else if ( !digitalRead(D2) and digitalRead(D5) and digitalRead(D6) and
digitalRead(D7)) file = new AudioFileSourceICYStream(URL8);
else if ( !digitalRead(D2) and digitalRead(D5) and digitalRead(D6) and
!digitalRead(D7)) file = new AudioFileSourceICYStream(URL9);
}
}
void setup()
{
pinMode(D1, INPUT_PULLUP); // 10
pinMode(D2, INPUT_PULLUP); // 8
pinMode(D5, INPUT_PULLUP); // 4
pinMode(D6, INPUT_PULLUP); // 2
pinMode(D7, INPUT_PULLUP); // 1
Serial.begin(115200);
delay(1000);
Serial.println("Connecting to WiFi");
WiFi.disconnect();
WiFi.softAPdisconnect(true);
WiFi.mode(WIFI_STA);
//WiFi.begin(SSID, PASSWORD);
wifiMulti.addAP("APAPAPAP1", "xxxxxxxx");
wifiMulti.addAP("APAPAPAP2", "xxxxxxxxxxxxxx");
// Try forever
//while (WiFi.status() != WL_CONNECTED) {
while (wifiMulti.run() != WL_CONNECTED) {
Serial.println("...Connecting to WiFi");
delay(500);
}
Serial.println("Connected");
out = new AudioOutputI2SNoDAC();
StartPlayer();
}
void loop()
{
static int lastms = 0;
if (mp3->isRunning()) {
if (millis()-lastms > 1000) {
lastms = millis();
//Serial.printf("Running for %d ms...Free mem= %d\n", lastms,
ESP.getFreeHeap());
//Serial.flush();
}
if (!mp3->loop()) {
mp3->stop();
Serial.printf("MP3 not in loop\n");
Serial.flush();
}
} else {
Serial.printf("MP3 dead\n");
//if (WiFi.status() != WL_CONNECTED) {
if (wifiMulti.run() != WL_CONNECTED) {
Serial.println("...NOT Connected to WiFi, STOP playing");
StopPlaying();
//delay(500);
} else {
Serial.printf("Free mem= %d\n", ESP.getFreeHeap());
Serial.printf("MP3 player full restart\n");
StopPlaying();
Serial.printf("Free mem= %d\n", ESP.getFreeHeap());
//delay(1000);
StartPlayer();
}
}
}
Další informace o konferenci Hw-list