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