incremento numero intero di 1 per ogni pressione di un pulsante

sto cercando di creare un sistema di selezione tramite un contatore.
il mio problema e che quando premo il pulsante il contatore va in avanti di continuo, non incrementando di una sola unita per ogni pressione (vi chiedo aiuto)
qui sotto il mio listato

//RETROMARCIA
int pinR=A2;
byte Rsel;
int z;
//FRIZIONE
int pinF=A1;
int posF;
int posFm;
byte stopxF;
byte stopyF;
//LED
int pinLedV=A7;
int pinLedR=A0;
//LCD
char selp;
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//MOTORE
int pinDirA=8; //MOTORE A/A
int pinPwmA=9; //MOTORE A/B
int pinDirB=13; //MOTORE B/A
int pinPwmB=10; //MOTORE B/B
int pinposa=A6; //PIN POTENZIONETRO X
int pinposb=A4; //PIN POTEZIOMETRO Y
int posa; // POSIZIONE EFFETTIVA X
int posb; // POSIZIONE EFFETTIVA Y
int sel=2;//SELEZIONE POSIZIONE
int posam; //VALORE EFFETTIVO X VISUALIZZATO
int posbm; //VALORE EFFETTIVO Y VISUALIZZATO
int x; //POSIZIONE OBBIETTIVO X-POSIZIONE RICHIESTA
int y; //POSIZIONE OBBIETTIVO Y-POSIZIONE RICHIESTA
byte stopx; //FERMA IL MOTORE A
byte stopy; //FERMA IL MOTORE B ("HIGH" GIRA)

//SELEZIONE CONTATORE
int pinup=6; // PULSANTE SU
int pindown=7; //PULSANTE GIU
byte up=0; //BYTE SU
byte down=0; //BYTE GIU
byte oldup=0; // BYTE PRECEDENTE SU
byte olddown=0; // BYTE PRECEDENTE GIU

void setup()
{
//RETOMARCIA
pinMode(pinR,INPUT);
//FRIZIONE
pinMode( pinF,INPUT);
//LCD

// set up the LCD's number of columns and rows:
lcd.begin(16, 2);//LCD NUMERO COLONNA,RIGA
// SCRIVI SULL' LCD.
lcd.print("PITRU84 GEAR");
delay (50);
lcd.clear();
//LED
pinMode( pinLedV,OUTPUT);//IMPOSTO IL PIN COME USCITA
pinMode( pinLedR,OUTPUT);
//MOTORE
pinMode( pinDirA,OUTPUT ); //IMPOSTO IL PIN COME USCITA
pinMode( pinPwmA,OUTPUT ); //**************************
pinMode( pinDirB,OUTPUT );
pinMode( pinPwmB,OUTPUT );
pinMode( posb,INPUT); //*************INGRESSO
pinMode( posa,INPUT ); //*************INGRESSO
pinMode (pinup, INPUT); //**************INGRESSO
pinMode (pindown,INPUT); //**************INGRESSO

}

void loop()

{
////////////RETROMARCIA//////////
Rsel= digitalRead(pinR);
if (Rsel==HIGH)
{(delay (50));z=1;}
if (Rsel==LOW)
{z=2;}

//FRIZIONE///////////////
lcd.setCursor(0,0);
lcd.print(posFm);
posF=analogRead( pinF);
posFm=(posF=map(posF, 0, 1023, 0, 100));
//FRIZIONE
/if (posFm<90)
{(stopxF=LOW);
(stopyF=LOW);}
if (posFm>90)
{(stopxF=stopx);
(stopyF=stopy);}
/

/if(posFm<80)
{(stopx==LOW)&&(stopy==LOW);}
if(posFm>=80){(stopx==HIGH)&&(stopy==HIGH);}
/

//LED
if ((posam==x)&&(posbm==y)) //SE LE DUE POSIZIONI CORRISPONDONO
digitalWrite (pinLedV,HIGH);//IL LED E ACCESO
if ((posbm!=y)||(posam!=x)) //SE LE DUE POSIZIONI NON CORRISPONDONO
digitalWrite (pinLedV,LOW); //IL LED E SPENTO

//////////////////// CONTATORE ////////////////////
////////////////RICHIESTA FOLLE///////////////
up= digitalRead (pinup ); //LETTURA DEL PIN UP
down= digitalRead (pindown);//LETTURA DEL PIN DOWN
if ((up==HIGH)&&(down==HIGH))
{

sel=2;}
else
{
//CONTROLLO PULSANTE UP

if ((down!= HIGH) && (up == HIGH) && (sel<7)) //CONDIZIONI PER LO STATO DI UP

{
delay(50); //TEMPO MINIMO PULSANTE

{
lcd.clear();//PULISCI LO SCERMO A OGNI CAMBIAMENTO
sel=(sel+1); //OPERAZIONE DI ADDIZIONE
}

}

//CONTROLLO PULSANTE DOWN

if ((up!=HIGH) && (down==HIGH) && (sel>z)) //CONDIZIONI PER LO STATO DI DOWN

{
delay(50); //TEMPO MINIMO PULSANTE
{
lcd.clear();
sel=(sel-1);}

}}

Prima di tutto, essendo il tuo primo post, ti consiglio di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO ...

... poi, come da regolamento, riprendi il tuo post e racchiudi il codice dentro i tag CODE ... quando sei in edit sono quelli che mette il bottone </> (il primo a sinistra).

Quando il post sarà sistemato ne riparliamo.

Guglielmo

E sul codice, nell'IDE usa CTRL+T, così è illeggibile !!

ci riprovo
il codice da me creato e questo

//RETROMARCIA
int pinR = A2;
byte Rsel;
int z;
//FRIZIONE
int pinF = A1;
int posF;
int posFm;
byte stopxF;
byte stopyF;
//LED
int pinLedV = A7;
int pinLedR = A0;
//LCD
char selp;
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//MOTORE
int pinDirA = 8; //MOTORE A/A
int pinPwmA = 9; //MOTORE A/B
int pinDirB = 13; //MOTORE B/A
int pinPwmB = 10; //MOTORE B/B
int pinposa = A6; //PIN POTENZIONETRO X
int pinposb = A4; //PIN POTEZIOMETRO Y
int posa; // POSIZIONE EFFETTIVA X
int posb; // POSIZIONE EFFETTIVA Y
int sel = 2; //SELEZIONE POSIZIONE
int posam; //VALORE EFFETTIVO X  VISUALIZZATO
int posbm; //VALORE EFFETTIVO Y VISUALIZZATO
int x; //POSIZIONE OBBIETTIVO X-POSIZIONE RICHIESTA
int y; //POSIZIONE OBBIETTIVO Y-POSIZIONE RICHIESTA
byte stopx; //FERMA IL MOTORE A
byte stopy; //FERMA IL MOTORE B ("HIGH" GIRA)

//SELEZIONE CONTATORE
int pinup = 6; // PULSANTE SU
int pindown = 7; //PULSANTE GIU
byte up = 0; //BYTE SU
byte down = 0; //BYTE GIU
byte oldup = 0; // BYTE PRECEDENTE SU
byte olddown = 0; // BYTE PRECEDENTE GIU

void setup()
{
  //RETOMARCIA
  pinMode(pinR, INPUT);
  //FRIZIONE
  pinMode( pinF, INPUT);
  //LCD

  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);//LCD NUMERO COLONNA,RIGA
  // SCRIVI SULL' LCD.
  lcd.print("PITRU84 GEAR");
  delay (50);
  lcd.clear();
  //LED
  pinMode( pinLedV, OUTPUT); //IMPOSTO IL PIN COME USCITA
  pinMode( pinLedR, OUTPUT);
  //MOTORE
  pinMode( pinDirA, OUTPUT ); //IMPOSTO IL PIN COME USCITA
  pinMode( pinPwmA, OUTPUT ); //**************************
  pinMode( pinDirB, OUTPUT );
  pinMode( pinPwmB, OUTPUT );
  pinMode( posb, INPUT); //*************INGRESSO
  pinMode( posa, INPUT ); //*************INGRESSO
  pinMode (pinup, INPUT); //**************INGRESSO
  pinMode (pindown, INPUT); //**************INGRESSO

}

void loop()

{
  ////////////RETROMARCIA//////////
  Rsel = digitalRead(pinR);
  if (Rsel == HIGH)
  {
    (delay (50));
    z = 1;
  }
  if (Rsel == LOW)
  {
    z = 2;
  }

  //FRIZIONE///////////////
  lcd.setCursor(0, 0);
  lcd.print(posFm);
  posF = analogRead( pinF);
  posFm = (posF = map(posF, 0, 1023, 0, 100));
  //FRIZIONE
  /*if (posFm<90)
            {(stopxF=LOW);
            (stopyF=LOW);}
  if (posFm>90)
     {(stopxF=stopx);
        (stopyF=stopy);}*/

  /*if(posFm<80)
  {(stopx==LOW)&&(stopy==LOW);}
  if(posFm>=80){(stopx==HIGH)&&(stopy==HIGH);}*/


  //LED
  if ((posam == x) && (posbm == y)) //SE LE DUE POSIZIONI CORRISPONDONO
    digitalWrite (pinLedV, HIGH); //IL LED E ACCESO
  if ((posbm != y) || (posam != x)) //SE LE DUE POSIZIONI NON CORRISPONDONO
    digitalWrite (pinLedV, LOW); //IL LED E SPENTO



  //////////////////// CONTATORE ////////////////////
  ////////////////RICHIESTA FOLLE///////////////
  up = digitalRead (pinup ); //LETTURA DEL PIN UP
  down = digitalRead (pindown); //LETTURA DEL PIN DOWN
  if ((up == HIGH) && (down == HIGH))
  {

    sel = 2;
  }
  else
  {
    //CONTROLLO PULSANTE UP


    if ((down != HIGH) && (up == HIGH) && (sel < 7)) //CONDIZIONI PER LO STATO DI UP

    {
      delay(50); //TEMPO MINIMO PULSANTE

      {
        lcd.clear();//PULISCI LO SCERMO A OGNI CAMBIAMENTO
        sel = (sel + 1); //OPERAZIONE DI ADDIZIONE
      }


    }


    //CONTROLLO PULSANTE DOWN


    if ((up != HIGH) && (down == HIGH) && (sel > z)) //CONDIZIONI PER LO STATO DI DOWN

    {
      delay(50); //TEMPO MINIMO PULSANTE
      {
        lcd.clear();
        sel = (sel - 1);
      }

    }
  }

pitru84:
...
il mio problema e che quando premo il pulsante il contatore va in avanti di continuo, non incrementando di una sola unita per ogni pressione ...

Questo e' dovuto al fatto che il loop legge il pulsante ogni volta che ripete il ciclo, quindi e' come se tu continuassi a premerlo ad ogni ciclo di esecuzione, per tutto il tempo in cui lo tieni premuto ... in questo esempio trovi un possibile modo per evitare il problema, facendo in modo che il loop ignori il pulsante, dopo aver eseguito il suo compito, finche' non viene rilasciato e premuto di nuovo (intendo, ovviamente, solo la parte che gestisce il pulsante, non tutto lo sketch ... puoi facilmente adattarla al tuo sketch per risolvere il problema ;)) ...

scusa la mia stupidita ma ho letto e riletto, ho omesso di dire che questo e il mio primo listato.Quindi
vi chiedo un aiutino in piu se non pretendo troppo..
GRAZIE

scusa ok capito
adesso funziona
grazie tante

... intendevo questa parte dello sketch (ovviamente, nel tuo devi dichiarare anche le variabili che usa, altrimenti non funzionera' mai)

st = digitalRead(buttonPin)  //legge pulsante
   if ((st != stp) && (stp == 1))
   {
      lampeggi = !lampeggi;
      Stato = 0;
      StatoLed = 0;
      digitalWrite(ledPin,LOW);
      stp = st;	 //set flag pulsante premuto
   }
   if ((st != stp) && (stp == 0))
   {
      stp = st;  //reset flag pulsante premuto
   }

Lascia perdere i comandi nel primo if, che sono quelli specifici di quello sketch, a te interessa la sequenza di lettura ed esclusione, cioe' la lettura del pin al quale hai collegato il pulsante (quindi al posto di buttonPin ci andra' il tuo pin), ed i due cicli if consecutivi ... quindi ...

st = digitalRead(nome del tuo pin)  //legge pulsante
   if ((st != stp) && (stp == 1))
   {
      ... qui ci metti l'istruzione per incrementare il tuo contatore ...
      stp = st;	 //set flag pulsante premuto
   }
   if ((st != stp) && (stp == 0))
   {
      stp = st;  //reset flag pulsante premuto
   }

... come funziona ... le variabili "st" e "stp" (che sono tipo byte, e che possono avere qualsiasi nome tu voglia, io uso queste per comodita' ) contengono: st, lo stato del pulsante letto con il digitalRead ... ed stp, lo stato "precedente" di st (cioe', lo stato che aveva subito prima della pressione o del rilascio, che pero' viene cambiato nei due cicli if, riportandoli uguali, quindi sono diversi solo nell'istante in cui lo stato del pulsante cambia, e qui sta il trucco) ... qui e' impostato per dei pulsanti con il pull-up al positivo e che chiudono a massa quando sono premuti, ovviamente se li colleghi alla rovescia devi anche invertire la logica di controllo ...

Nel ciclo normale entrambi gli if sono ignorati, perche' st ed stp sono uguali, quindi la prima condizione e' false ... nell'istante in cui premi il pulsante, il primo ciclo if vede che st e' diverso da stp, E che stp prima era 1 (cioe' il pulsante era non premuto), quindi esegue le operazioni al suo interno (qui il secondo ciclo if viene ignorato, perche' anche se st ed stp sono diversi, stp non e' a zero) ... quindi l'ultima operazione di questo ciclo if rimette stp uguale ad st (in questo caso 0), facendo in modo che, in tutti i loop successivi, finche' il pulsante rimane premuto nessuno dei due cicli venga eseguito ... quando rilasci il pulsante, il secondo ciclo vede che st e' diverso da stp E che stp e' a 0, quindi resetta stp, in modo che una successiva pressione possa di nuovo far eseguire il primo ciclo ...

Il risultato e' che tutte le operazioni che inserisci nel primo ciclo if, verranno eseguite alla pressione del tasto, ma una sola volta ... allo stesso modo, se ti servisse di eseguire operazioni differenti al rilascio del tasto, dovresti metterle all'interno del secondo ciclo if, che le eseguirebbe una sola volta nel momento del rilascio ...

EDIT: stavo scrivendo ed ho postato senza rileggere :wink:

Non vorrei rompere le uova nel paniere, ma da poco ho sviluppato un codice che fa al caso tuo.

Prova a dare un occhiata a questo link Modalità di accesso alla lettura degli ingressi - Software - Arduino Forum

Non badare ai vari interventi al post, copia le prime 5 righe di codice del loop e poi alla riga successiva trovi l'esempio che ti serve.

Se riesci riunire i vari ingressi sotto un'unica porta fisica, il codice può essere ancor più ottimizzato.

Se hai bisogno sono disponibile darti un aiuto