Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Temporizzare azioni con millis

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[1] Temporizzare azioni con millis

Messaggioda Foto Utentedadothebest » 10 dic 2016, 23:35

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!
Avatar utente
Foto Utentedadothebest
24 2 7
Frequentatore
Frequentatore
 
Messaggi: 226
Iscritto il: 25 nov 2013, 17:13
Località: Ascoli Piceno

1
voti

[2] Re: Temporizzare azioni con millis

Messaggioda Foto Utentesolideo » 11 dic 2016, 6:46

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
      }
 
}
Avatar utente
Foto Utentesolideo
95 1 6
New entry
New entry
 
Messaggi: 80
Iscritto il: 11 lug 2014, 6:20

0
voti

[3] Re: Temporizzare azioni con millis

Messaggioda Foto Utentebalduzz » 11 dic 2016, 11:30

Foto Utentedadothebest,
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 Foto Utentesolideo è quello che ti serve, altrimenti sarà da modificare leggermente per fargli fare solo in ciclo.

O_/
Avatar utente
Foto Utentebalduzz
1.516 1 4 7
Expert
Expert
 
Messaggi: 626
Iscritto il: 6 ott 2015, 9:59
Località: Brescia

0
voti

[4] Re: Temporizzare azioni con millis

Messaggioda Foto Utentesolideo » 11 dic 2016, 11:46

Cosa deve succedere dal 15-esimo secondo in poi quando i due led si sono spenti?

Ho presupposto una ciclicità dello sketch.
Avatar utente
Foto Utentesolideo
95 1 6
New entry
New entry
 
Messaggi: 80
Iscritto il: 11 lug 2014, 6:20

0
voti

[5] Re: Temporizzare azioni con millis

Messaggioda Foto Utentebalduzz » 11 dic 2016, 11:52

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.
O_/
Avatar utente
Foto Utentebalduzz
1.516 1 4 7
Expert
Expert
 
Messaggi: 626
Iscritto il: 6 ott 2015, 9:59
Località: Brescia

0
voti

[6] Re: Temporizzare azioni con millis

Messaggioda Foto Utentedadothebest » 11 dic 2016, 11:57

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.
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.
Avatar utente
Foto Utentedadothebest
24 2 7
Frequentatore
Frequentatore
 
Messaggi: 226
Iscritto il: 25 nov 2013, 17:13
Località: Ascoli Piceno

0
voti

[7] Re: Temporizzare azioni con millis

Messaggioda Foto Utentesolideo » 11 dic 2016, 12:15

Ora te la faccio io una domanda:
Cosa deve fare di preciso?
Avatar utente
Foto Utentesolideo
95 1 6
New entry
New entry
 
Messaggi: 80
Iscritto il: 11 lug 2014, 6:20

0
voti

[8] Re: Temporizzare azioni con millis

Messaggioda Foto Utentedadothebest » 11 dic 2016, 12:21

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 :-)
Avatar utente
Foto Utentedadothebest
24 2 7
Frequentatore
Frequentatore
 
Messaggi: 226
Iscritto il: 25 nov 2013, 17:13
Località: Ascoli Piceno

0
voti

[9] Re: Temporizzare azioni con millis

Messaggioda Foto Utentebalduzz » 11 dic 2016, 12:33

solideo ha scritto:Cosa deve fare di preciso?

Foto Utentedadothebest credo che "di preciso" significhi qualcosa tipo:
- 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 Foto Utentesolideo che ti sta aiutando e credo sia difficile tradurre "vorrei ricreare l'effetto dei lampi" in software
Sbaglio?
Avatar utente
Foto Utentebalduzz
1.516 1 4 7
Expert
Expert
 
Messaggi: 626
Iscritto il: 6 ott 2015, 9:59
Località: Brescia

0
voti

[10] Re: Temporizzare azioni con millis

Messaggioda Foto Utentedadothebest » 11 dic 2016, 13:14

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 :
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.
Avatar utente
Foto Utentedadothebest
24 2 7
Frequentatore
Frequentatore
 
Messaggi: 226
Iscritto il: 25 nov 2013, 17:13
Località: Ascoli Piceno

Prossimo

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite