Faccio un paio di esempi, sono stralci del codice che voglio aggiornare ad 8 uscite:
// Test uscite
lcd.setCursor(0, 2);
lcd.print("| Test Uscita: A |");
digitalWrite(POMPAA , HIGH);
delay(1000);
digitalWrite(POMPAA , LOW);
delay(500);
lcd.setCursor(0, 2);
lcd.print("| Test Uscita: B |");
digitalWrite(POMPAB , HIGH);
delay(1000);
digitalWrite(POMPAB , LOW);
In questo caso fa il test delle uscite ad intervalli di 1s. Volendo fare il test di 8 uscite indipendenti, a livello di codice sono diverse righe ed occupano spazio in memoria, magari una gestione ad array è più semplice da comprendere, più compatta ed occupa meno.
// Aggiorna il display ed il funzionamento secondo il modo scelto
int tempStato = LOW;
if (FlagAllarme == 0 && ((CUmid == 0) || (CUmid == 1 && StopMin == 0 && StopMax == 0))) tempStato = HIGH;
if (Modo == 2) {
StatoA = 0; // OFF
digitalWrite(POMPAA, LOW);
StatoB = 0;
digitalWrite(POMPAB, LOW);
}
if (Modo == 3) {
StatoA = 1; // ON-A
digitalWrite(POMPAA, tempStato);
StatoB = 0;
digitalWrite(POMPAB, LOW);
}
if (Modo == 4) {
StatoA = 0; // ON-B
digitalWrite(POMPAA, LOW);
StatoB = 1;
digitalWrite(POMPAB, tempStato);
}
In questo caso a seconda del Modo selezionato attiva la funzionalità AUTO, Uscita 1 ON, Uscita 2 ON.
Volendo espandere ad 8, potrei usare lo Switch() per il Modo e gestire un array di 0 ed 1 per attivare la giusta uscita in funzione del modo selezionato.
// Controlla qual'e' il prossimo programma *del giorno* da eseguire, che e' il primo successivo al tempo attuale
// che deve essere eseguito nel giorno attuale, oppure quello in corso di esecuzione
// Funziona anche programmi sovrapposti sulle linee A e B (anche sovrapposte A1-A2 / B1/B2)
// ed anche se gli orari non sono in ordine cronologico
StatoA = 0;
StatoB = 0;
for (byte i = 0; i <= 3; i++)
{
// se il T attuale e' compreso in uno dei programmi, attiva le pompe se livello acqua e umidita' sono rispettati
if ( GiornoInn[i][Giorno] == 1 && Durata[i] > 0 &&
(hour() * 60 + minute()) >= (OrePrg[i] * 60 + MinutiPrg[i]) && (hour() * 60 + minute()) < (OrePrg[i] * 60 + MinutiPrg[i] + Durata[i]))
{
// Innaffia se il ctrl umidita' e' OFF oppure e' ON e l'umidita' rilevata e' nel range impostato
// e rispetta le eventuali soglie d'isteresi
if ( FlagAllarme == 0 && ( (CUmid == 0) || (CUmid == 1 && StopMin == 0 && StopMax == 0) ) )
{
if (i < 2) StatoA = 1; else StatoB = 1;
}
}
}
Questo è per il modo = 1 con 2 possibilità per ciascuna delle due uscite disponibili (array di 4 elementi, 2 per ciascuna uscita).
In questo caso vorrei avere una possibilità per ciascuna delle 8 uscite, quindi a parte modificare la gestione dell’array per 8 invece che 4:
for (byte i = 0; i <= 7; i++)
Come potrei gestire il terzo if con 8 uscite?
if (i < 2) StatoA = 1; else StatoB = 1;
Chiedo scusa per le molte domande, ma queste sezioni di codice non sono farina del mio sacco, per cui al momento le uso così come sono ma mi serve espandere il sistema (ed imparare anche come gestire in maniera furba le uscite).