Funzione millis non mi ritrovo

Salve sono alle prime armi con la programmazione.
Ho compilato questo sketch con l’intento di fare qualche prova per poter scattare delle foto ad una goccia d’ acqua .
ho un problema con la funzione millis, non mi funziona correttamente nel punto dove ho segnato come “ errore in questo punto ,mentre la seconda funzione millis mi funziona correttamente.
L’intento è quello di i leggere il passaggio della goccia d’acqua ed impostare un ritardo con il potenziometro per permette di fotografarla al momento desiderato.
il led simula lo scatto, se inserisco dilay funziona correttamente mentre con la funzione millis non funziona.
qualche consiglio in merito!
grazie

Carlo

//Fotografia 
//Obiettivo: fotografare una goccia o un fulmine.
const int led = 7;// LED Blu scatto
const int led2 = 8;// LEd Giallo Normalmente Acceso
const int Potenziometro = A1 ;//Potenziometro per ritardo scatto dal passaggio
int Fotoresistenza = A0 ;//Sensore fotoresistenza

int FOTOR = 0 ;// Variabile Fotoresistenza
int Ritardo = 0 ;// Variabile Ritardo con potenziometro
int ValTemp= 0 ;

     unsigned long RitardoTemp ;// Associo una varibile temp ad ogni evento ( Ritardo)
     unsigned long time ;//Variabile di riferimento per lo scorrere del tempo
     unsigned long letturadati;
void setup () {
  pinMode (led,OUTPUT);// LED Blu scatto
  pinMode (led2,OUTPUT);// LEd Giallo Normalmente Acceso
  pinMode (Fotoresistenza, INPUT);//Sensore fotoresistenza
  pinMode (Potenziometro,INPUT);// Potenziometro per impostare il ritardo di scatto
  
     time = millis();// Associo alla variabile time il contatore interno
     RitardoTemp = millis();
     letturadati = millis();
     
  Serial.begin (9600);// Inizializo la seriale
 }
void loop ()   {
  time = millis ();
  Ritardo = analogRead (Potenziometro);// leggo il valore del potenziometro
  Ritardo = map (Ritardo,0,1023,0,500);//converto il valore del potenziometro da 0 a 500 ms
  FOTOR = analogRead ( Fotoresistenza );//Leggo il valore della Fotoresistenza e lo assegno alla variabile FOTOR
 
 if ( time > RitardoTemp + Ritardo){//  errore in questom punto
 RitardoTemp = millis ();
 } 
 if (FOTOR < 920) {// Il led si accende coquando sodisfatta la condizione
 digitalWrite (led,HIGH); //LED Blu scatto con il ritado inmpstato dal potenziometro
 } 
  
  else{
  digitalWrite (led , LOW);
  }
  if (FOTOR < 933){
    digitalWrite (led2 ,LOW );
  }
  else{

    digitalWrite (led2 ,HIGH );    
}
     
if (time > letturadati + Ritardo ){
  letturadati = millis();
  Serial.print ( "Sensore = ");
  Serial.println (FOTOR );
  Serial.print ( "Ritardo = ");
  Serial.println (Ritardo );
  }
}

é difficile capirti se non descrivi meglio cosa é il problema.

Ci sono alcuni problemi concettuali.

  1. una fotoresistenza é troppo lenta e troppo poco sensibile per individuare bene la goccia.
    Userei un piccolo laser tipo puntatore e un fototransistore.
  2. devi far partire il conto del ritardo dal momento che rilevi la goccia. percui carichi la variabile RitardoTemp solo in quel momento e memorizzi l'azionamento della fotocellula in una variabile di stato.
rilevazione goccia: 
{ goccia =1;
 RitardoTemp = millis();}
if (goccia == 1 && time > RitardoTemp + Ritardo)
{ aziono scatto;
goccia =0;
}

Ciao Uwe

Ok innanzitutto grazie
per la risposta.
La fotoresistenza è provvisoria poi userò un piccolo puntatore laser con un fototransistore come dici tu.
Ora vedo di fare la modifica suggerita.
grazie
Carlo

Ti lascio anche un link di un mio articolo in cui spiego come programmare i compiti usando millis.

@Leo72,

OTTIMO il tuo tutorial sull'uso di millis() !! veramente ben spiegato! Mi ha dato spunto per un progetto dove devo fare diverse cose ad intervalli prestabiliti, uno scheduler insomma. Ho visto anche l'ottimo Looper, propio quello che stavo cercando!! credo sia ottimo il poter aggiungere task, stopparle o metterle in pausa ecc... molto utile secondo me.

ok
grazie per il Link molto utile.
non ho ancora risolto, appena ho tempo ci provo.
grazie
Carlo

Ho modificato lo sketch come suggerito da Uwe ma non mi funziona , non ho errori di compilazione.
Mi spiego meglio quando copro la fotoresistenza il led si accende lampeggiando e con il potenziometro vario la velocità di lampeggio.
Se al posto del if al punto 3 Inserisco un delay dopo il punto 4 attengo che il led si accende con il ritardo impostato.
Ed e quello che volevo.
Con il potenziometro voglio poter impostare il ritardo di accensione del led quando copro la fotoresistenza.
La funzione millis credo sia corretta perché sul serial monitor riesco a variare la velocità di lettura dei dati.

//Fotografia 
//Obiettivo: fotografare una goccia o un fulmine.
const int led = 7;// LED Blu scatto
const int led2 = 8;// LEd Giallo Normalmente Acceso
const int Potenziometro = A1 ;//Potenziometro per ritardo scatto dal passaggio
int Fotoresistenza = A0 ;//Sensore fotoresistenza

int FOTOR = 0 ;// Variabile Fotoresistenza
int Ritardo = 0 ;// Variabile Ritardo con potenziometro
int Goccia = 0; // Variabile dove rilevo il passaggio della goccia

     unsigned long RitardoTemp ;// Associo una varibile temp ad ogni evento ( Ritardo)
     unsigned long time ;//Variabile di riferimento per lo scorrere del tempo
     unsigned long letturadati;
void setup () {
  pinMode (led,OUTPUT);// LED Blu scatto
  pinMode (led2,OUTPUT);// LEd Giallo Controllo  Normalmente Acceso
  pinMode (Fotoresistenza, INPUT);//Sensore fotoresistenza
  pinMode (Potenziometro,INPUT);// Potenziometro per impostare il ritardo di scatto
  
     time = millis();// Associo alla variabile time il contatore interno
     RitardoTemp = millis();
     letturadati = millis();
     
  Serial.begin (9600);// Inizializo la seriale
 }
void loop ()   {
  time = millis ();
  Ritardo = analogRead (Potenziometro);// leggo il valore del potenziometro
  Ritardo = map (Ritardo,0,1023,0,500);//converto il valore del potenziometro da 0 a 500 ms
  FOTOR = analogRead ( Fotoresistenza );//Leggo il valore della Fotoresistenza e lo assegno alla variabile FOTOR
  
  
 if (FOTOR < 920) {// 1- Il led si accende coquando sodisfatta la condizione
 Goccia = 1; // 2- quando sodisfatta la condizione assegno alla variabile Goccia il valore 1
 }

 
  if (( Goccia == 1) && ( time > RitardoTemp + Ritardo)){// 3 - errore in questom punto
 RitardoTemp = millis ();
  digitalWrite ( led, HIGH);//4 -Accendo il led che simula lo scatto
 Goccia = 0 ; // 5 - Resetto al valore 0
  }
  else{
  digitalWrite (led , LOW);
  }
  if (Goccia == 1){
    digitalWrite (led2 ,LOW ); 
  }
  else{

    digitalWrite (led2 ,HIGH );    
}
     
if (time > letturadati + Ritardo ){
  letturadati = millis();
  Serial.print ( "Sensore = ");
  Serial.println (FOTOR );
  Serial.print ( "Ritardo = ");
  Serial.println (Ritardo );
  Serial.print ( "Goccia = ");
  Serial.println (Goccia );
  }
}

grazie

Carlo

Ho modificato ulteriormente sketch ,
Con la funzione delay sul punto 1 funziona correttamente,il led si accende con il ritardo impostato.
Se al punto 1 inserisco la funzione millis lo sketch non mi funziona più e il led comincia a lampeggiare.
qualche consiglio !

//Fotografia 
//Obiettivo: fotografare una goccia o un fulmine. V 0,5
const int led = 7;// LED Blu scatto
const int led2 = 8;// LEd Giallo Normalmente Acceso

int Fotoresistenza = A0 ;//Sensore fotoresistenza
int Pulsante = 5 ;// pulsante per incrementare il tempo di ritardo scatto
int Pulsante2 = 4 ;

int Puls = 0;// variabiledel pulsante
int Puls2 = 0;// variabiledel pulsante
int FOTOR = 0 ;// Variabile Fotoresistenza
int Ritardo = 0 ;// Variabile Ritardo con potenziometro
int Goccia = 0; // Variabile dove rilevo il passaggio della goccia

     unsigned long RitardoTemp ;// Associo una varibile temp ad ogni evento ( Ritardo)
     unsigned long time ;//Variabile di riferimento per lo scorrere del tempo
     unsigned long letturadati;
     unsigned long startTime = 0;
     unsigned long startTime2 = 0;
     unsigned long OldTime;
void setup () {
  pinMode (led,OUTPUT);// LED Blu scatto
  pinMode (led2,OUTPUT);// LEd Giallo Normalmente Acceso
  pinMode (Fotoresistenza, INPUT);//Sensore fotoresistenza
  pinMode (Pulsante, INPUT); // pulsante per incrementare il tempo di ritardo scatto 
  pinMode (Pulsante2, INPUT); // pulsante per decremento il tempo di ritardo scatto
     time = millis();// Associo alla variabile time il contatore interno
     OldTime = millis(); // tempo iniziale memorizzato per confronto con time
     letturadati = millis();// tempo iniziale memorizzato per confronto con time
     startTime = millis();
     startTime2 = millis();
     
  Serial.begin (9600);// Inizializo la seriale
 }
 
void loop ()   {
  time = millis ();   // isruzioni oper incrementere il ritardo discatto con un pulsante
  Puls = digitalRead (Pulsante);
  if(Puls == HIGH  && ( millis() - startTime )> 30) {
  Ritardo +=5 ; //ad ogni pressione del pulsante incremento di 5 Millisecondi il ritardo di scatto
  startTime = millis();
 delay (10);
  }
 time = millis ();  // isruzioni oper diminuire il ritardo discatto con un pulsante 
  Puls2 = digitalRead (Pulsante2);
  if(Puls2 == HIGH  && ( millis() - startTime2 )> 30) {
  Ritardo -=5 ; //ad ogni pressione del pulsante diminuisco di 5 Millisecondi il ritardo di scatto
  startTime2 = millis();
 delay (10);   
  }
  FOTOR = analogRead ( Fotoresistenza );//Leggo il valore della Fotoresistenza e lo assegno alla variabile FOTOR
 if (FOTOR < 920){ // 1- Il led si accende coquando sodisfatta la condizione
 Goccia = 1; // 2- quando sodisfatta la condizione assegno alla variabile Goccia il valore 1
 }
  
 delay (Ritardo); // 1 Vorrei sostituire la funzione delay con la funzione millis per impostare il ritardo
 if ( Goccia == 1){
 OldTime = millis ();
 digitalWrite ( led, HIGH);//4 -Accendo il led che simula lo scatto
 Goccia = 0 ; // 5 - Resetto al valore 0
   }
 else{
  digitalWrite (led , LOW);
  }
 if (Goccia == 1){
  digitalWrite (led2 ,LOW );
 } 
  else {
  digitalWrite (led2 ,HIGH ); 
  }  
if (time > letturadati + Ritardo ){
  letturadati = millis();
  Serial.print ( "Sensore = ");
  Serial.println (FOTOR );
  Serial.print ( "Ritardo = ");
  Serial.println (Ritardo );
  }
}

grazie

Carlo

Salve
ormai sono giorni che sbatto la testa e non capisco dove sbaglio con la funzione millis.
Ora lo sketch con il delay funziona correttamente.
Nella sezione Ritardo di Scatto vorrei lavorare con i millis ma non mi funziona è come se non ci fosse.

//Fotografia TRIGGER 
//Obiettivo: fotografare una goccia o un fulmine. 
#include <LiquidCrystal.h> // includere la libreria:

int Laser = 6; // Pin comando Laser
int LedLaser = A1; // Pin comando Laser
int Fotoresistenza = 10 ;//Sensore fotoresistenza
int Scatto = 8 ;// Pin di scatto
int Flash = 13; //Pin per Flash
int LedScatto = A2 ;// Led controllo Scatto
int Pulsante = 7 ;// pulsante per incrementare il tempo di ritardo scatto
int Pulsante2 = 9 ;// pulsante per diminuire il tempo di ritardo scatto
int Puls = 0;// variabi pulsante incremanta
int Puls2 = 0;// variabi pulsante decrementa
int Ritardo = 0 ;// Variabile Ritardo con Pulsanti
int TempPuls =500;// Tempo che rimane premuto il pulsante di scatto

     unsigned long time ;//Variabile di riferimento per lo scorrere del tempo
     unsigned long OldTime;//Variabile di riferimento per confronto con tempo
     unsigned long letturadati;//Variabile di riferimento per lo scorrere del tempo ritardo scrittura dati
     unsigned long startTime = 0;//Variabile di riferimento per lo scorrere del tempo Pulsante Incremento
     unsigned long startTime2 = 0;//Variabile di riferimento per lo scorrere del tempo Pulsante Decremento  
     unsigned long  Ritardo1;//Variabile di riferimento per lo scorrere del tempo Ritatdo di scatto
     unsigned long TempPuls1 ;//Variabile di riferimento per lo scorrere del tempo Durata scatto
     
     
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // inizializza la libreria con i Numeri dei pin dell'interfaccia
    
 

void setup() {
  pinMode (Laser, OUTPUT); //assegno il ledPin in OUTPUT
  pinMode (Scatto, OUTPUT); //assegno il ledPin in OUTPUT
  pinMode (Fotoresistenza, INPUT);//Sensore fotoresistenza
  pinMode (Flash, OUTPUT);//assegno il pin in output per il flash
  pinMode (Pulsante, INPUT); // pulsante per incrementare il tempo di ritardo scatto 
  pinMode (Pulsante2, INPUT); // pulsante per decremento il tempo di ritardo scatto
  digitalWrite(Laser,LOW);
  lcd.begin (16, 2);//impostiamo il numero di colonne ed il numero di righe di lcd 
  lcd.setCursor(0,0);
  lcd.print ("Foto Trigger");// Visualizzo il messaggio sul display
  lcd.setCursor(0,1);
  lcd.print ("V. 1,1");
     time = millis();// Associo alla variabile time il contatore interno
     OldTime = millis(); // tempo iniziale memorizzato per confronto con time
     letturadati = millis();// tempo iniziale memorizzato per confronto con time
     startTime = millis();
     startTime2 = millis(); 
     Ritardo1 = millis();
     TempPuls1 = millis();
     

 
 
  Serial.begin (9600);// Inizializo la seriale

delay (2000);
}

void loop() { 
time = millis (); 



//sezione di scatto

  
digitalWrite ( Laser, HIGH);// Accendo il Laser
analogWrite(LedLaser,254);//Led Controllo Laser
time = millis ();

while (digitalRead(Fotoresistenza)==LOW){
//Pulsanti
  Puls = digitalRead (Pulsante);
  if(Puls == HIGH  && ( millis() - startTime )> 30) {
  Ritardo +=5 ; //ad ogni pressione del pulsante incremento di 5 Millisecondi il ritardo di scatto
  startTime = millis();
 delay (10);
  }
   Puls2 = digitalRead (Pulsante2);
  if(Puls2 == HIGH  && ( millis() - startTime2 )> 30) {
  Ritardo -=5 ; //ad ogni pressione del pulsante diminuisco di 5 Millisecondi il ritardo di scatto
  startTime2 = millis();
 delay (10);   
  }
  
// LCD
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Ritardo scatto:");
  lcd.setCursor(0,1);
  lcd.print(Ritardo);
  //Serial monitor
  Serial.print ( "Ritardo = ");
  Serial.println (Ritardo );
  Serial.print ( "TempPuls= ");
  Serial.println (TempPuls );
}
//sezione di scatto
digitalWrite(Laser,LOW);// Spengo il Laser
analogWrite(LedLaser,0);//Spengo Led Controllo Laser

//Ritatdo di scatto

if ( time > Ritardo1 + Ritardo){
digitalWrite (Scatto,LOW);//Scatto La foto inizio
digitalWrite (Flash ,LOW);// Scatta il flash inizio
digitalWrite(LedScatto,254);//Led Controllo Scatto inizio
Ritardo1 =  millis();
}

delay(TempPuls);
//Durata dello scatto

digitalWrite (Flash ,HIGH);// Scatta il flash fine
digitalWrite (Scatto,HIGH);//Scatto La foto fine
analogWrite (LedScatto,0);//Led Controllo Scatto Fine
}

Ringrazio anticipatamente
Carlo

Stai usando analogwrite su un pin non PWM, tra l'altro per usare valori come 0 e 254, tanto vale usare digitalwrite.
Ricorda di inserire anche il pinmode per il LedLaser.