Hello I am using Arduino IDE 2.3.3 and a M5stack core 2.
I have found that M5.Speaker.playWav will work for me when I call on it within void setup() but I am unable to use the same M5.Speaker.playWav function in void loop().
Is there a work around or another option for me that would get my wav file to play during the point in the loop I would like it to ?
void playSuccessChirp(){
Serial.println("Success Tone Activated");
M5.Speaker.tone(420,1000);
delay(1000);
// Load audio files and write to buffers
success_chirp = LittleFS.open("/success_chirp.wav", "r");
success_chirp_fileSize = success_chirp.size();
success_chirp_Buffer = (uint8_t*)malloc(success_chirp_fileSize);
success_chirp.read(success_chirp_Buffer, success_chirp_fileSize);
success_chirp.close();
Serial.println("Tone Chirp Activated");
M5.Speaker.playWav(success_chirp_Buffer);
delay(2000);
}
void setup(void) {
Serial.begin(19200);
auto cfg = M5.config();
M5.begin(cfg);
M5.Display.begin();
SPIFFS.begin();
// Open the font file
File SpaceMono18 = LittleFS.open("/SpaceMono18.vlw","r");
// Read font file contents into a buffer
size_t SpaceMono18_fileSize = SpaceMono18.size();
uint8_t* SpaceMono18_fontBuffer = (uint8_t*)malloc(SpaceMono18_fileSize);
SpaceMono18.read(SpaceMono18_fontBuffer, SpaceMono18_fileSize);
SpaceMono18.close();
// Load Font
M5.Display.loadFont(SpaceMono18_fontBuffer);
// Open the font file
File SpaceMono16 = LittleFS.open("/SpaceMono16.vlw","r");
// Read font file contents into a buffer
size_t SpaceMono16_fileSize = SpaceMono16.size();
uint8_t* SpaceMono16_fontBuffer = (uint8_t*)malloc(SpaceMono16_fileSize);
SpaceMono16.read(SpaceMono16_fontBuffer, SpaceMono16_fileSize);
SpaceMono16.close();
// Load Font
M5.Display.loadFont(SpaceMono18_fontBuffer);
M5.Display.setTextDatum(middle_center);
M5.Display.setTextColor(VOLTBLUE);
screen_height = M5.Display.height();
screen_width = M5.Display.width();
M5.Lcd.drawPng(CDTR_BG_IMG, 29320, 50, 0, 230, 230 );
M5.Lcd.drawPng(GAMEVOLT_IMG, 13627, 320 - 98, 0, 98, 40 );
// Open the audio file
File arena_startup_chirp = LittleFS.open("/arena_startup_chirp.wav","r");
// Read audio file contents into a buffer
size_t arena_startup_chirp_fileSize = arena_startup_chirp.size();
uint8_t* arena_startup_chirp_Buffer = (uint8_t*)malloc(arena_startup_chirp_fileSize);
arena_startup_chirp.read(arena_startup_chirp_Buffer, arena_startup_chirp_fileSize);
arena_startup_chirp.close();
// Set Volume
M5.Speaker.setVolume(volume);
// Play Wav
M5.Speaker.playWav(arena_startup_chirp_Buffer);
delay(2000);
free (arena_startup_chirp_Buffer);
// Draw UI
M5.Display.fillSmoothRoundRect(2, screen_height / 2 - 20, screen_width - 4, 40, ui_radius, MINTGREEN);
M5.Display.fillSmoothRoundRect(4, screen_height / 2 - 20, screen_width - 8, 36, ui_radius, BLACK);
M5.Display.drawString("Initializing", screen_width / 2 + 8, screen_height / 2 - 8);
pinMode(SD_CS, OUTPUT);
digitalWrite(SD_CS, HIGH);
SPI.begin(SD_SCK, SD_MISO, SD_MOSI);
SPI.setFrequency(1000000);
// Dramatic Pause
delay(2000);
// Draw UI
M5.Display.fillSmoothRoundRect(2, screen_height / 2 - 20, screen_width - 4, 40, ui_radius, MINTGREEN);
M5.Display.fillSmoothRoundRect(4, screen_height / 2 - 20, screen_width - 8, 36, ui_radius, BLACK);
M5.Display.drawString("Please Connect Ethernet", screen_width / 2 + 8, screen_height / 2 - 6);
m5::board_t board = M5.getBoard();
switch (board) {
case m5::board_t::board_M5Stack: {
cs_pin = 5;
rst_pin = 0;
int_pin = 35;
} break;
case m5::board_t::board_M5StackCore2: {
cs_pin = 33;
rst_pin = 0;
int_pin = 35;
} break;
case m5::board_t::board_M5StackCoreS3: {
cs_pin = 1;
rst_pin = 0;
int_pin = 10;
} break;
}
SPI.begin(SCK, MISO, MOSI, -1);
LAN.setResetPin(rst_pin);
LAN.reset();
LAN.init(cs_pin);
while (LAN.begin(mac) != 1) {
Serial.println("Error getting IP address via DHCP, trying again...");
delay(2000);
}
client.setServer(mqtt_server, mqtt_port); // Sets the server details.
client.setCallback(callback); // Sets the message callback function.
//I am unsure why the state bellow works but this state holds true when the device is waiting for DHCP
//If someone can let me know why/when this state occurs it would be appreciated
button.initButton(&M5.Lcd, 320 - 98, 0, 98, 40, VOLTBLUE, BLACK, BLACK, "" );
//button.drawButton();
M5.Display.fillSmoothRoundRect(2, screen_height / 2 - 60, screen_width - 4, 120, ui_radius, MAGENTA);
M5.Display.fillSmoothRoundRect(4, screen_height / 2 - 60, screen_width - 8, 116, ui_radius, BLACK);
M5.Display.drawString("DHCP issued:", screen_width / 2, screen_height / 2 - 40);
IPAddress IP = LAN.localIP();
M5.Display.drawString(IP.toString(), screen_width / 2, screen_height / 2 - 8);
//M5.Display.setTextFont(&fonts::FreeSans9pt7b);
M5.Display.drawString("Please standby", screen_width / 2, screen_height / 2 + 24);
//M5.Display.setTextFont(&fonts::FreeSans12pt7b);
}
void loop(void) {
//audio.loop();
Serial.println("Start of loop");
M5.update();
delay(500);
auto link = LAN.linkStatus();
auto clientState = client.state();
switch (link){
case Unknown:
Serial.println("LAN Link State: Unknown");
if (current_state != 1){
Serial.println("Begin change to state 2");
M5.Display.fillSmoothRoundRect(2, screen_height / 2 - 20, screen_width - 4, 40, ui_radius, ORANGE);
M5.Display.fillSmoothRoundRect(4, screen_height / 2 - 20, screen_width - 8, 36, ui_radius, BLACK);
M5.Display.drawString("Please Connect Ethernet", screen_width / 2 + 15, screen_height / 2);
current_state = 1;
Serial.println("Changed to state 1");
}
break;
case LinkON: {
Serial.println("LAN Link State: ON");
IPAddress IP = LAN.localIP();
Serial.println("Connected to local network at : " + IP.toString());
if (client.connect("arduinoClient") && current_state != 2){
playSuccessChirp();
Serial.println("Begin change to state 2");
M5.Display.clearDisplay();
M5.Lcd.drawPng(CDTR_BG_IMG, 29320, 50, 0, 230, 230 );
M5.Lcd.drawPng(GAMEVOLT_IMG, 13627, 320 - 98, 0, 98, 40 );
M5.Display.fillSmoothRoundRect(2, screen_height / 2 - 60, screen_width - 4, 120, ui_radius, GREEN);
M5.Display.fillSmoothRoundRect(4, screen_height / 2 - 60, screen_width - 8, 116, ui_radius, BLACK);
M5.Display.drawString("Success !", screen_width / 2 + 8, screen_height / 2 - 40);
M5.Display.drawString("Connected to remote server", screen_width / 2 + 8, screen_height / 2 - 8);
M5.Display.drawString("Test completed", screen_width / 2, screen_height / 2 + 24);
// Dramatic Pause
delay(2000);
current_state = 2;
Serial.println("Changed to state 2");
} else if (!client.connect("arduinoClient") && current_state != 7){
Serial.println("Begin change to state 7");
M5.Display.clearDisplay();
M5.Lcd.drawPng(CDTR_BG_IMG, 29320, 50, 0, 230, 230 );
M5.Lcd.drawPng(GAMEVOLT_IMG, 13627, 320 - 98, 0, 98, 40 );
M5.Display.fillSmoothRoundRect(2, screen_height / 2 - 60, screen_width - 4, 120, ui_radius, MAGENTA);
M5.Display.fillSmoothRoundRect(4, screen_height / 2 - 60, screen_width - 8, 116, ui_radius, BLACK);
M5.Display.drawString("Connected to local network", screen_width / 2, screen_height / 2 - 40);
M5.Display.drawString("IP:"+IP.toString(), screen_width / 2, screen_height / 2 - 8);
//M5.Display.setTextFont(&fonts::FreeSans9pt7b);
M5.Display.drawString("Unable to connect to server", screen_width / 2, screen_height / 2 + 24);
//M5.Display.setTextFont(&fonts::FreeSans12pt7b);
delay(2000);
current_state = 7;
Serial.println("Changed to state 7");
}