Huskylens, alarm & motors

i am encountering a problem with the below code. its that the mp3 isnt making a sound. so the order should be that i set an alarm for each motor as seen in the code. once alarm is reached the mp3 makes a sound and plays the track (2,25). then the huskylens checks face. if serial monitor output is ID=1 then the step motor moves.

#include <AccelStepper.h>      // Include the AccelStepper Library
#include <DS3232RTC.h>         // RTC library
#include <Streaming.h>         // For easier Serial prints
#include "mp3tf16p.h"          // Custom MP3 player library
#include <TimeLib.h>           // Time functions
#include "HUSKYLENS.h"          // HuskyLens Library
#include "SoftwareSerial.h"   // Software Serial for HuskyLens Communication


// Pin definitions
#define LED_PIN 43 // Changed LED pin
#define MP3_RX 12
#define MP3_TX 8


// MP3 Player RX and TX pins
MP3Player mp3(MP3_RX, MP3_TX); //Changed MP3 pins.


// RTC instance
DS3232RTC myRTC;


// Define step constants
#define FULLSTEP 4
#define HALFSTEP 8


// Stepper motor instances (4 motors)
AccelStepper stepper1(HALFSTEP, 44, 40, 42, 38);  // Motor 1
AccelStepper stepper2(HALFSTEP, 27, 31, 33, 29);  // Motor 2
AccelStepper stepper3(HALFSTEP, 51, 47, 49, 45);  // Motor 3
AccelStepper stepper4(HALFSTEP, 7, 5, 6, 4);      // Motor 4


// Alarm times for each motor
tmElements_t alarmTime1, alarmTime2, alarmTime3, alarmTime4;
bool alarmSet1 = false, alarmSet2 = false, alarmSet3 = false, alarmSet4 = false;  // Flags for each alarm
bool motor1Triggered = false, motor2Triggered = false, motor3Triggered = false, motor4Triggered = false;  // Alarm-triggered flags for motors


// HuskyLens communication
HUSKYLENS huskylens;
SoftwareSerial mySerial(10, 11); // RX, TX for HuskyLens


// Flag to track if face has been recognized and motor should move
bool faceRecognized = false;


void setup() {
    Serial.begin(9600);
    pinMode(LED_PIN, OUTPUT);


    // Initialize RTC
    Serial << F("Initializing RTC...") << endl;
    myRTC.begin();
    setSyncProvider(myRTC.get);
    delay(200);


    Serial << "Checking RTC Sync..." << endl;
    Serial << "Current Time: " << hour() << ":" << minute() << ":" << second() << endl;
  second() << endl;


    if (timeStatus() != timeSet) {
        Serial << F("RTC Sync FAIL!") << endl;
    } else {
        Serial << F("RTC Sync OK!") << endl;
    }


    // Initialize MP3 player
    Serial << F("Initializing MP3 player...") << endl;
    mp3.initialize();


    // Initialize stepper motors with settings for smooth movement
    stepper1.setMaxSpeed(500.0);
    stepper1.setAcceleration(100.0);
    stepper1.setSpeed(100);
    stepper1.moveTo(2038);


    stepper2.setMaxSpeed(500.0);
    stepper2.setAcceleration(100.0);
    stepper2.setSpeed(100);
    stepper2.moveTo(2038);


    stepper3.setMaxSpeed(500.0);
    stepper3.setAcceleration(100.0);
    stepper3.setSpeed(100);
    stepper3.moveTo(2038);


    stepper4.setMaxSpeed(500.0);
    stepper4.setAcceleration(100.0);
    stepper4.setSpeed(100);
    stepper4.moveTo(2038);


    // Initialize HuskyLens
    mySerial.begin(9600);
    while (!huskylens.begin(mySerial)) {
        Serial.println(F("Begin failed!"));
        Serial.println(F("1. Please recheck the \"Protocol Type\" in HUSKYLENS (General Settings>>Protocol Type>>Serial 9600)"));
        Serial.println(F("2. Please recheck the connection."));
        delay(100);
    }
    Serial.println(F("HuskyLens initialized successfully"));


    Serial << F("Set alarm times for each motor. Enter time in hh:mm:ss format.") << endl;
}


void loop() {
    static time_t lastPrintTime;
    time_t currentTime = now();


    // Print the current time once per second
    if (currentTime != lastPrintTime) {
        lastPrintTime = currentTime;
        printDateTime(currentTime);
        Serial << endl;
    }


    // Check if alarm time matches current time for each motor
    if (alarmSet1 && checkAlarm(currentTime, alarmTime1)) {
        alarmSet1 = false; // Disable alarm after triggering
        triggerAlarm(1);
    }
    if (alarmSet2 && checkAlarm(currentTime, alarmTime2)) {
        alarmSet2 = false;
        triggerAlarm(2);
    }
    if (alarmSet3 && checkAlarm(currentTime, alarmTime3)) {
        alarmSet3 = false;
        triggerAlarm(3);
    }
    if (alarmSet4 && checkAlarm(currentTime, alarmTime4)) {
        alarmSet4 = false;
        triggerAlarm(4);
    }


    // Check for user input to set the alarm for each motor
    if (Serial.available() >= 8) {
        int hour = Serial.parseInt();
        int minute = Serial.parseInt();
        int second = Serial.parseInt();
        int motorNumber = Serial.parseInt();  // Motor number input (1-4)


        // Check if motor number is valid
        if (motorNumber >= 1 && motorNumber <= 4) {
            Serial << "Received Alarm Input: " << hour << ":" << minute << ":" << second << " for Motor " << motorNumber << endl;
            if (hour >= 0 && hour < 24 && minute >= 0 && minute < 60 && second >= 0 && second < 60) {
                if (motorNumber == 1) {
                    alarmTime1.Hour = hour;
                    alarmTime1.Minute = minute;
                    alarmTime1.Second = second;
                    alarmSet1 = true;
                    Serial << F("Alarm set for Motor 1: ");
                    printTime(makeTime(alarmTime1));
                } else if (motorNumber == 2) {
                    alarmTime2.Hour = hour;
                    alarmTime2.Minute = minute;
                    alarmTime2.Second = second;
                    alarmSet2 = true;
                    Serial << F("Alarm set for Motor 2: ");
                    printTime(makeTime(alarmTime2));
                } else if (motorNumber == 3) {
                    alarmTime3.Hour = hour;
                    alarmTime3.Minute = minute;
                    alarmTime3.Second = second;
                    alarmSet3 = true;
                    Serial << F("Alarm set for Motor 3: ");
                    printTime(makeTime(alarmTime3));
                } else if (motorNumber == 4) {
                    alarmTime4.Hour = hour;
                    alarmTime4.Minute = minute;
                    alarmTime4.Second = second;
                    alarmSet4 = true;
                    Serial << F("Alarm set for Motor 4: ");
                    printTime(makeTime(alarmTime4));
                }
                Serial << endl;
            } else {
                Serial << F("Invalid time format! Use hh:mm:ss.") << endl;
            }
        } else {
            Serial << F("Invalid motor number! Enter a number between 1 and 4.") << endl;
        }


        // Clear input buffer
        while (Serial.available() > 0) Serial.read();
    }


    // Only move motors if the alarm has been triggered for that motor
    if (motor1Triggered) stepper1.run();
    if (motor2Triggered) stepper2.run();
    if (motor3Triggered) stepper3.run();
    if (motor4Triggered) stepper4.run();


    // HuskyLens Detection:
    if (!huskylens.request()) {
        Serial.println(F("Fail to request data from HUSKYLENS, recheck the connection!"));
    } else if (!huskylens.isLearned()) {
        Serial.println(F("Nothing learned, press learn button on HUSKYLENS to learn one!"));
    } else if (!huskylens.available()) {
        //Serial.println(F("No block or arrow appears on the screen!"));
    } else {
        while (huskylens.available()) {
            HUSKYLENSResult result = huskylens.read();
            //printResult(result);


            // Trigger stepper motor based on detected object ID (ID = 1)
            if (result.command == COMMAND_RETURN_BLOCK) {
                if (result.ID == 1) {
                    // Face with ID=1 detected, start motor
                    if (motor1Triggered) {stepper1.run();}
                    if (motor2Triggered) {stepper2.run();}
                    if (motor3Triggered) {stepper3.run();}
                    if (motor4Triggered) {stepper4.run();}
                }
            }
        }
    }


    delay(50);
}


// Check if the current time matches the alarm time for each motor
bool checkAlarm(time_t currentTime, tmElements_t alarmTime) {
    return (hour(currentTime) == alarmTime.Hour &&
            minute(currentTime) == alarmTime.Minute &&
            second(currentTime) == alarmTime.Second);
}


// Trigger the alarm for the respective motor
void triggerAlarm(int motorNumber) {
    Serial << F("Alarm triggered for Motor ") << motorNumber << "!" << endl;
    digitalWrite(LED_PIN, HIGH);


    Serial << "Triggering MP3 alarm for Motor " << motorNumber << "..." << endl;
    mp3.playTrackNumber(2, 25); // Play corresponding track for each motor (1-4)
    delay(1000); // Increased Delay.


    unsigned long startTime = millis();
    while (!mp3.playCompleted() && millis() - startTime < 5000) {
        digitalWrite(LED_PIN, !digitalRead(LED_PIN)); // Blink LED
        delay(500);
        Serial.println("MP3 is playing..."); // Debugging output
    }


    Serial.print("MP3 playback completed: ");
    Serial.println(mp3.playCompleted());


    digitalWrite(LED_PIN, LOW);


    if (motorNumber == 1) motor1Triggered = true;
    if (motorNumber == 2) motor2Triggered = true;
    if (motorNumber == 3) motor3Triggered = true;
    if (motorNumber == 4) motor4Triggered = true;


    Serial << F("Motor ") << motorNumber << F(" is now moving.") << endl;
}


// Print date and time to Serial
void printDateTime(time_t t) {
    printDate(t);
    Serial << ' ';
    printTime(t);
}


// Print time to Serial
void printTime(time_t t) {
    Serial << hour(t) << ':' << minute(t) << ':' << second(t);
}


// Print date to Serial
void printDate(time_t t) {
    Serial << day(t) << '/' << month(t) << '/' << year(t);
}


void printResult(HUSKYLENSResult result) {
    if (result.command == COMMAND_RETURN_BLOCK) {
        Serial.print(F("Block Detected: "));
        Serial.print(F("xCenter="));
        Serial.print(result.xCenter);
        Serial.print(F(", yCenter="));
        Serial.print(result.yCenter);
        Serial.print(F(", width="));
        Serial.print(result.width);
        Serial.print(F(", height="));
        Serial.print(result.height);
        Serial.print(F(", ID="));
        Serial.println(result.ID);
    } else if (result.command == COMMAND_RETURN_ARROW) {
        Serial.print(F("Arrow Detected: "));
        Serial.print(F("xOrigin="));
        Serial.print(result.xOrigin);
        Serial.print(F(", yOrigin="));
        Serial.print(result.yOrigin);
        Serial.print(F(", xTarget="));
        Serial.print(result.xTarget);
        Serial.print(F(", yTarget="));
        Serial.print(result.yTarget);
        Serial.print(F(", ID="));
        Serial.println(result.ID);
    } else {
        Serial.println(F("Unknown object detected!"));
    }
}

Does it make a sound if you have a simple code? (typed here from your code)

#include "mp3tf16p.h"  // Custom MP3 player library

#define MP3_RX 12
#define MP3_TX 8

MP3Player mp3(MP3_RX, MP3_TX); // MP3 player instance

void setup() {
  Serial.begin(9600);
  Serial.println("MP3 Test started...");

  // Initialize MP3 player
  mp3.initialize();
  delay(1000); // Wait for initialization (if needed)
  
  Serial.println("Playing track 25");
  mp3.playTrackNumber(2, 25);
  
  // Wait for the track to play
  unsigned long startTime = millis();
  while (!mp3.playCompleted() && millis() - startTime < 5000) {
    // Waiting for the track to finish
    delay(500);
    Serial.println("MP3 is playing...");
  }

  if (mp3.playCompleted()) {
    Serial.println("MP3 playback completed.");
  } else {
    Serial.println("MP3 playback did not complete within 5 seconds.");
  }
}

void loop() {}

yes