Ti do una brutta notizia, il delay() ha un lato oscuro che negli esempio non si manifesta. Mentre nei programmi concreti il delay è raramente usato e limitato a decine di millisecondo.
Aggiungo che è fattibile non usare il delay e al suo posto usare millis() con cui temporizzare le azioni. Leggendo qui e la troverai scritto che delay() è bloccante (il lato oscuro), in realtà ogni istruzione richiede del tempo per essere eseguita e per questo intervallo di tempo nessuna altra istruzione verrà eseguita.
La differenza sta nell'impegnare la CPU per un secondo con delay(1000) e l'impegnare la cpu con digitalWrite(pin, HIGH) la quale impegna la cpu per meno di 1ms.
La digitalWrite è determinante per il funzionamento del programma e non ci sono altre soluzioni (ci sono ci sono), delay non è determinante e ci sono altre soluzioni ad esempio millis().
In definitiva delay torna utile durante la scrittura del codice ma poi deve scomparire.
Ciao.