[risolto]Problema timer arduino

ragazzi ho un problema con il timer di arduino in pratica premendo un pulsante deve partire il conto alla rovescia dopo che ho impostato la durata , ma invece di partire tranqullamente devo starci io a tenere premuto il pulsante altrimente ferma tutto

void timer()
 {
   if ( secondi == 0 && esecondi == 0 && minuti == 0 && eminuti == 0)
     {
     lcd.clear();
     delay(10);
     lcd.setCursor(1,0);
     lcd.print("  FINE TIMER");
     }
  else
     {
       secondi--;
      lcd.setCursor(10,1);
      lcd.print(secondi);
       delay(999);
       if (secondi == 0 && esecondi >0)
       {
         esecondi--;
         lcd.setCursor(9,1);
         lcd.print(esecondi);
         secondi = 9 ;
      lcd.setCursor(10,1);
      lcd.print(secondi);
      delay(999);
       }
       if (secondi == 0 && esecondi == 0 && minuti > 0)
       {
         minuti--;
       lcd.setCursor(5,1);
       lcd.print(minuti);
         esecondi = 5;
          lcd.setCursor(9,1);
         lcd.print(esecondi);
         secondi =9;
      lcd.setCursor(10,1);
      lcd.print(secondi);
      delay(999);
       }
       }
 }



case btnSELECT:
     {
  
     lcd.setCursor(1,0);
     lcd.print("TIMER AVVIATO");
     return timer();
      
     }

C'é il la legge di Murphy: « Se qualcosa può andar male, lo farà. »

e c'é anche il teorema Arduino che dice: l' errore é sempre nella parte di scetck che non viene fornito. :wink: :wink:

[inc...to]In quel codice dove viene letto il pulsante e dove viene controllato se é premuto?[/inc...to]

Ciao Uwe

Mi hai convinto metto tutto il programma , che può essere utile , l ho realizzato con LCDshield della DFROBOTICS , se googlate si vede subito, comunque è un normale timer , dove vengono settati i secondi e i minuti , ancora da rivedere visto che ancora non ho messo i decimali dei minuti , ma tanto non mi serve per tempi cosi lunghi , comunque oltre al problema che ho scritto li sopra c è anche quello che se faccio partire il timer a 2:00 o a 3:00 o a qualsiasi minuto preciso , mi parte a 2:59 e 3:59 , cioè si scorda di togliere un minuto al timer , succede anche se lo faccio partire a qualsiasi tempo , la prima volta che deve scalare il minuto se ne dimentica , dopodichè è tutto ok

#include <LiquidCrystal.h>
 

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 

int lcd_key     = 0;
int adc_key_in  = 0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5
int i;
int minuti ;
int eminuti ;
int secondi ;
int esecondi ;
 
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int read_LCD_buttons()
{
 adc_key_in = analogRead(0);     
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 250)  return btnUP; 
 if (adc_key_in < 400)  return btnDOWN;                       // ogni valore dell analog read corrisponde ad un tasto
 if (adc_key_in < 600)  return btnLEFT;                       // se non viene premuto nulla il valore è 1023
 if (adc_key_in < 900)  return btnSELECT;  

 
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 

//________________________________________________________________________________________________________________________________________________________________________

void setup()
{
  
 i =0;
minuti = 0;
eminuti = 0;
secondi = 0;
esecondi =0;
 lcd.begin(16, 2);              
 lcd.setCursor(1,0);
 lcd.print("SET THE TIMER!");                        //Questa parte scrive Set the timer ! 00:00 sul display
  lcd.setCursor(4,1);
  lcd.print(eminuti);
    lcd.setCursor(5,1);
  lcd.print(minuti);
  lcd.setCursor(7,1);
  lcd.print(":");
      lcd.setCursor(10,1);
      lcd.print(secondi);
    lcd.setCursor(9,1);
      lcd.print(esecondi);
 Serial.begin ( 9600);
 }
//_________________________________________________________________________________________________________________________________________________________________________



 //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 void timer()
 {
     if (secondi == 0 && esecondi >0)
       {
         esecondi--;
         lcd.setCursor(9,1);
         lcd.print(esecondi);
         secondi = 9 ;
      lcd.setCursor(10,1);
      lcd.print(secondi);
      delay(999);
       }
       else if (secondi >0)
       {
    secondi--;
      lcd.setCursor(10,1);
      lcd.print(secondi);
       delay(999);
       }
             if (secondi == 0 && esecondi == 0 && minuti > 0)
       {
         minuti--;
       lcd.setCursor(5,1);
       lcd.print(minuti);
         esecondi = 5;
          lcd.setCursor(9,1);
         lcd.print(esecondi);
         secondi =9;
      lcd.setCursor(10,1);
      lcd.print(secondi);
      delay(999);
       
       }
   if ( secondi == 0 && esecondi == 0 && minuti == 0 && eminuti == 0)
     {
     lcd.clear();
     delay(10);
     lcd.setCursor(1,0);
     lcd.print("  FINE TIMER");
     }
  
     
 
    

 }
 
 //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

  
void loop()
{      
 Serial.println (i);
 delay(100);
 lcd.setCursor(i,1);            
 lcd_key = read_LCD_buttons();  
 
 switch (lcd_key)              
 {
 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ò
   case btnRIGHT:
     {
     i++;
     if ( i == 5)
     {
       lcd.setCursor(12,1);  
       lcd.print ("MIN");
     }
       else if ( i == 10)
     {
       lcd.setCursor(12,1);  
       lcd.print ("SEC");
     }
          else
     {
       lcd.setCursor(12,1);  
       lcd.print ("   ");
     }
     delay (30);
     break;
     }
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ò


//§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§

   case btnLEFT:
     {
    
     i--;
        if ( i == 5)
     {
       lcd.setCursor(12,1);  
       lcd.print ("MIN");
     }
      else if ( i == 10)
     {
       lcd.setCursor(12,1);  
       lcd.print ("SEC");
     }
     else
     {
       lcd.setCursor(12,1);  
       lcd.print ("   ");
     }
      
     delay (30);
     break;
     }
//§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§



//*************************************************************************************************************************************************************
   case btnUP:
     {
       if (i== 5)
       {
     lcd.setCursor(i,1);
      lcd.print(minuti++);
      delay(20);
       if (minuti > 9)
      {
        minuti = 0;
        eminuti++;
       lcd.setCursor(4,1);
       lcd.print(eminuti);
       delay(20);
      }
       }
      else if(i==10)
       {    
      lcd.setCursor(i,1);
      lcd.print(secondi++);
      delay(20);
      if (secondi > 9)
      {
        esecondi++;
        secondi = 0;
        lcd.setCursor(9,1);
       lcd.print(esecondi);
           delay(20);
      }
       }
     break;
     }
   //*************************************************************************************************************************************************************
   
     //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
   case btnDOWN:
     {
       if (i==5)
       {
     lcd.setCursor(i,1);
      minuti--;
      lcd.print (minuti);
      delay(20);
      if (minuti<1)
      {
        eminuti--;
        minuti = 9;
       lcd.setCursor(4,1);
       lcd.print(eminuti);
       delay(20);
      }
      break;
       }
        else if(i==10)
       {    
      lcd.setCursor(i,1);
      secondi--;
      lcd.print(secondi);
      delay(20);
      break;
       }
     }
     //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
     
     
     
     //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
   case btnSELECT:
     {
  
     lcd.setCursor(1,0);
     lcd.print("TIMER AVVIATO");

      {
     return timer();
      }
     }
     //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

     
 }
 
}

Sono partito dal miniprogramma sulla Wiki di DFrobot

http://www.dfrobot.com/wiki/index.php?title=Arduino_LCD_KeyPad_Shield_(SKU:_DFR0009)

00:00
gli eminuti sono il primo zero , i minuti il secondo , gli esecondi il terzo e i secondi il quarto

Trovate il pezzo mancante e avrete tutta la mia gratitudine :grin:

ho risolto il fatto del tenere premuto il tasto mettendo un while al posto dell if sul void timer() il che è anche logico , ora rimangono quei piccoli errori e tutto è completo