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?
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login