a questo punto le variabili globali
e qui ho truccato, non le ho scritte tutte subito
mano a mano che mi sono servite le ho aggiunte
char sequenza[11][5] = {"RRB1", "VRD2", "GRC3", "RRB4", "RVE5", "RGC0", "RRB7", "PPD8", "WWB0" , "LLA:" , "00A9"}; // array di sequenza delle luci
unsigned long tempo = 0; //istante del prossimo cambio luci
unsigned long tempseg = 0; //istante del prossimo lampeggio led
byte stato = 0; // punto in esecuzione nel ciclo
byte chiamata = 0; // presenza chiamata pedonale
byte buzzer = 0; //lampeggio per simulare il buzzer
byte servizio = 0; // 0 servizio diurno, uno servizio notturno
in fondo sono quasi obbligate... non c'è storia...
pure la setup è quasi obbligata
void setup() {
// uscite
pinMode(P1R, OUTPUT);
pinMode(P1G, OUTPUT);
pinMode(P1V, OUTPUT);
pinMode(P2R, OUTPUT);
pinMode(P2G, OUTPUT);
pinMode(P2V, OUTPUT);
pinMode(PPV, OUTPUT);
pinMode(PPG, OUTPUT);
pinMode(CHI, OUTPUT);
pinMode(SEG, OUTPUT);
// ingressi
pinMode(PUL, INPUT_PULLUP);
pinMode(NOT, INPUT_PULLUP);
// inizializzo seriale
Serial.begin(9600);
Serial.println(F("Programma di prova semaforo a due vie"));
// faccio partire il semaforo
luci(sequenza[0]);
}
la sola cosa particolare è la chiamata della luci(sequenza[0])
sequenza indice zero è la prima configurazione utile del semaforo
la funzione luci(stringa) accende e/o spegne le paline secondo la configurazione data dalla stringa in ingresso
ecco la funzione luci()
void luci(char comando[]) {
// per debug, la mando in seriale
Serial.println(comando);
// poi carico il tempo
// che e' codificato nel terzo carattere
switch (comando[2]) {
case 'A':
tempo = millis() + 1000;
break;
case 'B':
tempo = millis() + 5000;
break;
case 'C':
tempo = millis() + 15000;
break;
case 'D':
tempo = millis() + 60000;
break;
case 'E':
tempo = millis() + 120000;
break;
}
// prenoto la prossima configurazione
// che e' codificata nel quarto carattere
stato = comando[3] - '0';
// tutto il lavoro delle luci è dato dai due primi caratteri
// palina 1
switch (comando[0]) {
case '0':
// palina spenta
digitalWrite(P1R, LOW);
digitalWrite(P1G, LOW);
digitalWrite(P1V, LOW);
digitalWrite(PPV, LOW);
digitalWrite(PPG, LOW);
buzzer = 0;
break;
case 'R':
// rosso
digitalWrite(P1R, HIGH);
digitalWrite(P1G, LOW);
digitalWrite(P1V, LOW);
digitalWrite(PPV, LOW);
digitalWrite(PPG, LOW);
buzzer = 0;
break;
case 'G':
// giallo
digitalWrite(P1R, LOW);
digitalWrite(P1G, HIGH);
digitalWrite(P1V, HIGH);
digitalWrite(PPV, LOW);
digitalWrite(PPG, LOW);
buzzer = 0;
break;
case 'V':
// Verde
digitalWrite(P1R, LOW);
digitalWrite(P1G, LOW);
digitalWrite(P1V, HIGH);
digitalWrite(PPV, LOW);
digitalWrite(PPG, LOW);
buzzer = 0;
break;
case 'L':
// giallo del lampeggio
digitalWrite(P1R, LOW);
digitalWrite(P1G, HIGH);
digitalWrite(P1V, LOW);
digitalWrite(PPV, LOW);
digitalWrite(PPG, LOW);
buzzer = 0;
break;
case 'P':
// verde ai pedoni
digitalWrite(P1R, HIGH);
digitalWrite(P1G, LOW);
digitalWrite(P1V, LOW);
digitalWrite(PPV, HIGH);
digitalWrite(PPG, LOW);
buzzer = 0;
break;
case 'W':
// giallo ai pedoni, che lampegggia come buzzer
digitalWrite(P1R, HIGH);
digitalWrite(P1G, LOW);
digitalWrite(P1V, LOW);
digitalWrite(PPV, HIGH);
digitalWrite(PPG, HIGH);
buzzer = 1;
break;
default:
break;
}
// palina 2 alcune voci non servono
switch (comando[1]) {
case '0':
// palina spenta
digitalWrite(P2R, LOW);
digitalWrite(P2G, LOW);
digitalWrite(P2V, LOW);
break;
case 'R':
// rosso
digitalWrite(P2R, HIGH);
digitalWrite(P2G, LOW);
digitalWrite(P2V, LOW);
break;
case 'G':
// giallo
digitalWrite(P2R, LOW);
digitalWrite(P2G, HIGH);
digitalWrite(P2V, HIGH);
break;
case 'V':
// Verde
digitalWrite(P2R, LOW);
digitalWrite(P2G, LOW);
digitalWrite(P2V, HIGH);
break;
case 'L':
// giallo del lampeggio
digitalWrite(P2R, LOW);
digitalWrite(P2G, HIGH);
digitalWrite(P2V, LOW);
break;
default:
break;
}
}
come si vede è una pura unumerazione di casi e accendi spegni...
una noia scriverla.........
le cose interessanti:
la variabile stato, letta dal 4 carattere, converito da ASCII a numerico col semplice trucco di togliere il valore '0'
la variabile stato NON è lo stato attuale, ma lo stato FUTURO