Sorry, no clue what you're trying to do, really.
Timing is normally done using millis(), and variables to hold a start time, an interval, and the iterations. So I guess something like this:
uint32_t startSequence;
uint32_t intervals[3];
uint8_t stage, totalStages;
uint8_t iter, totalIters;
void loop() {
// Starting the sequence
if (startSequence) {
startTime = millis()
stage = 0;
totalStages = 3;
intervals = {4*60*1000, 10*1000, 4*60*1000);
iter = 0;
totalIters = 12;
}
if (iter < totalIters) {
if (handleCountDown()) {
iter++;
handleNextIter();
}
}
// Rest of the loop() jobs.
}
bool handleCountDown() {
// handling the countdowns.
if (millis() - startTime > intervals[stage]) {
startTime += intervals[stage];
handleStage(stage);
stage++
if (stage == stages) {
handleLastStage();
stage = 0;
return true;
}
}
return false;
}