Salve, sto cercando di implementare in un mio sketch delle nuove azioni. Tali azioni devono essere eseguite dopo un certo tempo che arduino è stato acceso, ad esempio:
1) passati 10 secondi, accende un led
2) passati 12 secondi, accende un altro led
3) passati 15 secondi, spegne tutti i led
Ho provato ad implementare lo sketch base del blink senza delay ma se metto più di una azione in coda il programma si blocca alla prima oppure non riesco a fare smettere di lampeggiare i led. Potete indicarmi la retta via, magari con una bozza :) ?
Grazie!
Temporizzare azioni con millis
26 messaggi
• Pagina 1 di 3 • 1, 2, 3
0
voti
-

dadothebest
24 2 7 - Frequentatore

- Messaggi: 229
- Iscritto il: 25 nov 2013, 17:13
- Località: Ascoli Piceno
1
voti
Non sono certo un'esperto, però io farei cosi :
- Codice: Seleziona tutto
int led1 = 11;
int led2 = 12;
//Inizzializzo le variabili per conteggiare il tempo
unsigned long time_iniziale;
unsigned long time;
// the setup routine runs once when you press reset:
void setup() {
pinMode ( led1, OUTPUT );
pinMode ( led2, OUTPUT );
time_iniziale = millis(); //Riempo la variabile con il valore di millis attuali
}
// the loop routine runs over and over again forever:
void loop() {
time = millis(); //Metto nel loop la variabile del tempo in millis attuale
if ( time > time_iniziale + 1000 ){ //Semplice if dove controllo se i millis attuali di "time" sono maggiori di "time_iniziale" piu il tempo da me scelto ( 1sec )
digitalWrite ( led1, HIGH); // se SI accendo il led
}
if ( time > time_iniziale + 2000 ){ //Ripeto if precedente
digitalWrite ( led2, HIGH );
}
if ( time > time_iniziale + 3000 ){ //ripeto if precedente con la sola differenza che spengo i led
digitalWrite ( led1, LOW);
digitalWrite ( led2 ,LOW );
time_iniziale = millis(); //Aggiorno il valore di "time_iniziale" al valore dei millis correnti per fare una ripetizione infinita de loop
}
}
0
voti
3) passati 15 secondi, spegne tutti i led...
... non riesco a fare smettere di lampeggiare i led.
Cosa deve succedere dal 15-esimo secondo in poi quando i due led si sono spenti?
Se inizi di nuovo dal punto 1) allora lo sketch di

0
voti
solideo ha scritto:Ho presupposto una ciclicità dello sketch.
Ho visto, il tuo codice è perfetto, sono le specifiche che non sono chiare al 100%! Mi è venuto il dubbio per quell'affermazione dell'OP ("non riesco a far smettere di lampeggiare i led"). In tal caso necessita di una banale modifica.

0
voti
Grazie dell'aiuto, ho provato a giocare con lo sketch che hai scritto, sembra che funzioni come voglio ma mi sono imbattuto in un altro problema. L'ho modificato in questo modo così che i led 11 lampeggino ma eseguita la seconda azione i led non si spengono completamente ma si abbassano di luminosità, mentre eseguita la quarta azione si spengono correttamente e tutto inizia daccapo.
Inoltre il ciclo deve andare in loop ma dopo un certo periodo di tempo.
- Codice: Seleziona tutto
int led1 = 11;
int led2 = 6;
//Inizzializzo le variabili per conteggiare il tempo
unsigned long time_iniziale;
unsigned long time;
// the setup routine runs once when you press reset:
void setup() {
pinMode ( led1, OUTPUT );
pinMode ( led2, OUTPUT );
time_iniziale = millis(); //Riempo la variabile con il valore di millis attuali
}
// the loop routine runs over and over again forever:
void loop() {
time = millis(); //Metto nel loop la variabile del tempo in millis attuale
if ( time > time_iniziale + 1000 ){ //Semplice if dove controllo se i millis attuali di "time" sono maggiori di "time_iniziale" piu il tempo da me scelto ( 1sec )
digitalWrite ( led1, HIGH); // se SI accendo il led
}
if ( time > time_iniziale + 1100 ){ //Semplice if dove controllo se i millis attuali di "time" sono maggiori di "time_iniziale" piu il tempo da me scelto ( 1sec )
digitalWrite ( led1, LOW); // se SI accendo il led
}
if ( time > time_iniziale + 1500 ){ //Semplice if dove controllo se i millis attuali di "time" sono maggiori di "time_iniziale" piu il tempo da me scelto ( 1sec )
digitalWrite ( led1, HIGH); // se SI accendo il led
}
if ( time > time_iniziale + 1600 ){ //ripeto if precedente con la sola differenza che spengo i led
digitalWrite ( led1, LOW);
time_iniziale = millis(); //Aggiorno il valore di "time_iniziale" al valore dei millis correnti per fare una ripetizione infinita de loop
}
}
Inoltre il ciclo deve andare in loop ma dopo un certo periodo di tempo.
-

dadothebest
24 2 7 - Frequentatore

- Messaggi: 229
- Iscritto il: 25 nov 2013, 17:13
- Località: Ascoli Piceno
0
voti
Mi serve per comandare alba-tramonto per un presepe e questo lo userei per l'effetto "flash" da integrare nel programma che già possiedo per ricreare l'effetto dei lampi 
-

dadothebest
24 2 7 - Frequentatore

- Messaggi: 229
- Iscritto il: 25 nov 2013, 17:13
- Località: Ascoli Piceno
0
voti
solideo ha scritto:Cosa deve fare di preciso?
- led acceso per X ms poi spento per Y ms e poi attesa Z ms il tutto da ripetersi per N volte e poi spento e bla bla bla
Mi metto nei panni di
Sbaglio?
0
voti
Vi spiego bene cosa devo fare di preciso. Ho il seguente sketch che sto utilizzando attualmente il cui scopo è quello di simulare il giorno e la notte, quindi con accensione e spegnimento in fade o normalmente di diversi led :
A questo codice voglio aggiungere un altro effetto che consiste nel far lampeggiare un LED diverse volte per circa 100ms a distanza di tempo diverso. Per fare questo avevo pensato alla funzione millis dove stabilisco dopo quando tempo si deve accendere e spegnere. Ad esempio questo lampeggio vorrei aggiungerlo su questa parte di codice:
Ho provato ad implementare qualche codice (come ho fatto sopra) ma il massimo che sono riuscito ad ottenere è che i LED passato quel lasso di tempo rimangono accesi e non si spengono.
Chiedo scusa se non sono stato chiaro e della mia ignoranza in materia, vi ringrazio per il tempo che mi avete dedicato.
- Codice: Seleziona tutto
#define alba 10
#define sole 11
#define tramonto 9
#define lampi 6
#define stelleA 5
#define stelleB 3
#define luciint 2
#define luciest 4
#define cometa 7
long onemin1[4] = { 5000,5000,5000,5000 };
long onemin2[4] = { 12582,68874,12585,85953 };
long timeStepOld = 0;
long timeStep = 0;
long timeCurr = 0;
byte fade[] = {255,250,245,240,235,230,225,220,215,210,205,200,195,190,185,180,175,170,165,160,155,150,145,140,135,130,125,120,115,110,105,100,95,90,85,80,75,70,65,60,55,50,45,40,35,30,25,20,15,10,5,0}; // 52 step
byte curr = 0;
unsigned long time_iniziale;
unsigned long time;
void setup() {
Serial.begin( 9600 );
pinMode( alba ,OUTPUT );
pinMode( sole ,OUTPUT );
pinMode( tramonto,OUTPUT );
pinMode( lampi ,OUTPUT );
pinMode( stelleA,OUTPUT );
pinMode( stelleB,OUTPUT );
pinMode( luciint,OUTPUT );
pinMode( luciest,OUTPUT );
pinMode( cometa,OUTPUT );
analogWrite( alba ,LOW );
analogWrite( sole ,LOW );
analogWrite( tramonto,LOW );
analogWrite( lampi ,LOW );
analogWrite( stelleA,LOW );
analogWrite( stelleB,LOW );
digitalWrite( luciint,LOW );
digitalWrite( luciest,LOW );
digitalWrite( cometa,LOW );
time_iniziale = millis();
Serial.println("-- START --");
}
void loop() {
timeCurr = onemin2[curr];
timeStep = (timeCurr/52);
Serial.print("Current: "); Serial.println(curr);
Serial.print("Time current: "); Serial.println(timeCurr);
Serial.print("Time single step: "); Serial.println(timeStep);
time = millis();
// alba
if ( curr == 0 ) {
Serial.print("Fase: "); Serial.println("ALBA");
for ( int i=0; i<52; i++) {
analogWrite(alba, fade[(51-i)]);
if ( fade[i] < 25) digitalWrite(luciest, 0 );
analogWrite(sole, 0 );
analogWrite(tramonto, 0 );
if ( fade[i] < 25) digitalWrite(cometa, 0 );
analogWrite(stelleA, fade[i] );
analogWrite(stelleB, fade[i] );
digitalWrite(luciint, 1 );
delay( timeStep );
}
timeStepOld = timeStep;
}
// giorno
if ( curr == 1 ) {
Serial.print("Fase: "); Serial.println("GIORNO");
for ( int i=0; i<52; i++) {
analogWrite(alba, fade[i]);
if ( fade[i] < 125) analogWrite(sole, fade[(51-i)]*2 );
if ( fade[i] < 10) digitalWrite(luciint, 0 );
analogWrite(tramonto, 0 );
analogWrite(cometa, 0 );
analogWrite(stelleA, 0 );
analogWrite(stelleB, 0 );
digitalWrite(luciest, 0 );
delay( timeStepOld );
}
timeStepOld = (timeStepOld*52); // elapsed time
timeCurr = (timeCurr - timeStepOld);
delay( timeCurr );
}
// tramonto
if ( curr == 2 ) {
Serial.print("Fase: "); Serial.println("TRAMONTO");
for ( int i=0; i<52; i++) {
analogWrite(alba, 0);
analogWrite(sole, fade[i] );
analogWrite(tramonto, fade[(51-i)] );
if ( fade[i] < 150) digitalWrite(luciint, 1 );
analogWrite(cometa, 0 );
analogWrite(stelleA, 0 );
analogWrite(stelleB, 0 );
digitalWrite(luciest, 0 );
delay( timeStep );
}
timeStepOld = timeStep;
}
// notte
if ( curr == 3 ) {
Serial.print("Fase: "); Serial.println("NOTTE");
for ( int i=0; i<52; i++) {
analogWrite(alba, 0);
analogWrite(sole, 0 );
analogWrite(tramonto, fade[i] );
if ( fade[i] < 20) digitalWrite(cometa, 1 );
if ( fade[i] < 125) analogWrite(stelleA, fade[(51-i)]*2 );
if ( fade[i] < 250) analogWrite(stelleB, fade[(51-i)]*2 );
if ( fade[i] < 100) digitalWrite(luciest, 1 );
digitalWrite(luciint, 1 );
delay( timeStepOld );
}
timeStepOld = (timeStepOld*52); // elapsed time
timeCurr = (timeCurr - timeStepOld);
delay( timeCurr );
}
curr++;
if ( curr >= 4 ) { curr = 0; }
}
A questo codice voglio aggiungere un altro effetto che consiste nel far lampeggiare un LED diverse volte per circa 100ms a distanza di tempo diverso. Per fare questo avevo pensato alla funzione millis dove stabilisco dopo quando tempo si deve accendere e spegnere. Ad esempio questo lampeggio vorrei aggiungerlo su questa parte di codice:
- Codice: Seleziona tutto
// giorno
if ( curr == 1 ) {
Serial.print("Fase: "); Serial.println("GIORNO");
for ( int i=0; i<52; i++) {
analogWrite(alba, fade[i]);
if ( fade[i] < 125) analogWrite(sole, fade[(51-i)]*2 );
if ( fade[i] < 10) digitalWrite(luciint, 0 );
analogWrite(tramonto, 0 );
analogWrite(cometa, 0 );
analogWrite(stelleA, 0 );
analogWrite(stelleB, 0 );
digitalWrite(luciest, 0 );
if ( time > time_iniziale + 6000 ){ digitalWrite ( lampi, HIGH); }
if ( time > time_iniziale + 8000 ){ digitalWrite ( lampi, LOW); }
delay( timeStepOld );
}
timeStepOld = (timeStepOld*52); // elapsed time
timeCurr = (timeCurr - timeStepOld);
delay( timeCurr );
}
Ho provato ad implementare qualche codice (come ho fatto sopra) ma il massimo che sono riuscito ad ottenere è che i LED passato quel lasso di tempo rimangono accesi e non si spengono.
Chiedo scusa se non sono stato chiaro e della mia ignoranza in materia, vi ringrazio per il tempo che mi avete dedicato.
-

dadothebest
24 2 7 - Frequentatore

- Messaggi: 229
- Iscritto il: 25 nov 2013, 17:13
- Località: Ascoli Piceno
26 messaggi
• Pagina 1 di 3 • 1, 2, 3
Chi c’è in linea
Visitano il forum: Nessuno e 4 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)


