sto cercando di creare un progettino stupido nel quale il mio programma deve far lampeggiare/respirare/ecc. dei vari led ed in contemporanea ma con tempistiche ttalmente diverse tra loro (alcuni molto lunghi ed altri molto corti).
pensavo di creare più "void loop" ma non funziona...
avete soluzioni alternative?
corri a presentarti nell'apposita sezione prima che se ne accorgano
le funzioni setup e loop sono univoche, non puoi crearne più di una. quello che puoi fare è gestire all'interno del loop diverse temporizzazioni usando millis()
>sibi0: come ti è già stato segnalato, essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentartiIN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.
Probabilmente intende quell'effetto di accensione e spegnimento graduali che simulano respirazione e/o battito cardiaco ... alcune apparecchiature ormai lo usano al posto del semplice lampeggio del led per fare scena ...
Tempo fa avevo letto qualcosa in rete e salvato un pezzo di codice relativo ad un'effetto simile non bloccante, se lo trovo lo posto ... ci tengo comunque a precisare che non e' roba mia, anche se non ho idea di chi l'avesse scritto in origine, non c'erano riferimenti ... l'avevo salvato perche' volevo studiarmelo e cercare di capire il ragionamento che c'era dietro, magari puo venire buono pure a voi ...
EDIT: trovato, l'avevo ancora nella memoria di notepad++ ... l'autore, chiunque fosse, ha usato la funzione seno, probabilmente per avere una "curva" realistica di luminosita' che simulasse l'effetto "respiro" (era la parte che volevo studiarmi), ma ritengo che si possa usare la stessa procedura anche per andamenti o curve diversi, in fondo e' un semplice richiamo ad una funzione temporizzata, come quelle che gia sono state suggerite anche in altri post per eseguire funzioni a tempo non bloccanti con millis ... serviranno, ovviamente, variabili diverse per ogni funzione con tempo differente ... e personalmente la modificherei per evitare l'overflow trasformandola nel solito "millis - temposalvato > ritardo", invece di lasciare "temposalvato + ritardo < millis" come nell'originale ...
#include <math.h>
#define ledPin 11
int i=0;
int breathe_delay = 15; // delay between loops
unsigned long breathe_time = millis();
void setup()
{
}
void loop()
{
nonBlockingBreath(); // call the nonblocking function
// yourOtherCodeHere();
}
void nonBlockingBreath()
{
if( (breathe_time + breathe_delay) < millis() ){
breathe_time = millis();
float val = (exp(sin(i/2000.0*PI*10)) - 0.36787944)*108.0;
// this is the math function recreating the effect
analogWrite(ledPin, val); // PWM
i=i+1;
}
}