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--
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();
}
}
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)