Uso de push buttons

Hola buenas tardes estoy haciendo un proceso en el cual cada vez que pulso un button tiene que aumentar mas uno una variable ejempli:

 case btn_SELECT:{
                x++;
                Serial.println(x);
                if (x==1){
                  Serial.println("hola");
                  count_case0++;
                }
              break;
              }

lo que hace ese codigo es que al picar el boton select, aumenta demasiado rapido, lo que yo quiero que pase es que cuando presione el boton solo aumente uno que no tenga un aumento tras aumento, porque si dejo presionado el boton se aumenta infinitamente hasta desbordarse. Existe la manera de que dejando el boton presionado solo aumente uno y nada mas.

Lo habia practicado con un ciclo while cuando se pica el boton pero no recuerdo exactamente y no lo eh logrado hacer

que que? y los void? el setup, el loop y las variables declaradas? creo que si queres un código asi es bastante sencillo.

int contador=0;
int boton = 2; //(pin de entrada del botón)

void setup{
pinMode(boton,INPUT);


void loop{

if(digitalRead(boton) == HIGH){
contador++; //Aumenta la variable en uno con cada paso que el botón este en HIGH
}

}

}

Yo lo pense asi, ahi tenes la variable que cuente con cada paso, ya le podes poner lo que quieras y que tenga lo que quieras por ej: Si contador es mayor a 3, poner el contador a 0. Si hay cosas que no se entiende podes mirar un tutorial de youtube, se puede aprender bastante rapido y bonito, asi aprendi yo. Suerte.

Pones un fragmento del código y es dificiil responderte porque no sabemos el contexto del programa.

Claro que se puede, todo se puede pero así es dificil sugerirte algo.

if(digitalRead(boton) == HIGH){ contador++; //Aumenta la variable en uno con cada paso que el botón este en HIGH }

Armagedon13 eso que has puesto es exactamente igual al código de jorgetesla.

Si boton esta en HIGH no aumenta en 1, aumenta hasta el desbordamiento.

El modo de evitarlo es mirar la transición 0 1 para lo cual requiere almacenar una variable con el estado anterior. Y comparar si boton esta en HIGH y si el estado anterior fue LOW. Solo ahi cambiara de a 1.

Si no importa que la ejecución se bloquee al esperar que el botón se libere, el método sería el siguiente:

while (digitalRead(boton));
// digitalRead debe ser antecedido por el ! en caso de estar configurado con pull-up

Si la ejecución no debe bloquearse, sigue la idea de surbyte

void first_configuration(void){
  int case_buttons;
    Serial.println("First Configuration :");
    lcd.print("First Conf:");
    lcd.clear();
    while(init_eeprom == 0){
      
          


         switch (case_variable){
          case 0:{ 
            //SET THE HOUR ACTUAL
            case_buttons = func_buttons();
            //Serial.println(case_buttons);
            lcd.print("Hour Config:");
            lcd.setCursor(0,1);
            lcd.print((String)my_hour + ":");
            lcd.setCursor(3,1);
            lcd.print((String)my_minute + ":");
            lcd.setCursor(5,1);
            lcd.print(my_second);
            lcd.setCursor(6,1);
            lcd.print("          ");

            switch (case_buttons){
              case btn_RIGHT:{
              break;
              }
              case btn_LEFT:{
              break;
              }
              case btn_UP:{
              break;
              }
              case btn_DOWN:{
              break;
              }
              case btn_SELECT:{
                x++;
                Serial.print(" X es igual a: ");
                Serial.println(x);
                if (x==1){
                  count_case0++;
                }
               Serial.println(count_case0);
               //x=0;
              break;
              
              }
              case btn_NONE:{
                x=0; //Controller the counter.
              break;
              }
              //x=0;
            }
            
            //rtc.setTime(my_hour, my_minute, my_second);     // Set the time to 12:00:00 (24hr format) (hour:minutes:Seconds)
            break;
            
          }
          case 1:{
            //SET THE DATA ACTUAL
            break;
          }
          case 2:{
            //SET # OF VALVULES AND THE HOY OF WORK
            break;
          }
         }//FIN CASE_VARIABLE


             


     
  }
}
int func_buttons(){
   adc_key_in = analogRead(0);       //read the select button

     if (adc_key_in > 1000)  return btn_NONE;  // return 5
  
     if (adc_key_in < 50)    return btn_RIGHT; // return 0
     if (adc_key_in < 150 )   return btn_UP;// return 1
     if (adc_key_in < 300)   return btn_DOWN;    // return 2
     if (adc_key_in < 450)   return btn_LEFT;  // return 3
     if (adc_key_in < 650)   return btn_SELECT;  // return 4  

       return btn_NONE;
}

esa es la funcion, estoy leyendo un boton con divisirores analogicos , todo lo leo por un canal A0 de ahi hago los casos que me devuelve la lectura analogica y de ahi me voy a los casos, ya logre controlar el conteo como se puede ver en el case “SELECT”