Proyecto simplón: Tira de leds y juego de luces.

Buenas estoy haciendo un proyecto bastante simple pero que tenía ganas de hacerlo. Consiste en una tira de unos cuantos leds que harán varios juegos de luces.

Par cambiar de un modo a otro simplemente hay que presionar un botón... pero no va del todo fino. Tampoco estoy seguro de que el botón funcione correctamente, ahora mismo lo tengo en la protoboard. Pero me surgió una duda respecto al código. Se supone que al pulsarlo en cualquier momento debería cambiar, pero no lo hace. Ya he dicho que no se si es por problemas "mecánicos" o por código.

Aquí os dejo mi código:

salu2 y gracias

int state=1;
int x=5, y=5;

void setup(){
  pinMode(7, INPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
}

void loop(){
  
  if(state==1 && digitalRead(7))
  {
    delay(100);
    state=2;
  }
  else if(state==2 && digitalRead(7))
  {
    delay(100);
    state=3;
  }
  else if(state==3 && digitalRead(7))
  {
    delay(100);
    state=4;
  }
  else if(state==4 && digitalRead(7))
  {
    delay(100);
    state=5;
  }
  else if(state==5 && digitalRead(7))
  {
    delay(100);
    state=6;
  }
  else if(state==6 && digitalRead(7))
  {
    delay(100);
    state=7;
  }
  if(state==7 && digitalRead(7))
  {
    delay(100);
    state=8;
  }
  if(state==8 && digitalRead(7))
  {
    delay(100);
    state=1;
  }
  
  
  switch(state)
  {
    case 1:
          
          for(int b=8; b<=14; b++)
          {
            digitalWrite(b, HIGH);
          }
          
          break;
          
    case 2: 
          
          for(int i=8; i<=14; i++) {
            
            digitalWrite(i, HIGH);
            digitalWrite(i-1, LOW);
            delay(100);
          }
          break;
          
    case 3:
           
             for(int j=8; j<=14; j++) {
    
                if(j%2==0)
                {
                  digitalWrite(9, LOW);
                  digitalWrite(11, LOW);
                  digitalWrite(13, LOW);
                  digitalWrite(8, HIGH);
                  digitalWrite(10, HIGH);
                  digitalWrite(12, HIGH);
                  delay(500);
                }
                else
                {
                  digitalWrite(8, LOW);
                  digitalWrite(10, LOW);
                  digitalWrite(12, LOW);
                  digitalWrite(9, HIGH);
                  digitalWrite(11, HIGH);
                  digitalWrite(13, HIGH);
                  delay(500);
                }
            }
            break;
    
     case 4: 
     
           for(int k=13; k>7; k--)
           {
             digitalWrite(k, HIGH);
             delay(100);
           }
           for(int h=8; h<14; h++)
           {
             digitalWrite(h, LOW);
             delay(100);
           }
           break;
           
     case 5:
     
           for(int l=13; l>7; l--)
           {
             digitalWrite(l, HIGH);
             delay(100);
           }
           for(int m=13; m>7; m--)
           {
             digitalWrite(m, LOW);
             delay(100);
           }
           break;
           
    case 6:
          
          for(int n=8; n<=14; n++)
          {
            if(n==13)
            {
              digitalWrite(12, LOW);
              digitalWrite(13, HIGH);
             
            }
            else
            {
            digitalWrite(n, HIGH);
            digitalWrite(n+1, HIGH);
            digitalWrite(n-1, LOW);
            delay(500);
            digitalRead(7);
            }
          }  
            break;
            
    case 7:
    x=5;
    y=5;
          for(int o=8; o<=14; o++)
          {
           
           
            
              digitalWrite(o, HIGH);
              digitalWrite(o+x, HIGH);
              delay(150);
          
            x=x-2;
          }
          
         for(int p=8; p<=14; p++)
         {
           
             digitalWrite(p, LOW);
             digitalWrite(p+y, LOW);
             delay(150);
       
           y=y-2;
         }
               
          break;
          
    case 8:
    
    x=random(8,14);
    
    digitalWrite(x, HIGH);
    delay(200);
    digitalWrite(x, LOW);
    delay(100);
    
    break;
          
  }
}

Saber si el pulsador va bien o no es fácil: compruebalo con un multímetro.

Para depurar errores en el código activa la comunicación serie y el final de cada loop haz que mande el valor de la variable state, así sabrás si cambia correctamente. Puede que el retardo que le des sea pequeño y te haga un rebote, 100ms de retardo a mi me parece poco, pero es cuestión de dedos rápidos.

Luego utiliza el mismo truco de la salida serie para cada uno de los case, aunque deberías repasarlos bien antes.