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()