Io creerei una struttura del genere
void loop(){
controllopulsanti();
controllotempo();
comandasemafori();
}
il codice deve girare sempre senza delay usando la funzione millis() per determinare lo stato di accensione delle varie luci.
Userei poi una struttura per definire i semafori e passare i parametri da una funzione all'altra.