using M5.Speaker.playWav in void loop()
-
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"); }
-
@alecdvor
Maybe this function blocks the code that follows it?