Chiedo consigli per completare il mio sketch per realizzare un treno di impulsi

Ok, allora un treno sono 250+280 ms (e non 225+280 come sembrava dal primo sketch).

1698 treni durano 899.94 s (15 minuti con un errore di 0.06 s)

Ma qui arriva l'imprecisione dell'oscillatore non quarzato che si riflette sui risultati delle funzioni delay, millis, micros.

Sul mio ArduinoProMini ad esempio i tempi risultano alterati dello 0.12%, circa quattro secondi e mezzo all'ora.

Questo credo sia il meglio che si può ottenere se la struttura del programma, per come viene scritto, non va ad introdurre ulteriori ritardi (che possono invece influire di parecchi punti percentuali, ad esempio usare delay per produrre piccoli tempi periodici porta ad almeno 10 minuti di errore all'ora).

La misura di tempo più precisa è fornita dalla funzione micros (che funziona come millis ma riporta i microsecondi (con un jitter di ±4µs) invece che i millisecondi, per cui ha una risoluzione almeno 250 volte migliore, cioè gli impulsi alla fine avranno complessivamente circa 50 µs di errore).

Un'idea può essere quella di creare una base tempi costante per il programma usando micros, ad esempio di 5 millisecondi (solo perché è un sottomultiplo di 25):

//*********************************************************
void elabora()  // funzione chiamata 200 volte al secondo
{
    digitalWrite(13, !digitalRead(13));
}
//*********************************************************
void setup()
{
    pinMode(13, OUTPUT);
}
//*********************************************************
void loop()
{
    static unsigned long t = 0;
    if(micros() - t >= 5000) 
    { 
        elabora(); 
        t += 5000; 
    }
}
//*********************************************************

L'unico vincolo con questa soluzione è che la funzione elabora non duri MAI più di 5 ms, naturalmente sono possibili altre soluzioni, ma sempre usando la funzione micros per contare il tempo con la maggior precisione possibile.

Per il resto nella elabora si possono usare variabili contatore, variabili stato ecc. per ottenere i tempi voluti e modificare comportamento al raggiungimento di specifici timeout.

Così a occhio mi sembra che la soluzione più semplice sia una sezione che legge il pulsante e genera i quattro tempi da 15 minuti, e un'altra, comandata dalla prima, che genera i treni.