contamarce per moto

salve a tutti sono uno nuovo di questo forum. ho comprato da poco arduino uno e vorrei iniziare a programmarlo . non e la prima volta che uso il linguaggio c+ , ma vorrei qualche consiglio da voi piu esperti di me su un progetto. il progetto riguarda di realizzare un contamarce per moto diciamo un po universale pensando a farlo funzionare con dei pulsanti; uno che "sale" la marcia e l'altro che "scende" gia qualcosina l'o fatta diciamo; su un display a 7 segmenti ora invece lo vorrei fare su un display lcd con collegamento di tipo seriale analogico; poi volevo mettere anche un'altro tasto che e quello della folla che al momento che si tiene premuto deve comparire sul display F e poi quando lo rilascio deve ritornare di nuovo a 1
il progetto che ho testato io e questo e funziona manca solo la folla

#define BUTTON_DOWN 11
#define BUTTON_UP 12

int ledPinA =  7;    // LED connected to digital pin 3
int ledPinB =  6;    // LED connected to digital pin 4
int ledPinC =  4;    // LED connected to digital pin 5
int ledPinD =  2;    // LED connected to digital pin 6
int ledPinE =  3;    // LED connected to digital pin 7
int ledPinF =  9;    // LED connected to digital pin 8
int ledPinG =  10;    // LED connected to digital pin 9
int ledPinP =  5;   // LED connected to digital pin 10

int val_down = 0;
int old_val_down = 0;
int val_up = 0;
int old_val_up = 0;
int state = 0;
int gear = 1;

// The setup() method runs once, when the sketch starts

void setup()   {             
  pinMode(BUTTON_DOWN, INPUT);
  pinMode(BUTTON_UP, INPUT);
  
  // initialize the digital pin as an output:
  pinMode(ledPinA, OUTPUT);
  pinMode(ledPinB, OUTPUT);
  pinMode(ledPinC, OUTPUT);
  pinMode(ledPinD, OUTPUT);
  pinMode(ledPinE, OUTPUT);
  pinMode(ledPinF, OUTPUT);
  pinMode(ledPinG, OUTPUT);  
  pinMode(ledPinP, OUTPUT);
  
  // initialize serial communication:
  Serial.begin(9600);
}

void led0()
{
  digitalWrite(ledPinA, HIGH);
  delay(50);
  digitalWrite(ledPinA, HIGH);
  delay(50);
  digitalWrite(ledPinB, HIGH);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, HIGH);
  digitalWrite(ledPinE, LOW);  
  digitalWrite(ledPinF, HIGH);  
  digitalWrite(ledPinG, LOW); 
  digitalWrite(ledPinP, HIGH);
}

void led1()
{
  digitalWrite(ledPinA, HIGH);
  digitalWrite(ledPinB, LOW);
  delay(50);
  digitalWrite(ledPinB, LOW);
  delay(50);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, HIGH);
  digitalWrite(ledPinE, HIGH);  
  digitalWrite(ledPinF, HIGH);  
  digitalWrite(ledPinG, HIGH); 
  digitalWrite(ledPinP, HIGH);
}

void led2()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, HIGH);
  delay(50);
  digitalWrite(ledPinC, HIGH);
  delay(50);
  digitalWrite(ledPinD, LOW);
  digitalWrite(ledPinE, LOW);  
  digitalWrite(ledPinF, HIGH);  
  digitalWrite(ledPinG, LOW); 
  digitalWrite(ledPinP, HIGH);
}

void led3()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, LOW);
digitalWrite(ledPinD, LOW);
  delay(50);
  digitalWrite(ledPinD, LOW);
  delay(50);
  digitalWrite(ledPinE, HIGH);  
  digitalWrite(ledPinF, HIGH);  
  digitalWrite(ledPinG, LOW); 
  digitalWrite(ledPinP, HIGH);
}

void led4()
{
 digitalWrite(ledPinA, HIGH);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, HIGH);
  digitalWrite(ledPinE, HIGH);
  delay(50);
  digitalWrite(ledPinE, HIGH);
  delay(50);  
  digitalWrite(ledPinF, LOW);  
  digitalWrite(ledPinG, LOW); 
  digitalWrite(ledPinP, HIGH);
} 

void led5()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, HIGH);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, LOW);
  digitalWrite(ledPinE, HIGH);  
  digitalWrite(ledPinF, LOW);
  delay(50);
  digitalWrite(ledPinF, LOW);
  delay(50); 
  digitalWrite(ledPinG, LOW); 
  digitalWrite(ledPinP, HIGH);
} 

void led6()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, HIGH);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, LOW);
  digitalWrite(ledPinE, LOW);  
  digitalWrite(ledPinF, LOW);  
  digitalWrite(ledPinG, LOW);
  delay(50);
  digitalWrite(ledPinG, LOW);
  delay(50);
  digitalWrite(ledPinP, HIGH);
} 
void led7()
{
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, LOW);
  digitalWrite(ledPinC, LOW);
  digitalWrite(ledPinD, LOW);
  digitalWrite(ledPinE, LOW);  
  digitalWrite(ledPinF, LOW);  
  digitalWrite(ledPinG, LOW); 
  digitalWrite(ledPinP, HIGH);
  delay(50);
  digitalWrite(ledPinP, LOW);
  delay(50);

} 



void setLed(int number)
{
  switch (number) {
    
    case 1:  
      led1();
      break;
    case 2:  
      led2();
      break;
    case 3:  
      led3();
      break;
    case 4:  
      led4();
      break;
    case 5:  
      led5();
      break;
    case 6:  
      led6();
      break;
    
      
     

  }
}
              
// the loop() method runs over and over again,
// as long as the Arduino has power

void oldloop()                     
{
                   // wait for a second
  led0();
  delay(1000);                  // wait for a second
  led1();
  delay(1000);                  // wait for a second
  led2();
  delay(1000);                  // wait for a second
  led3();
  delay(1000);                  // wait for a second
  led4();
  delay(1000);                  // wait for a second
  led5();
  delay(1000);                  // wait for a second
  led6();
  delay(1000);                  // wait for a second
  led7();
  delay(1000);                  // wait for a second
                   // wait for a second
}

void loop()
{
    val_up = digitalRead(BUTTON_UP);
    if ((val_up == HIGH) && (old_val_up == LOW)) {
      gear += 1;
      Serial.print("gear number:  ");
      Serial.println(gear, DEC);
      setLed(gear);
      delay(100);
    }
    old_val_up = val_up;
 
    val_down = digitalRead(BUTTON_DOWN);
    if ((val_down == HIGH) && (old_val_down == LOW)) {
      gear -= 1;
      Serial.print("gear number:  ");
      Serial.println(gear, DEC);
      setLed(gear);
      delay(100);
    }
    old_val_down = val_down;
    
    if (gear >= 6) {
      gear = 6;
    }
    if (gear <= 1) {
      gear = 1;
    }
    
    


}

aspetto le vostre risposte.
grazie anticipatamente per l'attenzione.

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

Ciao.
Non ho capito cosa ti serve...
Hai bisogno di aiuto per utilizzare l'LCD? O non sai come implementare la condizione che rileva la folle?

Ciao, riesumo questo post datato perchè l'utilità di esso s'è presentata solo ora.
Spero che ripkit98 abbia risolto il suo problema e lo ringrazio per aver condiviso lo sketch.
Ho preso spunto da esso per adattarlo alle mie esigenze e devo dire che ho quasi realizzato ciò che volevo, oltre ad aggiungere la parte che riguarda la folle, voglio aggiungere quella per memorizzare l'ultima marcia inserita prima di togliere l'alimentazione cosicché al successivo avvio venga mostrata la marcia attualmente inserita (sempre che il pedle non venga spostato alimentazione staccata, cosa che comporta il posizionamento in folle per ripristinare il tutto).
Qui di seguito il codice.

 // Contamarce, o meglio definito, indicatore di marcia inserita.
 // Hardware utilizzato per test:
 // Arduino UNO
 // Due finecorsa a tre poli (NO, NC e Comune)
 // Due resistenze 10kOhm
 //
 //
 // Codice studiato e adattato By Camp
 // 
 // Sketch di base scritto da rikip98
 //

 #include <EEPROM.h>
  
// pin interruttori
 #define pin_giu 2 // pin interruttore di marcia giu
 #define pin_su 3  // pin intterruttore di marcia su
 #define pin_n 12  // pin segnale folle
 
 //definizione pin display
  int DP=4;
  int C=5;
  int D=6;
  int E=7;
  int G=8;
  int F=9;
  int A=10;
  int B=11; 

  int a=0;
  int value = 0;
  int val_n = 0;
  int val_giu = 0;
  int old_val_giu = 0;
  int val_su = 0;
  int old_val_su = 0;
  int state = 0;
  int gear = 1;
  int datoeeprom = 0;
  
void setup() {

  pinMode(G, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(DP, OUTPUT);

  pinMode(pin_su, INPUT);
  pinMode(pin_giu, INPUT);
  pinMode(pin_n, INPUT);
  
}
/*void oldloop()                    
{
                  // wait for a second
 numero_1();
 delay(1000);                  // wait for a second
 lettera_n();
 delay(1000);                  // wait for a second
 numero_2();
 delay(1000);                  // wait for a second
 numero_3();
 delay(1000);                  // wait for a second
 numero_4();
 delay(1000);                  // wait for a second
 numero_5();
 delay(1000);                  // wait for a second
 numero_6();
 delay(1000);                  // wait for a second
}

*/ 
void loop() {
value = EEPROM.read(a);
  if ( value == 1) {
  numero_1;
  gear == 1;
  }
  if (value == 2){
   lettera_n;
   gear == 2;
  }
  if (value == 3){
    numero_2;
    gear == 3;
  }
  if (value == 4){
    numero_3;
    gear == 4;
  }
  if (value == 5){
    numero_4;
    gear == 5;
  }
  if (value == 6){
    numero_5;
    gear == 6;
  }
  if (value == 7){
    numero_6;
    gear == 7;
  }
  val_n = digitalRead (pin_n);
  if (val_n == HIGH) {
    lettera_n();
    EEPROM.write(a,datoeeprom);
   delay(0005);
   } 


 val_su = digitalRead(pin_su);
   if ((val_su == HIGH) && (old_val_su == LOW)) {
     gear += 1;
     setnum(gear);
     EEPROM.write(a,datoeeprom);
     delay(250);
   }
   old_val_su = val_su;
   
    val_giu = digitalRead(pin_giu);
   if ((val_giu == HIGH) && (old_val_giu == LOW)) {
     gear -= 1;
     setnum(gear);
     EEPROM.write(a,datoeeprom);
     delay(250);
   }
   old_val_giu = val_giu;  
   
  if (gear >= 7) {
     gear = 7;
   }
   if (gear <= 1) {
     gear = 1;
   }

}

   

  void lettera_n(){
      digitalWrite(A, HIGH);
      digitalWrite(B, HIGH);
      digitalWrite(C, LOW);
      digitalWrite(D, HIGH);
      digitalWrite(E, LOW);
      digitalWrite(F, HIGH);
      digitalWrite(G, LOW);
      digitalWrite(DP, HIGH);
}
void numero_1(){
      digitalWrite(A, HIGH);
      digitalWrite(B, LOW);
      digitalWrite(C, LOW);
      digitalWrite(D, HIGH);
      digitalWrite(E, HIGH);
      digitalWrite(F, HIGH);
      digitalWrite(G, HIGH);
      digitalWrite(DP, HIGH);
}
void numero_2(){
      digitalWrite(A, LOW);
      digitalWrite(B, LOW);
      digitalWrite(C, HIGH);
      digitalWrite(D, LOW);
      digitalWrite(E, LOW);
      digitalWrite(F, HIGH);
      digitalWrite(G, LOW);
      digitalWrite(DP, HIGH);
}
void numero_3(){
      digitalWrite(A, LOW);
      digitalWrite(B, LOW);
      digitalWrite(C, LOW);
      digitalWrite(D, LOW);
      digitalWrite(E, HIGH);
      digitalWrite(F, HIGH);
      digitalWrite(G, LOW);
      digitalWrite(DP, HIGH);
}
void numero_4(){
      digitalWrite(A, HIGH);
      digitalWrite(B, LOW);
      digitalWrite(C, LOW);
      digitalWrite(D, HIGH);
      digitalWrite(E, HIGH);
      digitalWrite(F, LOW);
      digitalWrite(G, LOW);
      digitalWrite(DP, HIGH);
}
void numero_5(){
      digitalWrite(A, LOW);
      digitalWrite(B, HIGH);
      digitalWrite(C, LOW);
      digitalWrite(D, LOW);
      digitalWrite(E, HIGH);
      digitalWrite(F, LOW);
      digitalWrite(G, LOW);
      digitalWrite(DP, HIGH);
}
void numero_6(){
      digitalWrite(A, LOW);
      digitalWrite(B, HIGH);
      digitalWrite(C, LOW);
      digitalWrite(D, LOW);
      digitalWrite(E, LOW);
      digitalWrite(F, LOW);
      digitalWrite(G, LOW);
      digitalWrite(DP, HIGH);
}

void setnum (int number){
  switch (number){
    case 1:
    numero_1();
    //EEPROM.write(a,datoeeprom);
    //delay(500);
    break;

    case 2:
    lettera_n();
    //EEPROM.write(1,datoeeprom);
    //delay(500);
    break;

    case 3:
    numero_2();
    //EEPROM.write(1,datoeeprom);
    //delay(500);
    break;

    case 4:
    numero_3();
    //EEPROM.write(1,datoeeprom);
    //delay(500);
    break;

    case 5:
    numero_4();
    //EEPROM.write(1,datoeeprom);
    //delay(500);
    break;

    case 6:
    numero_5();
    //EEPROM.write(1,datoeeprom);
    //delay(500);
    break;

    case 7:
    numero_6();
    //EEPROM.write(1,datoeeprom);
    //delay(500);
    break;
  }
}

contare le marce con due o piu sensori è difficilissimo e per di più veramente poco affidabile!
L'unica vera soluzione è rilevare il numero giri motore e la velocità effettiva, solo a quel punto si potrà sapere in che marcia si è compresa la folle.

testando con la breadboard non sta dando problemi, comunque ho il data logger per rilevarmi i dati di contagiri e tachimetro in modo da fare come dici tu.