Semaforo Complesso OK-Flip Flop Semplice ( e non ci salto fuori).

e a dimostrare quello che intendobasta guardare questo esempio di loop

è corta, sono più i commenti che le righe di codice

che fa tutto il lavoro è la luci()
che imposta anche il tempo, letto dalla stringa in ingresso

Void loop() {


  // testo se abbiamo gia' raggiunto il tempo
  if (tempo > millis()) {
    // cambio stato semaforo
    luci(sequenza[stato]);
  }

  // testo se è premuto un pulsante di pedone
  if (digitalRead(pedone)) {
    // pulsante di pedone premuto
    // lo memo rizzo
    chiamata = 1;
  }
  // se chiamata eseguita e doppio rosso
  if ( chiamata && digitalRead(P1R) && digitalRead(P2R)) {

    // salvo la sequenza prossima
    stato1 = stato;
    // metto come prossima sequenza il passaggio pedoni
    stato = 6;
    // quindi allo scadere del tempo per il doppio rosso passa in pedoni, invece che in quello che doveva fare
    // considero soddisfatta la chiamata
    chiamata = 0;
    // adesso se non fcessi niente, dopo il tempo di cicalino
    // il semaforo ripartirebbe dall'inizio della sua sequenza
    // questo è garantito dal fatto che il passo 7 BBA punta al passo due
    // invece voglio che riparta da dove si era fermato prima del pedone
    // al momento non ho idee....
  }

// controllo se c'e' o no inserito il lampeggio
// non ho idee adesso
}

notare che io non interrompo il normale ciclo del semaforo

mi limito ad attendere la condizione di doppio rosso e mettere in lista di esecuzione non la normale riga successiva, ma la prima riga della sequenza pedonale

la sequenza pedonale a sua volta termina richiamando la prima riga della sequenza principale

il difficile è tutto nella luci()