Skip to content

Incompatibility between MKRZERO RTC & I2S libraries #451

Open
@white-ar

Description

@white-ar

There appears to be an incompatibility between the ArduinoSound.h and RTCZero.h libraries.

When you try to play an audio file after the internal RTC has been initialised, the WAV files won't play. See the rtc.begin() function call in the code below.
Configuration: MKRZERO and Adafruit MAX98357A I2S audio board.

#include <SD.h>               // SD card access library
#include <ArduinoSound.h>     // I2S sound interface library 
#include <RTCZero.h>          // Real Time Clock library


// SETUP Audio playback
// filename of wave file to play
const char filename[] = "MUSIC.WAV";
// variable representing the Wave File
SDWaveFile waveFile;

// SETUP Real Time Clock
/* Create a RTC object */
RTCZero rtc;

/* Change these values to set the current initial time */
const byte seconds = 0;
const byte minutes = 0;
const byte hours = 16;

/* Change these values to set the current initial date */
const byte day = 15;
const byte month = 6;
const byte year = 15;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);     // Start Arduino serial port at 9,600 baud
  //SD.begin();             // Open the SD card
  delay(500);

  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // setup the SD card, depending on your shield of breakout board
  // you may need to pass a pin number in begin for SS
  Serial.print("Initializing SD card..z.");

  if (!SD.begin()) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  // create a SDWaveFile
  waveFile = SDWaveFile(filename);

  // check if the WaveFile is valid
  if (!waveFile) {
    Serial.println("wave file is invalid!");
    while (1); // do nothing
  }

  // print out some info. about the wave file
  Serial.print("Bits per sample = ");
  Serial.println(waveFile.bitsPerSample());

  long channels = waveFile.channels();
  Serial.print("Channels = ");
  Serial.println(channels);

  long sampleRate = waveFile.sampleRate();
  Serial.print("Sample rate = ");
  Serial.print(sampleRate);
  Serial.println(" Hz");

  long duration = waveFile.duration();
  Serial.print("Duration = ");
  Serial.print(duration);
  Serial.println(" seconds");

  // adjust the playback volume
  AudioOutI2S.volume(100);

  // check if the I2S output can play the wave file
  if (!AudioOutI2S.canPlay(waveFile)) {
    Serial.println("unable to play wave file using I2S!");
    while (1); // do nothing
  }

  // IF START PLAYBACK LOCATED HERE IT WORKS
  // start playback
  Serial.println("starting playback");
  AudioOutI2S.play(waveFile);



  // Start the RTC
  rtc.begin(); // Initialize RTC

  // IF START PLAYBACK LOCATED HERE, after rtc.begin();, IT DOESN'T
  // start playback
  //Serial.println("starting playback");
  //AudioOutI2S.play(waveFile);


  // Set the time
  rtc.setHours(hours);
  rtc.setMinutes(minutes);
  rtc.setSeconds(seconds);

  // Set the date
  rtc.setDay(day);
  rtc.setMonth(month);
  rtc.setYear(year);

  rtc.setAlarmTime(16, 0, 20);
  rtc.enableAlarm(rtc.MATCH_HHMMSS);
  rtc.attachInterrupt(alarmMatch);
}


void loop() {
}


void alarmMatch() {
  Serial.println("Alarm Match!");
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions