Quelli che... cercano di capire la funzione millis

Sto cercando di capire come usare la funzione millis() al posto di delay(). Ho fatto degli esempi e non capisco perchè uno di essi mi da dei risultati anomali. Nel prmo esempio ogni secondo la variabile i si incrementa di 1 (Funziona). Nel secondo esempio invece con un ciclo for assegno alla variabile i un valore compreso tra 0 e 19, ma non riesco a capire perchè usando la funzione millis ottengo un valore casuale, non va in ordine crescente. L'inizializzazione e il void setup sono comuni a tutti gli esempi.

int i;
long MillisecIniziali;
int ritardo=1000;

void setup()
{
Serial.begin(9600);
}

// ESEMPIO 1

void loop() // usando delay
{
i=i++;
Serial.println(i);
delay(1000);
}

void loop() // usando millis
{
if(millis()-MillisecIniziali==ritardo)
{
MillisecIniziali=millis();
i=i++;
Serial.println(i);
}
}

// ESEMPIO 2

void loop() // usando delay
{
for(i=0;i<20;i++)
{
Serial.println(i);
delay(1000);
}
}

restituisce 0 1 2 3 4 5 6 ..... 19

void loop() // usando millis
{
for(i=0;i<20;i++)
{
if(millis()-MillisecIniziali==ritardo)
{
MillisecIniziali=millis();
Serial.println(i);
}
}
}

restituisce 5 12 17 2 8 9......

perche il ciclo, cicla e incrementa prima che il millis arrivi a 1000
la funzione if nn ferma il ciclo come nel caso di delay (= pausa)

void loop()  // usando millis
{
  if (i<=20)
    {
      if(millis()-MillisecIniziali==ritardo)
        {
          MillisecIniziali=millis();
          Serial.println(i);
           i=i++ ;
      }
    }

questo funziona.. da quello che ho capito millis è un contatore e nn una pausa....
cioè ... nn ferma il programma ma si antoincrementa...

nel forum avevo vsto altri che ci stavano litigando ... :slight_smile:
per cui bisogna cambiare la logica .. del programma.....
ritorno poi sul post del sensore di umidità.

Esatto, è necessario proprio modificare la logica del programma.
I cicli for, ad esempio, io li faccio sparire quando uso il millis().
Sto preparando un articolo dettagliato al riguardo che a breve dovrei postare ma il concetto è che NON bisogna fermare il ciclo loop con delay, for, while e varie.
Ogni sottociclo dovrebbe essere gestito da una ulteriore variabile di confronto con millis.
Si raggiunge un multitasking pressocchè reale...

Ciao nathanvi, per l'appunto stavo proprio cercando di eliminare un delay presente in un ciclo for che mi incasinava tutto, cerca il post sul sensore di umidità che ho messo, lì spiego il problema.