ATOM SPK SPEAKER KIT



  • Hello, some example of how to use SPK with the library: github

    How do I configure the output to use the spk chip?
    I have modified an example in the ide, but I don't know if it is correct.

    This example in theory plays an mp3 station

    Thanks for the help
    All the best
    Francisco

    #include <Arduino.h>
    #include <M5Atom.h>
    #include <WiFi.h>
    #include "AudioFileSourceICYStream.h"
    #include "AudioFileSourceBuffer.h"
    #include "AudioGeneratorMP3.h"
    //#include "AudioOutputI2SNoDAC.h"
    #include "AudioOutputI2S.h"

    // Enter your WiFi setup here:
    #ifndef STASSID
    #define STASSID "TESTWIFI"
    #define STAPSK "TEST"
    #endif

    // Digital I/O used
    #define I2S_DOUT 25 // DIN connection
    #define I2S_BCLK 22 // Bit clock
    #define I2S_LRC 21 // Left Right Clock

    const char* ssid = STASSID;
    const char* password = STAPSK;

    // Randomly picked URL
    const char* URL = "http://kvbstreams.dyndns.org:8000/wkvi-am";

    AudioGeneratorMP3* mp3;
    AudioFileSourceICYStream* file;
    AudioFileSourceBuffer* buff;
    //AudioOutputI2SNoDAC* out;
    AudioOutputI2S* out = NULL;
    //AudioOutputI2S* out

    void setup()
    {
    M5.begin();

    Serial.begin(9600);
    delay(1000);
    Serial.println("Connecting to WiFi");
    
    WiFi.disconnect();
    WiFi.softAPdisconnect(true);
    WiFi.mode(WIFI_STA);
    
    WiFi.begin(ssid, password);
    
    // Try forever
    while (WiFi.status() != WL_CONNECTED) {
    	Serial.println("...Connecting to WiFi");
    	delay(1000);
    }
    Serial.println("Connected");
    
    audioLogger = &Serial;
    file = new AudioFileSourceICYStream(URL);
    file->RegisterMetadataCB(MDCallback, (void*)"ICY");
    buff = new AudioFileSourceBuffer(file, 2048);
    buff->RegisterStatusCB(StatusCallback, (void*)"buffer");
    //out = new AudioOutputI2SNoDAC();
    
    out = new AudioOutputI2S(0, 1, 32);
    out->begin();
    
    
    
    mp3 = new AudioGeneratorMP3();
    mp3->RegisterStatusCB(StatusCallback, (void*)"mp3");
    mp3->begin(buff, out);
    

    }

    void loop()
    {
    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);
    }
    

    }

    // 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();
    }

    Thanks for the help
    All the best
    Francisco