Consigli su programmazione '-.-

Quel codice non fa quello che ti serve, ma è una buona base da cui partire per ottenere il comportamento ricercato

Vero il contatore va avanti o indietro sempre, invece a te serve selezionare se il conteggio deve essere avanti o indietro ma questo deve essere eseguito una volta sola all'interno del ciclo del loop.

Serve modificare la variabile counterFlag che deve essere un intero con segno, se contiene -1 deve decrementare piecesCounter, se contiene 1 deve incrementare piecesCounter, se invece è 0 non fa nulla, per cui devi scrivere le if (counterFlag == -1) else if (counterFlag == 1) e dentro le if devi azzerare counterFlag.

qui c'è pure da modifcare qualcosa, se P2_BUTTON è stato premuto bisogna uscire dal ciclo for con break
oviamente anche l'altro for va modificato allo stesso modo.

for(uint8_t i = 0; i < BUTTON_TIMEOUT; i++) {
    if (!digitalRead(P2_BUTTON)  {                            //questo blocco, se premo P1 incrementa counterFlag
        counterFlag = INCREMENT;
        break;
    }
}

Le due if con il for dentro fanno questo, consideriamo solo la sequenza di P1 e P2.
if P1 è stato premuto entro nel ciclo for fino a che i non raggiunge BUTTON_TIMEOUT, se la raggiunge termina il ciclo senza fare nulla.
All'interno del ciclo viene testato P2, se premuto si imposta il counterFlag e termina il ciclo for con break;

Ciao.