come sostituire delay?

non ho ancora capito come trasformare i delay in millis di questo codice:

#define LED 10 // definisco pin
int i = 0;   

void setup() {
  pinMode(LED, OUTPUT); // dico che il pin è output
}

void loop(){
  delay(1000);   ////imposto tempo spento
  

  for (i = 0; i < 255; i++) { // imposto il loop fade in
    analogWrite(LED, i);     
    delay(10); /////imposto tempo fade in e out
             
  }

  for (i = 255; i > 0; i--) { // imposto il loop fade out

    analogWrite(LED, i); // 
    delay(1000);           ///imposto tempo acceso
    pinMode(LED,LOW);//spengo completamente il led
  }
}

vorrei controllare l'accensione con fade in e out dandogli un tempo di 30 minuti, fase acceso ics ore, fase spento ics ore.
come da esempio con i delay funzionerebbe ma quando implemento altro codice i delay bloccano il loop, la soluzione sono
le millis ma non riesco ad applicarle nel mio codice.
Puo millis contare 20 ore? Da ciò che ho capito va in overflow dopo 49,7 giorni ....

Guido

Ciao Guido,

dai un'occhiata negli esempi di arduino, lo trovi come "BlinkWithoutDelay.pde" nella sezione digital.
Comunque non ti farà mai un fade in/out ma un semplice on/off con quel codice.

Se poi qualcosa non ti è chiaro chiedi :smiley:

Ti passo questo link:
http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/

Ho scritto una guida che spiega come usare millis per eseguire delle azioni con intervallo senza fermare il flusso del programma.

Leo seguendo i tuoi link sono finito a voler testare la libreria looper ed ho codiciato.. :grin: ciò che segue

#include "looper.h"  //includo libreria looper

looper myScheduler; //creo nuova istanza looper

//variabili per controllare i led
byte led1Status = 0;
byte led2Status = 0;
const byte LED1 = 9;
const byte LED2 = 10;
int i = 0;

//program setup
void setup() {
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    
    //add the tasks at the scheduler
}

//main loop
void loop() {
           myScheduler.myDelay(1000);                 // imposto tempo spento
  for (i = 0; i < 255; i++) { // loop da 0 a 255 per fade in
    analogWrite(LED1, i);     
       myScheduler.myDelay(10);                    //////imposto tempo fade in
         myScheduler.scheduler();                 
                  myScheduler.myDelay(20);                 // imposto tempo acceso   
  }
for (i = 255; i > 0; i--) { // loop da 255 a 1 per fade out

    analogWrite(LED1, i);
    myScheduler.myDelay(10);                ///////imposto tempo fade out
     myScheduler.scheduler();
    pinMode(LED1,LOW);//spengo completamente il led
  }
 }

...come vedi però mi sono fermato al led1 perchè aggiungendo il ciclo for per il led2 non mi compila, dal void loop ho copiaincollato il codice cambiando semplicemente da led1 a led2... stò omettendo qualche punteggiatura o proprio sbaglio procedimento?
In ogni modo ho tradotto il codice che volevo e anche se solo con un led fa quello che mi serve. Appena ho un po di tempo vorrei inserirlo nello sketch principale per vedere se funziona senza interrompere il codice principale.
Ci sto spendendo del tempo ma ci comincio a prender gusto :stuck_out_tongue:
grazie!
Guido

No, hai sbagliato l'uso :wink:
Devi creare delle funzioni che diventano i tuoi "job", o lavori, da chiamare dallo scheduler in modo automatico. Allegato alla lib c'è un esempio che si chiama "2 tasks" che mostra appunto il lampeggio di 2 led con 2 frequenze differenti.

myDelay è una feature del looper, è un delay che ferma l'esecuzione del flusso principale del codice permettendo però di eseguire i job che sono contenuti nello scheduler.