Sarebbe meglio dire la libreria del tempo..
siccome mi sono anche scocciato di gestire sempre la millis per i miei temporizzatori e ancora di più mi sono scocciato di vedere inesperti e similia che si incatastano a fare delay e domandarsi come mai poi i pulsanti non rispondono mi sono fatto una librerietta di temporizzatori
e non ditemi che esiste la timealarm, lo so, ma è anche troppo per due blink without delay....
cosa ho fatto? una libreria che gestisce 5 temporizzatori, basta fare il test temporizzatore(numero), oppure caricarlo con temporizzatore(numero, tempo)
è più difficile a dirsi che a farsi
metto qui la libreria, occhio che io non so programmare c++, è tutto santo C (beh, non proprio, ma quasi)
#ifdef TEMPORIZZATORI
#else
#define TEMPORIZZATORI 5
#endif
bool temporizzatore(char item, unsigned long tempo = 0);
bool temporizzatore(char item, unsigned long tempo)
{
static unsigned long int tempi[TEMPORIZZATORI];
static unsigned long int avvii[TEMPORIZZATORI];
byte indice = (item - 'A') % TEMPORIZZATORI;
if (tempo)
{
// il tempo è presente
// carichiamo l'elemento dell'array
avvii[indice] = millis();
tempi[indice] = tempo-1;
return 0;
}
else
{
// tempo è nullo, si tratta di interrogazione
if (millis() - avvii[indice] > tempi[indice])
{
// tempo superato
// azzero il tempo
avvii[indice] = 0;
tempi[indice] = 0;
return 1;
}
else
{
return 0;
}
}
}
la copiate in un file puntoacca e lo mettete nel percorso di ricerca delle librerie, sotto ve lo allego
invece l'esempio d'uso: banale
// di Nelson "StandardOil"
// Idea da sviluppare: libreria di timer
//#define TEMPORIZZATORI 5
// cambiare la define PRIMA di chiamare la libreria cambia il numero dei temporizzatori indipedenti gestibili
// di default sono 5
// occupazione di memoria: due unsigned long int per ogni temporizzatore inizializzato (come farlo diretto in codice)
#include "temporizzatori.h"
void setup(void)
{
Serial.begin(9600);
Serial.println("Prova temporizzatori multipli");
}
void loop(void)
{
if (temporizzatore('A'))
// chiamare il temporizzatore a vuoto esegue il test
// temporizzatori non inizializzati si considerano sempre scattati
{
Serial.println("temporizzatore A a 5 secondi");
temporizzatore('A', 5000);
// ricordarsi di reinizializzare il temporizzatore
// che per progetto e' ONE SHOT e si resetta
}
if (temporizzatore('B'))
{
Serial.println("temporizzatore B a 3 secondi");
temporizzatore('B', 3000);
}
if (temporizzatore('C'))
{
Serial.println("temporizzatore C a 2 secondi");
temporizzatore('C', 2000);
}
if (temporizzatore('D'))
{
Serial.println("temporizzatore D a 1,5 secondi");
temporizzatore('D', 1500);
}
if (temporizzatore('E'))
{
Serial.println("temporizzatore E a 8 secondi");
temporizzatore('E', 8000);
}
}
è banale, come vedete
basta chiamare a vuoto il temporizzatore con solo argomento il suo nome, che vi restituisce 1 se non inizializzato o tempo scaduto
e per inizializzarlo basta chiamare il temporizzatore con due argomenti, il nome del temporizzatore e il tempo da aspettare e restituisce zero
questione NOME del temporizzatore:
io lo so che alcuni inesperti qui si incasinerebbero se la funzione accettasse due numeri sarebbero capaci di ssconfonderli
quindi i temporizzatori si riconoscono dal NOME, un singolo carattere
e siccome io lo so che alcuni sarebbero capaci di usare caratteri a muzzo ho messo un modulo (resto della divisione)
se ve ne servono di più o di meno cambiate la define
per ogni domanda io qui sono
Sono graditi gli applausi[/center]
No, scherzo, aiutatemi a trovarci i bacherozzi (bug in italiano)
oh, ma non si riesce proprio a fare rosso e centrato?, ci riuscii, evviva sempre Patrick_M
temporizzatori.ino (1.38 KB)
temporizzatori.h (921 Bytes)