Problema programmazione pulsante

Buona sera, è tutt’oggi che cerco di trovare una soluzione a questo problema cercando sia qua che in google ma senza esito :cold_sweat:

vorrei che premendo il pulsante parta il tempo (funzione millis()) e che esso venga visualizzato a display(anche se lascio il pulsante), una volta che si ripremo il pulsante arduino controlli il tempo impiegato, se è minore lo sostituisca con il best e nel frattempo inizi un nuovo contatore.

ecco il mio programma:

#include <LiquidCrystal.h>
#define BUTTON 7
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  

int pls = 0;


void setup() {
 pinMode(BUTTON, INPUT);

 pinMode(13, OUTPUT);
 lcd.begin(16, 2);
 lcd.setCursor(10,0);
 lcd.print("Currnt");
 lcd.setCursor(0,0);
 lcd.print("Bst");
 lcd.setCursor(0,1);
 lcd.print("Ult");
 Serial.begin(9600);  
  pls = digitalRead(BUTTON);
}

void loop () {
    double bestLap;
     double lap, tempo, start = 0;
   
if( (pls == HIGH) ) 
    {
      tempo = millis(); 
       lap = tempo - start; 
      start = tempo; 
      
      
      if (lap < bestLap)
      {
        bestLap = lap;
      }
       }
       
       lcd.setCursor(10, 1); 
        lcd.print(tempo);
       lcd.setCursor(5, 0); 
        lcd.print(bestLap);
 }

al dilà degli errori il problema principle e che – if( (pls == HIGH) ) – considera solo quando il pulsante è premuto, ho provato a inserire nelle parentesi graffe l’istruzione pls = HIGH ma non ha nessun effetto, sapreste aiutarmi?

Andrea

Il codice si deve includere tra gli appositi tag. Tutte le variabili che hanno a che fare con millis devono essere di tipo unsigned long, non double. Correggi questo, riprova e verifica nuovamente gli errori

Tu leggi 1 in lettere UNA volta lo stato del pulsante all inizio. Come puoi controllare se viene ripremuto? Ciao Uwe

il problema principle e che -- if( (pls == HIGH) ) -- considera solo quando il pulsante è premuto

Ma è normale... l'IF serve proprio a questo. Se la condizione fra () è vera, allora viene eseguito il codice successivo all'IF, quello fra {}.

http://arduino.cc/en/Reference/If http://arduino.cc/en/Reference/Else

Ho aggiornato il codice ma non funziona

#include <LiquidCrystal.h>  
#define BUTTON 7
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  
  
  //Variabili
 int pulsante = 0;
 int stato = 0;
 unsigned long timer;

  
void setup()
 {  
   pinMode(BUTTON, INPUT);
   lcd.begin(16, 2);  
   lcd.setCursor(3, 0);  
   lcd.print("Cronometro"); 
   
   }  
  
void loop() 
 
 {  
   pulsante = digitalRead(BUTTON);
   while(pulsante == HIGH){
   stato = 1;
   timer = 0;
     
   }
   
   
  if (stato == 1)
  
  {
    timer = (millis()/1000.);
    lcd.setCursor(3,1);
    lcd.print(timer);
  
   }  
   
     }

Questo è concettualmente sbagliato:

   pulsante = digitalRead(BUTTON);
   while(pulsante == HIGH){
   stato = 1;
   timer = 0;
     
   }

Non uscirai MAI da quel ciclo perché fai un'unica lettura del pulsante AL DI FUORI del ciclo while, per cui se per caso il pulsante è premuto, entri nel ciclo e non ne esci più. Devi quindi usare un if per controllare lo stato del pulsante e poi un while per fermare il programma finché il pulsante non è rilasciato. Dopo il while, metti il codice da eseguire al rilascio del pulsante.

Fai così:

if (digitalRead(BUTTON)) { //pulsante premuto?? sì
  while (digitalRead(BUTTON) {} //esegue finché il pulsante resta premuto
  stato = 1;  //queste istruzioni le eseguo solo se il pulsante è premuto
  timer = 0;
}

Io tempo fa avevo realizzato questo sketch. E'differente da ciò che vuoi ottenere tuttavia potrebbe tornarti utile. E' un cronometro (non usa display ma comunicazione seriale) che segnala anche il risultato migliore. Spero ti possa aiutare

float best=999999999;
int cont=0;
int btn=0;
float inizio;
float fine;
float tempo;
int i=0;
void setup (){
  pinMode(6,INPUT);
  Serial.begin(9600);
}
void loop (){
  Serial.println("premere il pulsante per iniziare il cronometro");
  i=0;
  while(i==0){
  btn=digitalRead(6);
  if(btn==HIGH&&cont!=1){
  inizio=millis();
  Serial.println("premere il pulsante per fermare il cronometro");
  cont=1;
  delay(200);
  btn=digitalRead(6);
}
 if(btn==HIGH&&cont==1){
  fine=millis();
  Serial.print("il tempo e' di ");
  tempo=(fine-inizio)/1000;
  Serial.print(tempo);
  Serial.println(" secondi");
  if(best>tempo)best=tempo;
  Serial.print("il record e' ");
  Serial.print(best);
  Serial.println(" secondi");
  cont=0;
  i=1;
  delay(200);
}
}
}