Proseguendo con l'esposizione del semaforo:
da ultimo ho aggiunto alla loop (che rimane veloce, anzi velocissima)
la rotazione del semaforo (ovvero ciclare tra le varie configurazioni di luci)
// testo se abbiamo gia' raggiunto il tempo
if (tempo < millis()) {
// cambio stato semaforo
luci(sequenza[stato]);
}
ovviamente se stato è lo stato FUTURO del semaforo, basta farlo eseguire alla luci() per avanzare di un passo
la sorveglianza del selettore del servizio notturno
if (!digitalRead(NOT) != servizio) {
servizio = !digitalRead(NOT);
if (!servizio) {
// servizio diurno, appena avviato
luci[0];
//partita sequenza standard, con doppio rosso
} else
{
// servizio notturno prenotato
// nulla da fare
}
e questo esegue la PRE-notazione del servizio notturno, oppure fa ripartire da zero il ciclo semaforico
a seconda dei casi
se il servizio notturno è prenotato
if (servizio) {
// servizio notturno prenotato
// se siamo in doppio rosso iniziale:
if (stato == 1 ) {//stato vale 1 solo dopo aver eseguito la luci[0]
servizio = 0; // do per aver eseguito il comando
stato = 9;
// stato 9 è il lampeggio notturno
}
}
e solo durante il doppio rosso iniziale del ciclo
prenota come prossimo stato il 9, ciclo di lampeggio
questo evita che se un pirla qualsiasi gioca col bottone il semaforo passi da verde su una via trafficata a giallo lampeggiante, che dopo diventa difficile decidere chi ha torto e chi ha ragione nell'incidente che certamente avverra
basta pensarci un attimo, e diviene chiaro che occorre evitare che da verde passi di colpo a lampegginate
da verde deve sempre passare a giallo e poi rosso, il modo di funzionamneto del semaforo deve cambiare solo con tutti i veicoli FERMI al rosso
altrimenti chi glielo spiega all'automobilista che è entrato nell'incrocio col verde che siccome è scattato il servizio notturno doveva dare la precedenza a destra ed è colpa sua dell'incidente provocato?
chiarito questo analogo discorso per i pedoni
la sorveglianza del pulsante del passaggio pedoni è questa:
// prenotazione pedone
if (!digitalRead(PUL)){
// pulsante premuto
chiamata=1;
digitalWrite(CHI,HIGH);
// accendo il led di segnalazione chiamata prenotata
}
che oltre a leggere il pulsante accende anche la segnalazione di chiamata prenotata, così il pedone non ci massacra il pulsante........
e al doppio rosso successivo....
if (chiamata){
// chiamata pedone
if (stato==1){
// doppio rosso di inizio sequenza
chiamata=0;
// do la chiamata per soddisfatta
stato=7; // inizio sequenza pedone
digitalWrite(CHI,LOW);
// spengo il led di segnalazione chiamata prenotata
}
}
per poi eseguire il passaggio a pedone al termine del doppio rosso
la sequenza di pedone termina con una chiamata alla sequenza zero, riattivando automaticamente il ciclo normale del semaforo
questo ha anche il vantaggio di evitare che il pirla di pedone di trno continui a fermare il semaforo giocando col bottone
dopo una chiamata pedonale il semaforo esegue sempre e comunque almeno un ciclo
altrimenti i semafori messi all'uscita di scuole o manicomi non lascerebbero passare mai nessuna auto
poco rimane ormai
// lampeggio del giallo pedone, vale come buzzer per i ciechi
if (buzzer){
digitalWrite(PPG,digitalRead(SEG));
//SEG lampeggggia già di suo, inutile inventare l'acqua calda.....
}
che fa lampeggiare il verde pedonale negli ultimi secondi, vale come giallo per i pedoni e per un eventuale buzzer per i ciechi