Pulsanti lenti a far avanzare il led

gpb01:
Veramente l'idea ce l'ha molto chiara e te l'ha detta ... sei tu che non l'hai capita ... rileggi la sua risposta !

Guglielmo

Guglielmo alla fine ho risolto cosi'(devo fare un altra domanda pero su questo programma si deve chiudere questa e se ne fa un altra o continuiamo qua?):

#define P 4
#define L 4
#define ABBASTANZA 500
#define LperP 4
const byte LEDperPULSANTI [P] [LperP] = { 23,24,25,26};
const byte PULSANTI [P] = {2, 3, 4, 5};
const byte LED [P][L] =
{
  6, 7, 8, 9,
  10, 11, 12, 13,
  14, 15, 16, 17,
  19, 18, 21, 20
};
#define RELE 22
const byte PASSWORD [P] = {0, 1, 2, 0};
byte puntatori [P];
const byte T_acceso = 500;
const byte T_spento = 500;
boolean fatto = true;
byte stato_pwd;
unsigned long start;
void setup()
{
  for (byte i = 0; i < P; i++)
  {
    pinMode (PULSANTI [i], INPUT);//Leggo tutto l'array di pulsanti e lo setto input
  }
  for (byte i = 0; i < P; i++)
  {
    for (byte j = 0; j < L; j++)
    {
      pinMode (LED [i][j], OUTPUT);

    }
    digitalWrite (LED [i][0], HIGH);//Accendo il primo led di ogni fila pulsanti (gli array cominciano con 0
  }
}
//fine setup()
void loop()
{
  for (byte i = 0; i < P; i++)
  {
    if (digitalRead (PULSANTI [i]))
      //Qui lo posso usare direttamente senza passare per una variabile perché appunto mi serve subito
    {
      digitalWrite (LED [i][puntatori[i]], LOW);
      //Magata: spengo il led (sicuramente acceso)
      //presente sotto il pulsante i, certamente premuto,
      //nella posizione attuale presa da un array di posizioni, nella posizione il cui numero è ancora i
      puntatori [i]++;//Alzo di 1 il puntatore
      if (puntatori [i] == L)
      {
        puntatori [i] = 0;
      }
      digitalWrite (LED [i][puntatori[i]], HIGH);
      delay (ABBASTANZA);
    }
  }
  Ledperpulsanti;
  if (!confronto())
  {
    stato_pwd = 0;
  }
  if (confronto() && stato_pwd == 0 )
  {
    start = millis();
    stato_pwd = 1;
  }
  if (stato_pwd == 1 )
  {
    if ( millis() - start > 5000)
    {
      stato_pwd = 2;
    }
  }
  if (stato_pwd == 2 )
  {
    gioco_luci();
    stato_pwd = 3;
  }
}


void Lampeggiafila() {
  for (byte i = 0; i < L + 1; i++)
  {
    for (byte lucifinali = 0; lucifinali < L ; lucifinali++) {
      digitalWrite(LED[i][lucifinali], HIGH);
    }
    delay(1000);
    for (byte lucifinali = 0; lucifinali < L ; lucifinali++) {
      digitalWrite(LED[i][lucifinali], LOW);
    }
  }
}

void Setta(byte stato ) {
  for (byte i = 0; i < L + 1; i++)
  {
    for (byte lucispente = 0; lucispente < L + 1; lucispente++) {
      digitalWrite(LED[i][lucispente], stato);
    }
  }
}



void Lampeggiatutti() {

  for (byte a = 0; a < 4; a++)
  {
    Setta(1);
    delay (T_acceso);
    Setta(0);
    delay(T_spento);
  }

}

byte confronto ()
{
  boolean uguale = true;
  for (byte i = 0; i < P; i++)
  {
    if (PASSWORD [i] != puntatori [i])
    {
      uguale = false;
    }
  }
  return (uguale);
}



void gioco_luci()
{
  Setta(0);
  Lampeggiafila();
  Setta(0);
  Lampeggiatutti();
  Setta(0);
  digitalWrite (RELE, !digitalRead (RELE));
  fatto = true;
}





void Ledperpulsanti()
{
  for (byte i = 0; i < P; i++)
  {
    digitalWrite (LEDperPULSANTI[i], digitalRead (PULSANTI[i]));
  }
}