Claudio_FF:
Già tenere dentro le funzioni tutte le variabili locali, lasciando globali solo quelle strettamente necessarie a contenere lo stato condiviso secondo me aiuta a mantenere l'ordine.E le locali che devono mantenere i valori tra una chiamata e l'altra delle funzioni basta dichiararle static (così ogni funzione può avere una variabile interna 's' per lo stato, 't' per il tempo, 'cnt' per i conteggi ecc. che mantengono i valori come se fossero globali).
Un'altra possibilità sono le struct, che permettono (in quest'ottica) di racchiudere gruppi di variabili dentro una "valigetta" più comoda da "portare in giro", che unisce in un unico contenitore logico variabili legate in qualche modo tra loro:
struct {
byte hour = 0;
byte minute = 0;
boolean enabled = false;
} alarm;
if(alarm.enabled && alarm.minute == now.minute && alarm.hour == now.hour) ...
NOTA: fare attenzione nel passaggio di struct a funzioni di passarle per riferimento (come gli array) e non per valore (perché ne verrebbe creata una copia locale sullo stack).
Grazie per i suggerimenti, li farò miei.