Beim schnellen Blick in den Code fällt mir auf, dass du mit Einzelabfragen arbeitest. Das macht das ganze sehr starr und verschwendet unmengen Speicher.
Setze dich mit Arrays auseinander. Dann kannst brauchst du nur noch eine IF-Abfrage für das ganze Jahr statt für jeden Tag eine, weil du mit Zählvariablen die Zeiten adressieren kannst. Du könntest eine Werte dadurch auch automatisiert im Setup in das Array schreiben lassen. Das Jahr dürftest du auch weglassen können.
Statt
if (J3 == now.year() && M3 == now.month() && T3 == now.day() && h3 == now.hour() && m3 == now.minute() && s3 == now.second())
{
z.B.:
if ((Starthour(now.month()-1,now.day()-1) == now.hour()) && (Startminute(now.month()-1,now.day()-1) == now.minute()) && (Startsekunde(now.month()-1,now.day()-1) == now.second()))}
{
Im Array Starthour wäre die Startzeit in Stunden für Monatsnummern und Tagesnummern verzeichnet. Das gleiche entsprechend für Startminuten und Sekunden.
Wenn die Zeit immer richtig angezeigt werden soll, dann müsstest du die Delays gegen millis() mit entsprechend geändeter Programmstruktur (Zustandsmaschine) umbauen.