visto che sembra che siamo in dirittura di arrivo, mi permetto di scrivere le mie idee, come al solito risultano alternative a quello che ho letto finora
ho pensato, non me ne vogliate se sono monomaniaco, ad un array di piedini per le uscite ed a un ciclo for per ciclarlo
la condizione per accendere o spegnare le uscite è un semplice test del tipo tempo maggiore a gradino per numero dell'uscita
contando la millis() e il suo overflow diventa una cosa del genere
al premere del tasto segno i millisescondi
poi, se tasto è premuto, accendo le varie uscite per una condizione del tipo:
millis meno istante memorizzato > gradino per numero dell'uscita
è quindi venuta fuori una cosa del genere:
#define PIEDINI 5
int out[PIEDINI] = {2, 3, 4, 5, 6};
// definisco le uscite in uso
#define IN 7
// definisco il piedino di ingresso
// che DEVE avere il debounce hardware
// essendo importanti i tempi di esecuzione NON posso usare il debounce SW
// definisco il passo di tempo da attendere
int passo = 1000; //1000 millisecondi un secondo
// la variabile che registra il momento di pressione del tasto
unsigned long h;
// la variabile che registra lo stato del pulsante
byte st;
e con questo abbiamo definito il campo giochi
con i piedini di uscita scritti in un array
che mi permette sia di espanderli, sia di usare piedini non contigui
void setup() {
// attivo le uscite e gli ingressi
for (int i = 0; i < PIEDINI; i++) {
pinMode(out[i], OUTPUT);
}
pinMode(IN, INPUT);
}
l'inizializzazione dei piedini, praticamente una cosa obbligata
con l'unico trucco di parametrizzarla e chiuderla in un ciclo
facilmente espandibile
la loop, per una volta lunga, non ci sono funzioni complesse che ho dovuto sviluppare separatamente
void loop() {
// se il tasto è cambiato
if (digitalRead(IN) != st) {
h = millis();
// memorizzo il tempo
}
st = digitalRead(IN);
tutte le volte che il tasto cambia. memorizzo il tempo
if (st) {
// se l'ingresso è attivo
// accendo le uscite in funzione di un tempo
for (int i = 0; i < PIEDINI; i++) {
digitalWrite(i, ((millis() - h) > (i * passo)));
// accendo o spengo l'uscita a seconda se millis supera h+N gradini
}
}
else {
// ingresso non attivo, spengo tutte le uscite
for (int i = 0; i < PIEDINI; i++) {
digitalWrite(out[i], LOW);
}
}
}
qui c'è tutto il lavoro
prima il ramo else, il più semplice da capire
se NON c'è st, (siccome st=digitalread....) è scritto prima è come dire
se il tasto NON è premuto
un ciclo for spegne le uscite
adesso il ramo if
se il tasto è premuto
un ciclo for per ogni uscita confronta il tempo passato dalla pressione del tasto con il NUMERO dell'uscita moltiplicato la costante passo
per la prima uscita il NUMERO è 0, la condizione è vera da subito
per la seconda uscita, numero 1, condizione vera dopo un "passo" di millisecondi
e via così..........
per risparmiare qualche variabile uso la condizione come argomento della digitalwrite corrispondente
esito di tutto questo?
non lo so, nel fine settimana sono in una casa differente e non ho la mia UNO
ma compilare compila e mi dice:
Lo sketch usa 1142 byte (3%) dello spazio disponibile per i programmi. Il massimo è 32256 byte.
Le variabili globali usano 24 byte (1%) di memoria dinamica, lasciando altri 2024 byte liberi per le variabili locali. Il massimo è 2048 byte.
qualche anima buona vuole provare per me a vedere se funziona?