Hacer un incremento con un pulsador.

Hola, quiero hacer 3 modos de parpadeo de un led, y me gustaría que cada vez que le doy a un pulsador se incremente una variable y con eso hacer cada CASE. Lo que pasa que ando algo liado para hacer el incremento, y que cuando sea igual a 4 se vuelva a estado 1. Muchas gracias.

[tt]int LED = 13 ;
      int boton = 6;
      int i=1;
      
 
     void setup()
          {
               pinMode( LED, OUTPUT) ; // LED como salida
               pinMode( boton  , INPUT) ;            //botón  como entrada
         
               
              
          
          }
          void loop()
          {
          
          if (digitalRead(boton)==HIGH){
          i++;
          
          }
          


          switch(i){
              case 1: 
                 digitalWrite(13 , HIGH); // Enciende el LED
              delay(1000); // Esperar un segundo
              digitalWrite(13 , LOW); // Apagar el LED
              delay(1000); // Esperar otro segundo
              break;
              
              case 2: 
                 digitalWrite(13 , HIGH); // Enciende el LED
              delay(200); // Esperar un segundo
              digitalWrite(13 , LOW); // Apagar el LED
              delay(200); // Esperar otro segundo
              break;
              
              case 3: 
                 digitalWrite(13 , HIGH); // Enciende el LED
              delay(500); // Esperar un segundo
              digitalWrite(13 , LOW); // Apagar el LED
              delay(1000); // Esperar otro segundo
              break;
          }
         
                     }

[/tt]

Cuando presiones el contador i crecerá como loco.

// define estado y estadoAnt como globales
bool estado, estadoAnt;

void loop() {

     estado = digitalRead(boton);
       if (estado == HIGH && estadoAnt == LOW){
        i++;
     }
        estadoAnt = estado; 
        // sigue con tu código

Por los rebotes no? Tengo que hacer un sistema antirebotes o una programación?

Gracias.

Prueba lo que te sugiero y me dices si funciona o no?

surbyte:
Cuando presiones el contador i crecerá como loco.

// define estado y estadoAnt como globales

bool estado, estadoAnt;

void loop() {

estado = digitalRead(boton);
      if (estado == HIGH && estadoAnt == LOW){
        i++;
    }
        estadoAnt = estado;
        // sigue con tu código

Esto es una respuesta… Pero no se a que pregunta.

En la pregunta que concierne a nuestro amigo neoff sería añadir

If (i==5) i=1;

Justo después de i++

No tendrás problemas con los rebotes por que tu código incluye retrasos muy largos, lo que si que es verdad es que tendrás que mantener pulsado el botón cierto tiempo hasta que acabe la secuencia actual para que sea leído como un 1 y se incremente i

Para solucionar eso deberías estudiar el ejemplo blinkwhitout delay o quizas utilizaron pulsador asociado a una interrupción externa

En estos casos si habría que tener en cuenta los rebotes

Para mi era mas importante ver que cuando presionara el pulsador, estaría incrementándose el contador completando el ciclo. Ahora conla modificación que sugerí, lo hara solo en cada transición 0 a 1.

Respecto de la pregunta con poner default: i = 0; al final del switch case, resolvemos el problema.
pero aun asi, si no se frenaba el contador, lo haría a toda velocidad.