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

[11] Re: Temporizzare azioni con millis

Messaggioda Foto Utentesolideo » 11 dic 2016, 13:50

Codice: Seleziona tutto
    void loop() {

      time = millis();   //Metto nel loop la variabile del tempo in millis attuale
      if ( time > time_acceso + 2000 ){   //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
         time_acceso= millis();
         time_spento= millis();     
      }
         if ( time > time_spento + 100 ){   //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);
            time_spento = millis();
           
       }
    }

Cosi si accende dopo 2sec rimana acceso per 100ms poi aspetta altri 2sec quindi si riaccende.
Ora penso che te non vuoi che si ripeti il tutto in maniera cosi ciclica con tempi precisi, quindi sarei propenso per una generazione casuale sul tempo che passa da un'accensione ad un'altra.
Avatar utente
Foto Utentesolideo
95 1 6
New entry
New entry
 
Messaggi: 80
Iscritto il: 11 lug 2014, 6:20

0
voti

[12] Re: Temporizzare azioni con millis

Messaggioda Foto Utentedadothebest » 11 dic 2016, 14:46

Visto che questo led che deve lampeggiare lo devo aggiungere in uno sketch giù esistente, deve lavorare tutto sincronizzato quindi accendersi quando voglio io non in maniera casuale.
Il mio problema è che non riesco ad implementare lo sketch che hai scritto nello sketch che già possiedo (scritto il mio post prima) poiché viene eseguito solo il primo "if" e non il secondo, non so se sono stato chiaro.
Avatar utente
Foto Utentedadothebest
24 2 7
Frequentatore
Frequentatore
 
Messaggi: 229
Iscritto il: 25 nov 2013, 17:13
Località: Ascoli Piceno

0
voti

[13] Re: Temporizzare azioni con millis

Messaggioda Foto Utentebalduzz » 11 dic 2016, 15:21

Puoi postare lo sketch completo integrando la parte scritta da solideo e dirci quando vuoi che intervengano i lampi?
Avatar utente
Foto Utentebalduzz
1.516 1 4 7
Expert
Expert
 
Messaggi: 628
Iscritto il: 6 ott 2015, 9:59
Località: Brescia

0
voti

[14] Re: Temporizzare azioni con millis

Messaggioda Foto Utentedadothebest » 11 dic 2016, 15:27

Lo avevo scritto nel mio post precedente, lo riporto anche qui:
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 );
         if ( time > time_iniziale + 6000 ){ digitalWrite ( lampi, HIGH);   }   
         if ( time > time_iniziale + 6100 ){ digitalWrite ( lampi, LOW);   }   
     
       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; }
}

i lampi devono avvenire in questo periodo:
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);   }   //dopo 6s che è iniziato il giorno i led lampi si accendono
         if ( time > time_iniziale + 6100 ){ digitalWrite ( lampi, LOW);   }    //dopo 6.1s che è iniziato il giorno i led lampi si spengono
     
       delay( timeStepOld );
     }
     timeStepOld = (timeStepOld*52); // elapsed time
     timeCurr = (timeCurr - timeStepOld);
     delay( timeCurr );
  }

Con questo codice i led lampi si accendono soltanto dopo 6s ma non si spengono.
Avatar utente
Foto Utentedadothebest
24 2 7
Frequentatore
Frequentatore
 
Messaggi: 229
Iscritto il: 25 nov 2013, 17:13
Località: Ascoli Piceno

0
voti

[15] Re: Temporizzare azioni con millis

Messaggioda Foto Utentesolideo » 11 dic 2016, 15:38

poiché viene eseguito solo il primo "if" e non il secondo

Quello che ho postato al post n°11 l'ho modificato perché il led si accenda e poi si spenga.
Ho aggiunto la variabele time_spento perché si possa accendere e spengere con i ritardi voluti.
Ma nel tuo ultimo post non li hai aggiunti.
Avatar utente
Foto Utentesolideo
95 1 6
New entry
New entry
 
Messaggi: 80
Iscritto il: 11 lug 2014, 6:20

0
voti

[16] Re: Temporizzare azioni con millis

Messaggioda Foto Utentebalduzz » 11 dic 2016, 16:04

solideo ha scritto:Ho aggiunto la variabele time_spento perché si possa accendere e spengere con i ritardi voluti.Ma nel tuo ultimo post non li hai aggiunti.

Foto Utentesolideo, nel tuo sketch che riporto qui sotto credo che nel primo if bisogni sostituire time_acceso con time_iniziale (come dici nella descrizione)

Codice: Seleziona tutto
    void loop() {

      time = millis();   //Metto nel loop la variabile del tempo in millis attuale
      if ( time > time_acceso + 2000 ){   //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
         time_acceso= millis();
         time_spento= millis();     
      }
         if ( time > time_spento + 100 ){   //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);
            time_spento = millis();
           
       }
    }

Secondo me non si spengono i led perché al primo passaggio dopo 6 secondi (nel tuo sketch qui sopra 2 secondi) i led si accendono ma non si spengono perché non passano 100 ms prima del secondo if e quindi il secondo if viene saltato e nei cicli successivi si ripete la stessa situazione. (non so se mi sono spiegato ?% )

Per essere sicuro di spegnere i led io farei semplicemente
Codice: Seleziona tutto
if ( time > time_iniziale + 6000 ){ digitalWrite ( lampi, HIGH);
         delay(100);
         digitalWrite ( lampi, LOW);}


Foto Utentedadothebest quello che non ho capito è:
dopo 6 secondi vuoi un lampo e poi quanti lampi vuoi durante la fase "GIORNO"?
Avatar utente
Foto Utentebalduzz
1.516 1 4 7
Expert
Expert
 
Messaggi: 628
Iscritto il: 6 ott 2015, 9:59
Località: Brescia

0
voti

[17] Re: Temporizzare azioni con millis

Messaggioda Foto Utentesolideo » 11 dic 2016, 16:13

Foto Utentebalduzz
No cosi funziona come ho scritto nel post.
Attende 2 sec si accende sta acceso per 100ms poi si spenge, quindi attende 2sec e cosi via :ok:
Avatar utente
Foto Utentesolideo
95 1 6
New entry
New entry
 
Messaggi: 80
Iscritto il: 11 lug 2014, 6:20

0
voti

[18] Re: Temporizzare azioni con millis

Messaggioda Foto Utentedadothebest » 11 dic 2016, 16:44

Ho provato a fare lo sketch così,ma mi restituisce errore "time_acceso" e "time_spento" ma non riesco a mettere 2 azioni in coda di seguito:
Codice: Seleziona tutto
int led1 = 11;
int led2 = 12;
//Inizzializzo le variabili per conteggiare il tempo
unsigned long time_iniziale;     
unsigned long time_acceso;
unsigned long time_spento;
unsigned long time;

// the setup routine runs once when you press reset:
void setup() {
  pinMode ( led1, OUTPUT );
  pinMode ( led2, OUTPUT );
  time_iniziale = millis();
  time_acceso = millis();
  time_spento = millis();//Riempo la variabile con il valore di millis attuali
}

    void loop() {

      time = millis();
  //Metto nel loop la variabile del tempo in millis attuale
      if ( time > time_acceso + 2000 ){   //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
         time_acceso= millis();
         time_spento= millis();     
      }
         if ( time > time_spento + 100 ){   //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);
            time_spento = millis();

Inoltre ho anche provato ad inserire questo sketch nel mio sketch ma funziona solo il primo lampeggio e non gli altri:
Codice: Seleziona tutto

// giorno2
  if ( curr == 6 ) {

     Serial.print("Fase: "); Serial.println("GIORNO2");
     
     time = millis();
     
        { if ( time > time_iniziale + 2000 ){ digitalWrite ( sole, HIGH);
         delay(100);
         digitalWrite ( sole, LOW);
         } }
         
                  { if ( time > time_iniziale + 3000 ){ digitalWrite ( sole, HIGH);
         delay(100);
         digitalWrite ( sole, LOW);
          } }
                 { if ( time > time_iniziale + 4000 ){ digitalWrite ( sole, HIGH);
         delay(100);
         digitalWrite ( sole, LOW);
         } }
               {   if ( time > time_iniziale + 5000 ){ digitalWrite ( sole, HIGH);
         delay(100);
         digitalWrite ( sole, LOW);
        }}


         
         for ( int i=0; i<52; i++) {
       analogWrite(alba,   fade[i]);
       if ( fade[i] < 125) analogWrite(lampi,    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 );
}

I lampi dovrebbero essere 8 di egual durata e avvenire in tempi diversi l'uno dall'altro.
Ultima modifica di Foto Utentedadothebest il 11 dic 2016, 16:58, modificato 1 volta in totale.
Avatar utente
Foto Utentedadothebest
24 2 7
Frequentatore
Frequentatore
 
Messaggi: 229
Iscritto il: 25 nov 2013, 17:13
Località: Ascoli Piceno

0
voti

[19] Re: Temporizzare azioni con millis

Messaggioda Foto Utentebalduzz » 11 dic 2016, 16:50

solideo ha scritto:Foto Utentebalduzz
No cosi funziona come ho scritto nel post.
Attende 2 sec si accende sta acceso per 100ms poi si spenge, quindi attende 2sec e cosi via :ok:

Foto Utentesolideo, scusami, ora ho capito dove sbagliavo nell'interpretare il tuo codice. Mi sfugge l'inizializzazione di time_acceso per il primo loop e per questo pensavo ci dovesse stare time_iniziale.
Avatar utente
Foto Utentebalduzz
1.516 1 4 7
Expert
Expert
 
Messaggi: 628
Iscritto il: 6 ott 2015, 9:59
Località: Brescia

0
voti

[20] Re: Temporizzare azioni con millis

Messaggioda Foto Utentebalduzz » 11 dic 2016, 18:00

I lampi dovrebbero essere 8 di egual durata e avvenire in tempi diversi l'uno dall'altro.


Sfruttando il codice di Foto Utentesolideo vedi se funziona così:
nell'array intervallo_lampi devi mettere i tempi di distanza tra un lampo e l'altro.

Codice: Seleziona tutto
int led1 = 11;
int led2 = 12;
//Inizzializzo le variabili per conteggiare il tempo
unsigned long time_iniziale;     
unsigned long time_acceso;
unsigned long time_spento;
unsigned long time;
long intervallo_lampi[8] = { 2000,2000,1500,1000,3000,4000,2000,1000 };
int n=0;

// the setup routine runs once when you press reset:
void setup() {
  pinMode ( led1, OUTPUT );
  pinMode ( led2, OUTPUT );
  time_iniziale = millis();
  time_acceso = millis();
  time_spento = millis();//Riempo la variabile con il valore di millis attuali
}

    void loop() {

if (n<8 {
      time = millis();
  //Metto nel loop la variabile del tempo in millis attuale
      if ( time > time_acceso + intervallo_lampi[n] ){   //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
         time_acceso= millis();
         time_spento= millis();
         n=n+1;     
      }
         if ( time > time_spento + 100 ){   //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);
            time_spento = millis();
         }
Avatar utente
Foto Utentebalduzz
1.516 1 4 7
Expert
Expert
 
Messaggi: 628
Iscritto il: 6 ott 2015, 9:59
Località: Brescia

PrecedenteProssimo

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti