Forma sencilla de cortar un loop

Hola, necesitaría una ayuda con un código muy sencillo.

Antes que nada comentar que hace una semana no sabía lo que era un arduino ni había soldado un pin en la vida pero vi un tutorial aparentemente sencillo para construir una botonera super económica tipo joystick y me lancé y la verdad es que me ha quedado genial cuesta creer lo bien que luce lo bien que va y lo baratos que me han costado los materiales.

Tiene 3 botones físicos pero solamente 2 sirven para asignar funciones, el otro es para cambiar de "capa".

El Arduino se comporta como un joystick de 8 botones y usando 2 leds me muevo por 4 capas con 2 botones en cada. (0-0/1-0/0-1/1-1)

Y hasta aquí todo bien y gracias al comando "delay();" puedo cambiar de capas sin problemas de doble pulsación, es una botonera totalmente funcional que va estupenda pero pero me gustaría evitar que si dejo el botón de capa presionado se reproduzca el loop infinitamente, es decir que solo cambie una vez de capa por cada pulsación.

He estado buscando como resolverlo y he intentado varias formas pero no doy con la tecla.

Este es el código que uso ahora:

#include <Joystick.h>

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,JOYSTICK_TYPE_GAMEPAD,
  8, 0,                  // Button Count, Hat Switch Count
  false, false, false,   // No X, Y, Z Axis
  false, false, false,   // No Rx, Ry, or Rz
  false, false,          // No rudder or throttle
  false, false, false);  // No accelerator, brake, or steering

int counter = 0;
int shift = 7;

void setup() {
  // Initialize Button Pins
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  // Initialize Joystick Library
  Joystick.begin();
  }

void loop(){
  int switchVal = digitalRead(shift);
  if (switchVal == LOW){
    delay(150);
    counter ++;
    if (counter == 4){
    counter = 0;
    }
  }
  switch (counter){
  case 0:
    Serial.println("1");
    digitalWrite(10,HIGH);
    digitalWrite(11,HIGH);
    Joystick.setButton(2,LOW);
    Joystick.setButton(3,LOW);
    Joystick.setButton(4,LOW);
    Joystick.setButton(5,LOW);
    Joystick.setButton(6,LOW);
    Joystick.setButton(7,LOW);
    Joystick.setButton(0, !digitalRead(8));
    Joystick.setButton(1, !digitalRead(9));
    break;
  case 1:
    Serial.println("2");
    digitalWrite(10,LOW);
    digitalWrite(11,HIGH);
    Joystick.setButton(4,LOW);
    Joystick.setButton(5,LOW);
    Joystick.setButton(6,LOW);
    Joystick.setButton(7,LOW);
    Joystick.setButton(0,LOW);
    Joystick.setButton(1,LOW);
    Joystick.setButton(2, !digitalRead(10));
    Joystick.setButton(3, !digitalRead(16));
    break;
  case 2:
    Serial.println("3");
    digitalWrite(10,HIGH);
    digitalWrite(11,LOW);
    Joystick.setButton(0,LOW);
    Joystick.setButton(1,LOW);
    Joystick.setButton(2,LOW);
    Joystick.setButton(3,LOW);
    Joystick.setButton(6,LOW);
    Joystick.setButton(7,LOW);
    Joystick.setButton(4, !digitalRead(10));
    Joystick.setButton(5, !digitalRead(16));
    break;
  case 3:
    Serial.println("4");
    digitalWrite(10,LOW);
    digitalWrite(11,LOW);
    Joystick.setButton(0,LOW);
    Joystick.setButton(1,LOW);
    Joystick.setButton(2,LOW);
    Joystick.setButton(3,LOW);
    Joystick.setButton(4,LOW);
    Joystick.setButton(5,LOW);
    Joystick.setButton(6, !digitalRead(10));
    Joystick.setButton(7, !digitalRead(16));
    break;
  }
}

Agradecería mucho algún consejo, gracias.

Hola, buen dia, bienvenido, y que bueno que te leiste las normas del foro.
En cuanto a tu pregunta, solo detecta el cambio de flanco:
mira en los comentarios, los cambios que hice a tu codigo

#include <Joystick.h>

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,JOYSTICK_TYPE_GAMEPAD,
  8, 0,                  // Button Count, Hat Switch Count
  false, false, false,   // No X, Y, Z Axis
  false, false, false,   // No Rx, Ry, or Rz
  false, false,          // No rudder or throttle
  false, false, false);  // No accelerator, brake, or steering

int counter = 0;
const byte shift = 7;
//agrega estas 2 variables
unsigned long db; //para antirrebote
bool swAnt; //guarda el valor anterior del pulsador

void setup() {
  // Initialize Button Pins
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  // Initialize Joystick Library
  Joystick.begin();
  }

void loop(){
  bool switchVal = digitalRead(shift);
 //cambia esta linea:  if (switchVal == LOW){ // por esta:
    if(!switchVal && swAnt && millis()- db >= 150){ //detecta el cambio de flanco usando millis como antirrebote 
    //delay(150); los delay no son buenos
    counter ++;
    if (counter == 4){
    counter = 0;
    }
        db=millis();
  }
    swAnt=switchVal;
    
  //De aquí hasta el final queda todo igual

Solucionado!! un millón de gracias amigo :slight_smile: