Problema al contar regresivamente el número de pulsaciones de un botón

Hola! Desde hace 2 días estoy aprendiendo Arduino. En este momento estoy intentando hacer un programa que cuente el número de pulsaciones al presionar un botón y que al llegar a 5 empiece a contar regresivamente. El código que hice cuenta hasta 5 sin ningún problema, pero al llegar a 5 sólo se devuelve a 4 y empieza a oscilar entre 5 y 4. ¿Qué estará faltando? De antemano muchas gracias.

Este es el código:

int buttonPushCounter = 0;
int buttonState = 1;
int lastButtonState = 1;

void setup(){
Serial.begin(9600);
digitalWrite(11,HIGH);//activa el resistor del pin 11
}

void loop(){
buttonState = digitalRead(11);

if (buttonState != lastButtonState) {
if (buttonState == LOW) {
buttonPushCounter++;
}
}
lastButtonState = buttonState;
Serial.println(buttonPushCounter);

if (buttonPushCounter==5) {
if (buttonState == HIGH) {
buttonPushCounter--;
}

} }

Primero edita el código usando etiquetas de acuerdo al privado que te envío con un guía para hacerlo. Basicamente las normas del foro y como entrar en modo edición.

El problema de tu código es que el control de ascender descender esta claro para incrementar pero luego se confunde, porque tu cambio inicial dice

 if (buttonState != lastButtonState) {
     if (buttonState == LOW) {
       buttonPushCounter++;
           }
    }

cada vez que cambie el botón y este en LOW sube el contador

y luego cuando llega a 5 no solo le dices eso sino tque también le pides que

  if (buttonPushCounter==5) {
     if (buttonState == HIGH) {
       buttonPushCounter--;       
       }

Ahh llegaste a 5, entonces ahora como esas en HIGH vales 1 menos o sea 4…

luego presionas de nuevo o sea LOW y sube de nuevo a 5… y lo sueltas y baja a 4… y asi a la velocidad de tu cambio.

Prueba esto

int buttonPushCounter = 0; 

bool buttonState;       
bool lastButtonState   = false;  
bool flag = true;    // true incrementa y false decrementa


void setup(){
  Serial.begin(9600);
  digitalWrite(11,HIGH);//activa el resistor del pin 11
}

void loop(){

  buttonState = digitalRead(11);
  if (buttonState && !lastButtonState) {
      if (flag) {
          buttonPushCounter++; // incremento porque flag esta en true
          if (buttonPushCounter >= 5)
             flag = false;      // cambio a decrementar
      }
      else {
          buttonPushCounter--;
          if (buttonPushCounter <= 0)
              flag = false;     // cambio a incrementar
      }
  }
  lastButtonState = buttonState;
  Serial.println(buttonPushCounter);
}

Ahora el código funciona de otra manera. Tenemos una variable flag que lleva el control del contador ascendente/descendente. Si esta en true sube/asciende y si esta en false/desciende.

El pulsador ahora tiene variables del tipo SI/NO o True/False o sea booleanas que cumplen la funcion igual que lo que tu usaste pero con menos uso de memoria. Ya que empiezas aprende a usar el tipo de variable para cada caso.
Luego aprovechando tu forma de detectar los cambios en lugar de ver cambios del pulsador ahora vemos flancos de 0 a 1. 0 con el esado anterior indicado como !lastButtonState y 1 con el estado actual buttonState leido con digitalRead(11)
Cada vez que se vea un flanco o sea una presion y aunque te quedes en LOW contará una vez.
Si el contador llega a 5, cambiamos el flag y al siguiente flanco… en lugar de pasar por el incremento ira por el decremento del contador.

Eso se logra porque tu variable de control es flag y dirige a donde y cuando comandar el contador.
Esa es la gran diferencia con tu código.

Tu hablas de un pulsador ? no comprendo esto:

void setup(){
   Serial.begin(9600);
   digitalWrite(11,HIGH);    //activa el resistor del pin 11
}

Si tienes el pulsador entre el pin 11 y GND deberia ser asi:

void setup(){
   Serial.begin(9600);
   pinMode(11, INPUT_PULLUP);
}