Ricordo un lavoro fatto nel 2000 per la programmazione di una centralina semaforica.
Si parlava di "verdi nemici" e tempi variabili di ciclo a fascie orarie, sensori (spire) di flusso veicolare, pulsanti pedonali, watchdog, ecc.
La materia, nella realtà, è molto più complicata di quanto possa sembrare.
Comunque, nella tua "tabella della verità" iniziale ha dimenticato il caso "tutto rosso" (un telecomando a bordo di un mezzo di soccorso fa scattare il rosso su tutte le direzioni).
Lascia perdere il delay() ed utilizza il millis() usando unsigned long e ricordando che dopo 55 giorni il timer interno si azzera e prevedendo questo caso.
Molto meglio se usassi un interrupt da timer/counter overflow per avere una base oraria affidabile, ma per iniziare va bene il millis