Lampeggio led con funzione millis()

Ciao a tutti, sto familiarizzando con la funzione millis() per cui ho preso il classico esempio Blink per far lampeggiare il led sul pin 13 e ho sostituito a delay() la funzione millis()

il codice che ho scritto è questo:

int led = 13;
int time;
int accensione;
int spegnimento;

void setup() {
  time=millis();
  accensione=millis();
  spegnimento=millis();  
  pinMode(led, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  time=millis();
  if (time==accensione+2000){
    digitalWrite(led, HIGH);
    Serial.println (time);
   }
  if(time==spegnimento+4000){
    digitalWrite(led, LOW);
    Serial.println (time);
    accensione=millis();
    spegnimento=millis();
    }
  
}

Ho aggiunto anche la visualizzazione sulla seriale del tempo trascorso ad ogni passaggio.

Il led lampeggia correttamente ogni due secondi ma ci sono 2 problemi con la seriale:

  1. il primo valore, cioè 2000, viene visualizzato 5 volte, il secondo correttamente 1 volta, il terzo 5 volte e cosi via.

  2. arrivato a 32 secondi (32000 millisecondi) il valore diventa negativo per poi arrivare a circa zero e ricominciare questo ciclo!

Come mai?

Grazie mille

Mimmo

Hai usato male la funzione millis() e non hai usato unsigned

inoltre non usare in questi casi == ma >, perchè il millis non è sincronizzato con i clicli loop, potresti (anzi molto probabile) perdere l'if

allora leggendo lo sketch e leggendo le reference ho visto che hai fatto un errore:

time è di tipo "long" e non "int" come da te dichiarato.
Questo errore sfasa il range di funzionamento di mills in quanto il range di validità del tipo int va da -32,768 a 32,767, per via dei 16bit che puoi sfruttare con arduino uno (presumo che tu abbia quello vsto che ti genera l'overflow a 32000 millisecondi.
Per cui arrivato alla soglia va in overflow e quindi ti inizia da capo il ciclo

in conclusione devi usare "long time"
NB.
anche questo primo poi andrà in overflow ma dopo 50giorni come da reference xD

leggi qui:

Millis()
int

Per imparare ad usare bene la funzione millis() ti suggerisco queste due letture ... la PRIMA e la SECONDA.

Inoltre trovi un esempio di blink con millis() QUI

Guglielmo

Grazie mille a tutti :smiley:

ho ancora molto da imparare!!!