Se quenza fosse una serie

ma anche non lo fosse si tratterebbe comunque di un gioco di parole

per altri motivi ho studiato un possibile sequenziatore di accensione (e spegnimento)

siccome credo che la cosa possa essere utile a chi volesse cercare ho deciso di lasciare qui nel forum un prototipo di "sequenziatore universale"

/* di Nelson-StandardOil
   IDE 1.8.19
   Progetto:
   Scopo: sequenziatore d'accensione
   Data inizio lavori: 20 11 21  --- 24min
*/

// pin due e tre segnalano la necessità di accendere o di spegnere
// se fosse un livellostato sarebbero i due interruttori di livello
// non è escluso che serva di negare i varii pin negli if()
#define GO 2
#define STOP 3


// l'insieme dei pin da accendere a passi
byte out[] = {4, 5, 6, 7, 8, 9}; // ho voluto esagerare
#define PASSI sizeof out / sizeof out[0]

// la durata del singolo passo in millisecondi, ammesso che i passi siano sempre uguali
#define PASSO 5000


// dichiarazioni finite
// taca banda, lavoro preparatorio
void setup(void)
{
   for (byte i = 0; i < PASSI; i++)
   {
      pinMode(out[i], OUTPUT);
   }

   pinMode(GO, INPUT_PULLUP); // adattare per eventuali sensori particolari
   pinMode(STOP, INPUT_PULLUP);
}



// lavoro sporco
void loop(void)
{
   static bool acceso = 0; // acceso/spento, variabile statica, per non usare una globale
   static unsigned long int tempo;

   if (!digitalRead(GO))
   {
      if (!acceso)
      {
         tempo = millis();
         acceso = 1;
      }
   }

   if (!digitalRead(STOP))
   {
      if (acceso)
      {
         acceso = 0;
         tempo = millis();
      }
   }

   // verifica dei tempi
   if (acceso)
   {
      for (byte i = 0; i < PASSI; i++)
      {
         if (millis() - (PASSO * i)  > tempo)
         {
            digitalWrite(out[i], 1);
         }
      }
   }

   else
   {
      for (byte i = 0; i < PASSI; i++)
      {
         if (millis() - (PASSO * i) > tempo)
         {
            digitalWrite(out[PASSI - 1 - i], 0);
         }
      }
   }
}

poi lo metto nel mio "la pappa è fatta"

e se mi capita metto anche come cambiare i tempi e/o mettere condizioni differenti dal semplice tempo

A me non funge. Alle volte si accendono tutti i led quando premo GO.
Inoltre la prima azione sul primo elemento della sequenza deve essere immediata. Se il primo elemento è A, allora vogliamo accendere, se il primo elemento è C significa che vogliamo spegnere e C deve essere spento subito, poi passano 5 secondi ecc.

Secondo me il for non è la scelta ideale.

Ciao.

Siccome lo ho provato...
Io non parlo mai a vanvera

Il test nel for è su PASSO*i
Siccome nella prima iterazione i vale zero la condizione è immediatamente valida per la prima uscita

Occhio al debounce

Mica ho detto che parli a vanvera. Non funge per i primi 2 secondi, cioè se premo GO prima che siano trascorsi 2 secondi si accendono tutti e 3 led.

Che ti devo dire testalo nuovamente.

Certo 5000 x 0 fa 0 e questo lo avevo già notato, però millis() parte da zero.

Se premo GO e ad esempio tempo = 299
299 - 5000 = 4294962595 che è maggiore di 299

A parte questo problemino che si verifico solo entro 10 secondi se PASSO = 5000, tutto il resto non mi piace neanche un poco.

Pensa alla fase di lancio di un missile, o meglio al conto alla rovescia che non è interrompibile o meglio lo si chiama aborto, cioè è un procedura specifica per invalidare la fase di lancio ancora non completata.

Ciao.

Hai ragione per la storia dei primi secondi non va
Lo avevo appena pensato

Mi ero allontanato (vescica) subito dopo aver caricato il programma, non ci avevo badato

Ma siccome ti stimo ho appena riesaminato il programma riga a riga
E avevo trovato anch'io la cosa
Adesso ci guardo per la soluzione

Per la storia della sequenza interrompibile si no

Non ho capito cosa intendi
Se ci sono situazioni critiche l'analisi da compiere è da compiere prima, non a questo stadio

Qui si accende e spegne in sequenza una serie di lucine

E lo fa
Se dai stop prima della fine della sequenza inizia a spegnere, e dopo il tempo giusto è tutto spento

Secondo me questo è il più semplice programma che risolve un certo problema del quale si è parlato oggi

Per altre esigenze ...
Basta chiedere

Credo che sia qui il problema

Millis() - tempo > passo * i

Come peraltro in tutti i testi viene consigliato

Come ho fatto a dimenticare?

Non so...

"Come si chiamava di nome Halzeimer?
Non me lo ricordo...
È così che comincia..."

Pure questo non mi piace, o meglio l'ho considerata una operazione atomica. Ma quello che più non mi piace è:

  1. non ci sono funzioni che permettono di scomporre il problema
  2. il for cicla sempre anche quando tutti i led sono accesi o spenti.

Niente Gatto richiede la mia attenzione in modo impellente.

Capisco
Io due
Una femmina di divanopardo pinguis
E una gattina rossa di 6 mesi non figlia del divanopardo
Anche loro chiamano spesso
Per fortuna non abito da solo

Comunque...

Cosa vuoi scomporre?
Meno di così rimani senza problema...
Seriamente:
Ci sono solo 29 statement
Ci togli setup, inizializzazioni e digitalwrite ( che comunque sono obbligatorie se vuoi accendere / spegnere)

Cosa rimane?
Due if per i due ingressi
E due cicli
Dove vuoi scomporre?

Diverso sarebbe il caso di un sistema "generico"
Ma le prescrizioni, specialmente se strane e critiche, vanno definite prima di aprire lo IDE

Cosa che non fa male a nessuno...

La chiamata questa volta era sia vocale che fisica, esce le unghia poi resta impigliato nel maglione o pantalone e li rovina alle volte. Quindi era un chiamata impellente, tradotto: alzati il culo da quella sedia prima di subito. :smiley:

Perde pelo sempre e io sono allergico al pelo del gatto con tanto di bolle sul braccio nei test. Quindi divani letti sono off-limit per lui. Ama la sua cassetta della frutta di legno scassata che si mordicchia ogni tanto.

Certo fintanto che si tratta di accendere dei led tutto va bene, ma nella realtà quei led sono motori e millis riparte da zero.

Inoltre io immagino sempre che il programma sia molto complesso, per cui lo disegno modulare, che vuole dire minimo una funzione da richiamare.

Se voglio integrare nel mio software la funzionalità che faccio ci copia il tuo codice nel loop così lo affollo.

Poi penso che inizialmente il silos sia vuoto per cui già fallisce in partenza.

Già vero, non c'è silos ci sono solo le lucine e i pulsantini.

Ciao.

Beh...

Il caso complesso, con differenti azioni e differenti temporizzazioni per ogni azione lo avevo già risolto e pubblicato mesi fa

E lo avevo anche già detto, nella discussione del silos
Poi c'è chi cerca e chi no...
In effetti questo dimostra che nella discussione del silo il tipo ha proprio evitato di cercare...

Prova con: " come ti prenoto il promemoria"

Trovi risolti i tuoi attuali dubbi

Perché?
Fa parte delle prescrizioni accendersi a silo vuoto
Non lo fa?

Oggi ho avanzato 5 minuti
La fa
Se si accende arduino con "attivo" il sensore di silo vuoto parte direttamente la sequenza di avviamento, come è giusto che sia

Anche l'esclusione del casi di silo pieno E silo vuoto contemporanei è una banalità da scrivere

E pure l'evitare il continuo ripetersi di digitalwrite inutili richiede meno di 5 minuti

Nel complessivo in meno di un quarto d'ora ho fatto tutto il "richiesto"

A organizzarsi....

Magari domani metto la nuova versione