come ho già detto anni fa: mai sfidarmi a scrivere codice
ecco, senza dare la pappa fatta, ma un buon scheletro per partire
/*
By C1P8, continuo a non essere rotto
Per fare? Un timer ciclico ripetibile ed interrompibile
*/
#define START 2 // pin del pulsante di start
#define PAUSA 3 // pin del pulsante di pausa
#define cicli 4 // uso la minuscola perchè diverrà in futuro una variabile
byte pin[] = {4, 5, 6}; // i pin usati per le uscite: pompa, aria, olio
byte Pin = sizeof pin / sizeof pin[0];
unsigned long int tempi[] = {1000, 2000, 4000, 300}; // i tempi in millisecondi tra uno stato e il successivo
byte Stati = sizeof tempi / sizeof tempi[0];
char * uscite[] = {"001", "010", "110", "100", "000"}; // la configurazione di uscita da tenere,una in più rispetto ai tempi, per la configurazione di stop definitivo
// si potrebbero anche usare campi di bit, ma non esageriamo
// primo carattere prima uscita, secondo carattere seconda uscite, etc etc
// carattere 0 uscita spenta, carattere diverso da zero uscita accesa
void setup(void)
{
for (byte i = 0; i < Pin; i++)
{
pinMode(pin[i], OUTPUT);
}
pinMode(START, INPUT);
pinMode(PAUSA, INPUT);
}
void loop(void)
{
while (!digitalRead(START)); // aspetta che venga premuto start
//mesegue i cicli richiesti
for (byte i = 0; i < cicli; i++)
{
// eseguo un ciclo
ciclo();
}
}
void ciclo(void)
{
// esegue un singolo ciclo della sequenza richiesta
unsigned long int inizio = millis();
int stato = 0;
uscita(uscite[stato]);
while (1) // ciclo continuo
{
if (!digitalRead(PAUSA))
{
// qui si spegne il led di pausa
if (millis() - inizio > tempi[stato])
{
stato++;
inizio = millis();
if (stato > Stati)
{
uscita(uscite[stato]);
break;
}
}
}
else
{
// qui si accende il led di pausa;
}
}
}
void uscita(char * uscite)
{
for (byte i = 0; i < Pin; i++)
{
digitalWrite(pin[i], (uscite[i] - '0'));
}
}
per maurotec:
lo hofatto esattamente come dicevo io: copiando da timer ciclici trovati qui sul forum
uno addirittura in una discussione iniziata da te
non ci sono puntatori a funzioni, callback, macchine a stati virtuali, classi o altri ammeniccoli
puro buon codice C vecchia maniera
il funzionamento è semplicissimo
oppure no?
forse è meno semplice di quello che si crede, se qualcuno non conosce il C
e allora siamo al punto dove ero io:
si parte dalle basi
descrivere il problema
e poi,
pseudocidice
e poi traduzione in C
etc etc
questo è semplice
non altr
e questo volevo far fare allo OP
e secondo me questa è e rimane l'unica soluzione al problema
PS
rimane da trovare come far scecliere il numero di cicli da ripetere e come visualizzarlo con/senza un display
e se lo OP non ci dice cosa ha e cosa sa fare e' inutile proseguire
PPS
per la cronaca, stamattina ci ho messo poco meno di un'ora a scriverlo
compresa la ricerca dei timer
mentre aspettavo che portassero l'ossigeno per mamma
consegnato, torno a fare il mio