problema con conto alla rovescia con millis()

ciao a tutti, dovrei scrivere su un lcd un conto alla rovescia usando millis() ma ho svariati problemi logici che spiego sotto il codice

unsigned long currentMillis = millis();
unsigned long conto = millis();

if(currentMillis - previousMillis > interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;

myservo.write(pos2); // sposta il serveo nella posizione finale
digitalWrite(led, HIGH);
delay(premi);
numeroFoto = numeroFoto + 1;
myservo.write(pos1); //riporta il servo nella posizione iniziale
digitalWrite(led, LOW);
conto = millis();
}
int contoAllaRovescia = pausa;
lcd.setCursor(11, 1);
if(millis() - conto >= 1000){
contoAllaRovescia--;
lcd.print(contoAllaRovescia);
conto = millis();
}

in rosso la parte non funzionante

se lo lascio cosi, non entra nellì" if(millis() - conto >= 1000)" e quindi no scerive niente, se invece scrivo if(millis() >= 1000) mi scrive la variabile conto alla rovescia - 1, se invece stampo la variabile "conto" aumenta all aumetare di millis

io vorrei, che una volta azionato il servo, si calcolino il numero di millisecondi, si salvino in una varibile, e quando il numero attuale di millisecondi - la varibile è superiore a 1000 sciva ContoAllaRovescia--

dov'è il problema?

Quel pezzo di righe di sketch é incapibile. Metti per favore lo sktech intero.

Ciao Uwe

uwefed:
Metti per favore lo sktech intero.

Usando i tag CODE e non i tag QUOTE, grazie.

grazie per la risposta, eccoti tutto il codice, volevo evitare di metterlo, perché è un po incasinato, ho elimanto la gestione dei tasti perchè il codice superava i 9500 caratteri, comunque ho allegato il codice completo

 /*LiquidCrystal Library - time lapse
 * LCD RS pin to digital pin             6
 * LCD Enable pin to digital pin         5
 * LCD D4 pin to digital pin             3
 * LCD D5 pin to digital pin             2
 * LCD D6 pin to digital pin             1
 * LCD D7 pin to digital pin             0
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 * tasto piu              A1
 * tasto meno         A2
 * tasto ok            A3
 * led            D11
 * servo             A5
 * IR             A4
 *
 */
// include the library code:
#include <LiquidCrystal.h>
#include <Servo.h>
#include <EEPROM.h>

LiquidCrystal lcd(6, 5, 3, 2, 1, 0);
Servo myservo;

int a = 0;
int pos1 = 35;       // posizione iniziale del servo
int pos2 = 19;       // posizione finale, quella in cui preme il tasto
int pausa = 0;      // tempo di laspe modificabile con i tasti + e -
int numeroFoto = 0;         // numero foto scattate
long lapse = 0;
long interval = lapse * 1000;     // tempo dopo l' ok, per il conto alla rovescia
int premi = 300;
long previousMillis = 0; 
int led = 11;


//----  variabili tasti -----
  const int buttonUpPin = A1;        //numero pin a cui è collegato il pulsante di UP
  const int buttonDownPin = A2;         //numero pin a cui è collegato il pulsnte di DOWN
  const int buttonOKPin = A3;
  
  int buttonOKState;               //stato attuale del pulsante di UP
  long OKDebounceTime;           //Variabilie di appoggio per calcolare il tempo di cambio di stato del pulsante di UP


 //------------/varibili tasti---------


void setup() {
  // set up the LCD's number of columns and rows: 

  lcd.begin(16, 2);
  myservo.attach(A5);
  pausa = EEPROM.read(a);
  lapse = EEPROM.read(a);
  pinMode(led, OUTPUT);
  pinMode (buttonUpPin, INPUT);          //impostazione buttonUpPin come ingresso
  pinMode (buttonDownPin, INPUT);       //impostazione buttonDownPin come ingresso
  pinMode (buttonOKPin, INPUT);
}

void loop() {
  digitalWrite(led, LOW); 
  lcd.setCursor(0, 0);
  lcd.print("Pausa:");
  lcd.print(pausa);
  if(pausa < 10){
    lcd.setCursor(7, 0);
    lcd.print("s  ");
  }
  if(pausa >= 10 && pausa < 100){
   lcd.setCursor(8, 0);
   lcd.print("s  ");
  }
  if(pausa >= 100 && pausa < 1000){
    lcd.setCursor(9, 0);
    lcd.print("s ");
  }  
if(pausa >= 1000){
    lcd.setCursor(10, 0);
    lcd.print("s");
}  
  lcd.setCursor(0, 1);
  lcd.print("#Foto:");
  lcd.print(numeroFoto);
  lcd.setCursor(11, 0);
  lcd.print("Tempo");
  
  long interval = lapse * 1000;

 
 //-----leggitasti
  
//----------------/leggi tasti
  unsigned long currentMillis = millis();
  unsigned long conto = millis();

  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;

    
    myservo.write(pos2);              // sposta il serveo nella posizione finale 
    digitalWrite(led, HIGH);
    delay(premi);
    numeroFoto = numeroFoto + 1; 
    myservo.write(pos1);              //riporta il servo nella posizione iniziale   
    digitalWrite(led, LOW);
    conto = millis();
  }
  int contoAllaRovescia = pausa;
  lcd.setCursor(11, 1);
  if((millis() - conto) >= 1000){
    contoAllaRovescia--;
    lcd.print(contoAllaRovescia);
    conto = millis();
  }
}

lcd_intervallometro.ino (12.3 KB)

Non mi sono messo ad analizzare tutto il codice però noto una cosa che non mi torna (spero di non sbagliarmi perché l'indentazione è un pò incasinata e non si seguono bene i blocchi logici): se dichiari la variabile conto a metà del loop, ogni volta che il programma passa di lì la reinizializza e tu perdi il suo valore per cui if((millis() - conto) >= 1000) non potrà mai essere vera.

leo72:
Non mi sono messo ad analizzare tutto il codice però noto una cosa che non mi torna (spero di non sbagliarmi perché l'indentazione è un pò incasinata e non si seguono bene i blocchi logici): se dichiari la variabile conto a metà del loop, ogni volta che il programma passa di lì la reinizializza e tu perdi il suo valore per cui if((millis() - conto) >= 1000) non potrà mai essere vera.

ciao, grazie per il tuo aiuto, ho spostato la dichiarazione di conto fuori dal loop, e adesso sembra entrare nel ciclo if(millis()-conto) >= 1000)

poi ho spostato la dichiarazione dlla variabile conto, e l'ho equparata a pausa, piu sopra, ora funziona tutto alla perfezione, appena aggiungo il blink del led in base al tempo rimaso riposto il codice

milvusmilvus:
ciao, grazie per il tuo aiuto, ho spostato la dichiarazione di conto fuori dal loop, e adesso sembra entrare nel ciclo if(millis()-conto) >= 1000)

Figurati :wink: