come evitare codice ripetuto?

Ciao a tutti,
grazie ai vostri consigli sono riuscito finalmente a fare quello che avevo in mente, nulla in confronto ai vostri progetti ma tanto per me che mi sono avvicinato da pochissimo ad arduino e C.
Ora però ho bisogno ancora di voi :-[
Vi posto il programma che ho fatto. Praticamente visualizzo data, ora e temperatura su un display e se premo un pulsante entro nella schermata per la regolazione dell'ora/data. Il problema però è che ho scritto "un milione" di righe di codice tutte uguali solamente per incrementare o decrementare i valori. Come posso fare a ridurlo?
Ecco la parte di codice incriminata:

//-------------------------FUNZIONE PER MODIFICA ORA E DATA-----------------------------
void modifica_ora(){
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Imposta data e ora");

  while (true){
    
    Puls_Inc = digitalRead(51);
    Puls_Dec = digitalRead(49);
    Puls_Ok  = digitalRead(45);

//-----------------------------INCREMENTA ORA--------------------------------   
    if (Puls_Inc == HIGH && Puls_Inc_Old == LOW && Move_Set == 0){
      Set_HR = Set_HR + 1;
       if (Set_HR >23){
        Set_HR = 0;
        }
     RTC.set(DS1307_HR,Set_HR);  
     Puls_Inc_Old = Puls_Inc;
      }   
    if (Puls_Inc == LOW && Puls_Inc_Old == HIGH){     
     Puls_Inc_Old = Puls_Inc;
      }

//----------------------------DECREMENTA ORA-----------------------------------            
    if (Puls_Dec == HIGH && Puls_Dec_Old == LOW && Move_Set == 0){
      Set_HR = Set_HR - 1;
       if (Set_HR <0){
        Set_HR = 23;
        }
     RTC.set(DS1307_HR,Set_HR);  
     Puls_Dec_Old = Puls_Dec;
      }   
    if (Puls_Dec == LOW && Puls_Dec_Old == HIGH){     
     Puls_Dec_Old = Puls_Dec;
      }
      
      
//-----------------------------INCREMENTA MINUTI--------------------------------   
    if (Puls_Inc == HIGH && Puls_Inc_Old == LOW && Move_Set == 1){
     Set_MIN = Set_MIN + 1;
       if (Set_MIN >59){
        Set_MIN = 0;
        }
     RTC.set(DS1307_MIN,Set_MIN);  
     Puls_Inc_Old = Puls_Inc;
      }   
    if (Puls_Inc == LOW && Puls_Inc_Old == HIGH){     
     Puls_Inc_Old = Puls_Inc;
      }

//----------------------------DECREMENTA MINUTI-----------------------------------            
    if (Puls_Dec == HIGH && Puls_Dec_Old == LOW && Move_Set == 1){
      Set_MIN = Set_MIN - 1;
       if (Set_MIN <0){
        Set_MIN = 59;
        }
     RTC.set(DS1307_MIN,Set_MIN);  
     Puls_Dec_Old = Puls_Dec;
      }   
    if (Puls_Dec == LOW && Puls_Dec_Old == HIGH){     
     Puls_Dec_Old = Puls_Dec;
      }      
      
//-----------------------------INCREMENTA DATA--------------------------------   
    if (Puls_Inc == HIGH && Puls_Inc_Old == LOW && Move_Set == 2){
     Set_DATA = Set_DATA + 1;
       if (Set_DATA >31){
        Set_DATA = 0;
        }
     RTC.set(DS1307_DATE,Set_DATA);  
     Puls_Inc_Old = Puls_Inc;
      }   
    if (Puls_Inc == LOW && Puls_Inc_Old == HIGH){     
     Puls_Inc_Old = Puls_Inc;
      }

//----------------------------DECREMENTA DATA-----------------------------------            
    if (Puls_Dec == HIGH && Puls_Dec_Old == LOW && Move_Set == 2){
      Set_DATA = Set_DATA - 1;
       if (Set_DATA <0){
        Set_DATA = 31;
        }
     RTC.set(DS1307_DATE,Set_DATA);  
     Puls_Dec_Old = Puls_Dec;
      }   
    if (Puls_Dec == LOW && Puls_Dec_Old == HIGH){     
     Puls_Dec_Old = Puls_Dec;
      }  
      
//-----------------------------INCREMENTA MESE--------------------------------   
    if (Puls_Inc == HIGH && Puls_Inc_Old == LOW && Move_Set == 3){
     Set_MESE = Set_MESE + 1;
       if (Set_MESE >12){
        Set_MESE = 0;
        }
     RTC.set(DS1307_MTH,Set_MESE);  
     Puls_Inc_Old = Puls_Inc;
      }   
    if (Puls_Inc == LOW && Puls_Inc_Old == HIGH){     
     Puls_Inc_Old = Puls_Inc;
      }

//----------------------------DECREMENTA MESE-----------------------------------            
    if (Puls_Dec == HIGH && Puls_Dec_Old == LOW && Move_Set == 3){
      Set_MESE = Set_MESE - 1;
       if (Set_MESE <0){
        Set_MESE = 12;
        }
     RTC.set(DS1307_MTH,Set_MESE);  
     Puls_Dec_Old = Puls_Dec;
      }   
    if (Puls_Dec == LOW && Puls_Dec_Old == HIGH){     
     Puls_Dec_Old = Puls_Dec;
      }     
      
//-----------------------------INCREMENTA ANNO--------------------------------   
    if (Puls_Inc == HIGH && Puls_Inc_Old == LOW && Move_Set == 4){
     Set_ANNO = Set_ANNO + 1;
       if (Set_ANNO >99){
        Set_ANNO = 0;
        }
     RTC.set(DS1307_YR,Set_ANNO);  
     Puls_Inc_Old = Puls_Inc;
      }   
    if (Puls_Inc == LOW && Puls_Inc_Old == HIGH){     
     Puls_Inc_Old = Puls_Inc;
      }

//----------------------------DECREMENTA ANNO-----------------------------------            
    if (Puls_Dec == HIGH && Puls_Dec_Old == LOW && Move_Set == 4){
      Set_ANNO = Set_ANNO - 1;
       if (Set_ANNO <0){
        Set_ANNO = 99;
        }
     RTC.set(DS1307_YR,Set_ANNO);  
     Puls_Dec_Old = Puls_Dec;
      }   
    if (Puls_Dec == LOW && Puls_Dec_Old == HIGH){     
     Puls_Dec_Old = Puls_Dec;
      }[code]

dai, aiutatemi...
non chiedo di scrivermi il codice, solo di dirmi cosa fareste voi...poi mi arrangio :slight_smile:

ciao
ma come decrementi o aumenti i valori? con che cosa di fisico?

poi
Puls_Inc == HIGH && Puls_Inc_Old == LOW && Move_Set == 0
Puls_Dec == HIGH && Puls_Dec_Old == LOW && Move_Set == 0
Puls_Inc == HIGH && Puls_Inc_Old == LOW && Move_Set == 1
Puls_Dec == HIGH && Puls_Dec_Old == LOW && Move_Set == 1
Puls_Inc == HIGH && Puls_Inc_Old == LOW && Move_Set == 2
Puls_Dec == HIGH && Puls_Dec_Old == LOW && Move_Set == 2
Puls_Inc == HIGH && Puls_Inc_Old == LOW && Move_Set == 3
Puls_Dec == HIGH && Puls_Dec_Old == LOW && Move_Set == 3
Puls_Inc == HIGH && Puls_Inc_Old == LOW && Move_Set == 4
Puls_Dec == HIGH && Puls_Dec_Old == LOW && Move_Set == 4

ci trovo un po' di ridondanze, prova a fare degli if annidati, dovresti dimezzare le righe

forse piu che postare il codice ti conviene spiegare il flusso

Allora...vediamo se riesco a spiegarmi...

In pratica ho 3 pulsanti:
il primo aumenta il valore di minuti, ora, etc.;
il secondo decrementa il valore di minuti, ora, etc.;
il terzo è il pulsante ok (modifico l'ora-->premo OK--->modifico minuti--->premo OK--->etc.)

Ho trovato questo trhead http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1257761723/0 dove Massimo Banzi risponde ad un problema simile al mio :

In realtà non ti serve la libreria...
ti basta fare un array che contiene lo stato precedente dei pin che stai monitorando e poi fare un funzioncina alla qualle passi il numero del pin che vuoi monitorare e lui si fa i suoi calcoletti..

So cos' è un array e so cos'è una funzione... ma come li metto insieme?? :-/

sarà che usavo degli orologetti casio della bancarella , ma se fai un bottone per le ore e l'altro per i minuti, solo incrementali : 1,2,3...59,00,1,2...
forse allegerisci la logica

Tu hai ragione ma, siccome sono agli inizi, mi piacerebbe imparare come fare perchè immagino mi capiterà altre volte questa situazione

usa il costrutto switch case.

forse non sono riuscito a spiegarmi.
Come vedete dal codice, in ogni if faccio un controllo dello stato dei tasti (Puls_Inc == HIGH && Puls_Inc_Old == LOW && Move_Set == 0) per ogni dato che mi appresto a modificare. questo era nato perchè, senza questo controllo, il valore non incrementava di una unità alla volta. Ecco, a questo punto mi sono chiesto: se le condizioni sono sempre uguali non posso farlo solo una volta??
Da qui la mia domanda...
Mi sa che sono stato ancora più contorto, scusate, ma è da poco che mi sono avvicinato al C

Ciao, potresti crearti una funzione che fa il lavoro di incrementare o decrementare il parametro che le passi.

Per esempio
funzione Modifica (Parametro, segno)

In parametro gli passi H o M (per ore minuti) e come segno gli passi "1" per incrementare o "-1" per decrementare.

In questo modo puoi fare una cosa del genere

esempio
parametro = parametro + (segno)

in questo modo si incrementa o decrementa a seconda del segno.

Poi il controllo lo fai a seconda del parametro su 24 0 60 con qualche stuttura if.

alla fine ritorni il valore da scrivere nella funzione che memorizza sull'rtc.

...

Re: come evitare codice ripetuto?
Reply #7 - 14.10.2010 at 22:24:10 |
forse non sono riuscito a spiegarmi.
Come vedete dal codice, in ogni if faccio un controllo dello stato dei tasti (Puls_Inc == HIGH && Puls_Inc_Old == LOW && Move_Set == 0) per ogni dato che mi appresto a modificare. questo era nato perchè, senza questo controllo, il valore non incrementava di una unità alla volta. Ecco, a questo punto mi sono chiesto: se le condizioni sono sempre uguali non posso farlo solo una volta??
Da qui la mia domanda...

Mi sorge un dubbio, hai utilizzato delle tecniche antirimbalzo software o hardware ?
Se non le hai inserite eccoti ad esempio ben spiegata di antiribalzo software:
http://www.ilbloggatore.com/a1/2009/06/22/tz-ep-4-–-arduino-parte-1-–-il-mio-progetto/

Oppure hardware insieme ad un articolo che spiega bene il concetto di antirimbalzo:
http://www.edutronica.it/file//FE-241.pdf