ciclo for con millis

Buona giornata

lo so che voi avete più volte trattato l’argomento millis,
e seguendo i vari consigli ed i link proposti sono riuscito ad implementare i millis in vari programmi,

ora pero vorrei implementare la millis su un ciclo for,
il ciclo for e solo semplicemente un effetto fade su di un led,

quello che vorrei fare “e non ci sono riuscito, e da due giorni che ci provo” e di avere un tempo di attesa prima di entrare sul for,
posto uno dei programmi che ho provato, uno dei tante che non va,

define ledR 6

unsigned long Temp1;

void setup(){
	Serial.begin(9600);
	
	pinMode(ledR, OUTPUT);
	digitalWrite(ledR, 0);
}

void loop(){
	byte Temp_0;
	
	if(Temp_0 == 0){ 
		Temp_0 = 1;
	}
	if(Temp_0 == 1)
		if (millis() - Temp1 > 4000) { 
		    analogWrite(ledR, 0);
		    Temp1 = millis();
		     Serial.println("ok2");

		     for(i = 0; i < 255; i++){
		     analogWrite(ledR, i);
		     delay(40);
        }
			}
}

vi chiedo cortesemente dove che sbaglio,

Non ho capito cosa dovrebbe fare il programma, ovvero a cosa servirebbe quel tempo di attesa. Per favore descrivi il risultato completo che vorresti ottenere, che scriveremo il programma più appropriato

Come dice @silente, spiega.

Per quel codice che hai postato, ti dico che fai confusone con le variabili locali/globali. E la logica di quel Temp_0 è errata (c'entra poco con il discorso del for, però spero ti possa essere utile). Se scrivi (ho solo reso il codice più compatto da leggere):

void loop()
{ byte Temp_0;
  if( Temp_0 == 0 )  { Temp_0 = 1; }
  if( Temp_0 == 1 )
  {  fai qualcosa...
  }
}
  1. Temp_0 è variabile locale, non può quindi ricordarsi il "precedente" valore tra un giro di loop() e l'altro quindi deve essere globale.
  2. se Temp_0 è 0 e lo imponi subito a 1 non puoi chiederti subito dopo se è 1.. lo è di sicuro!!

Per avere un qualcosa che al primo giro di loop() non fa nulla (solo mettere Temp_0 a 1)

byte Temp_0;  // globale
void loop()
{ if( Temp_0 == 0 )  
 { Temp_0 = 1; 
 }
 else
 {  fai qualcosa...
 }
}

Ciao! Potresti usare una variabile flag, al trascorrere del tempo di millis() flag diventa 1 e attiva il ciclo for.

Esempio

byte flag=0;
unsigned long tempo=0;

void setup(){

     tempo=millis();

}
void loop(){

    if(millis()-tempo>=4000){

         flag=1;
         tempo=millis();

    }

    for(int i=0; i<255 && flag; i++){// Se flag vale 1 esegue il for


   }

   // Con qualche sistema flag viene riportata a zero e il ciclo non viene più eseguito

   flag=0;
}

milefori: ora pero vorrei implementare la millis su un ciclo for,

La prima domanda è: «perché?»

Se è per non bloccare il loop allora non va bene neanche il for che lo blocca per circa 10 secondi. Se non è per non bloccare il for, allora basta un delay.

La seconda è: «dopo la fine del for cosa dovrebbe succedere?»

Deve partire un'altra pausa di 4 secondi? Deve essere fatto dell'altro? Non deve succedere più niente? In sostanza non è chiara (o è incompleta) la sequenza delle "fasi" di funzionamento.

Prima cosa un grazie a tutti di avermi risposto,

@Silente essendo un principiante sto imparando come usare la funzione millis, il programma in se non deva far altro che inserire una pausa "di un certo tempo" dopo il for, poi ricominciare,

@nid69ita hai perfettamente ragione, mi sono accorto ora di quante castro-nate o scritto,

@torn24 grazie del suggerimento ora ci provo

@Claudio_FF come dicevo non c'è una ragione e solo per imparare ad usare la funzione in vari casi, lo so che il for e bloccante all'interno del loop, ma in questo contesto non mi interessa,

l'uso proprio di millis dovrebbe essere questo: Parto da un codice che si ripete periodicamente, di qualunque natura sia il contenitore che lo ripete in modo ciclico... direttamente il loop principale, un mio for, ecc. (demandiamo alla sensatezza progettuale il fatto che questo ciclo a sua volta crei effetti collaterali o meno.)

Ad ogni iterazione di questo ciclo, cioè ad ogni esecuzione del codice di partenza, testo se effettuare una certa operazione mediante l'uso di millis. Solo quando è passato il tempo previsto da un certo istante di riferimento che mi ero preventivamente annotato in qualche modo, eseguo effettivamente l'operazione oggetto di tutta questa discussione.

oki?

L'ideale è avere tutto nel loop principale, in modo da non aggiungere ulteriori fattori di blocco. Però questa è solo una linea guida di massima, non un dogma assoluto. L'appropriatezza di una soluzione dipende da molti fattori e si valuta caso per caso.

Ciao eccomi qua con i compiti fatti,

grazie ai vostri suggerimenti ho testato il seguente codice “che mi crea un ritardo fra un esecuzione e l’altra del for” e funziona, ovviamente son ben accettate suggerimenti, critiche e quanto-altro,

//le variabili sono tutte globali

if(digitalRead(buton1) == 0){
 flagR = 1;
}
 if(millis() - Temp1 >= 4000 && flagR == 1){

 for(i = 0; i < 255 && flagR; i++){
 analogWrite(ledR, i);
 delay(30);
 }
 Temp1 = millis();
 analogWrite(ledR, 0);
// flagR = 0; //se levo il commento ovviamente non ripete il ciclo
}

@maubarzi
scusa la mia ignoranza,

Ad ogni iterazione di questo ciclo, cioè ad ogni esecuzione del codice di partenza, testo se effettuare una certa operazione mediante l’uso di millis.

per cortesia, mi daresti una spiegazione un po più semplice,
od un esempio

Una cosa del genere, il loop prova ad ogni giro ad eseguire la funzione X ma lo fa solo a scadenza ...

...
#define ATTESA_ESECUZIONE_X 1000 // 1s
unsigned long millisUltimaEsecizioneX = 0;
...
void loop() {
  ...
  gestioneOperazioneX();
  ...
}

void gestioneOperazioneX() {
  if (millis() - millisUltimaEsecizioneX > ATTESA_ESECUZIONE_X) {
    // Codice della procedura X
    ...
    millisUltimaEsecuzioneX = millis();
  }
}

Perfetto mille grazie

un altra cosa imparata