Pulsanti lenti a far avanzare il led

gtanix:
ti chiedo un attimo di soffermarti sulla questione led per pulsanti, se analizzi bene la loop e la funzione in basso, tu che sei di sicuro piu esperto mi saprai correggere.

Sto al lavoro quindi non è che possa studiarmi molto il codice, però intanto vedo questo:

const byte LEDperPULSANTI [P] [LperP] = { 23,24,25,26};

Tu stai definendo un array di byte (e fin qui ok), ma non ho capito perché hai messo 2 indici (P e LperP), ed in base a questo, perché hai messo solo 4 valori? Se P vale 4 ed anche LperP vale 4, dovresti avere 16 (4x4) elementi. Se i led sono solamente uno per pulsante, leva "LperP" e lascia solo il primo indice:

const byte LEDperPULSANTI [P] = { 23,24,25,26};

Ora passiamo alla funzione "Ledperpulsanti".

In sostanza dovrebbe aggiornare lo stato dei LED dei pulsanti in base ai pulsanti stessi, esatto? Per cui correggendo l'array LEDperPULSANTI come sopra, dovrebbe ora funzionare.

Ma dato che hai già una porzione di codice dove verifica se un pulsante sia premuto o meno, perché non metti lì l'accensione di quei led? Tra l'altro nei commenti leggo cose che non capisco (es. "spengo il led (sicuramente acceso) presente sotto il pulsante i, certamente premuto" :o ) ma tralascio.

Ad esempio nel loop() farei (per ora ignoro totalmente cosa fai con "puntatori[]" e relativa logica ma dò per scontato che vada bene):

  for (byte i = 0; i < P; i++)
  {
    if (digitalRead (PULSANTI [i]))
    {
      digitalWrite (LEDperPULSANTI[i], HIGH); // aggiunta accensione led del pulsante
      digitalWrite (LED [i][puntatori[i]], LOW);
      puntatori [i]++;//Alzo di 1 il puntatore
      if (puntatori [i] == L)
        puntatori [i] = 0;
      digitalWrite (LED [i][puntatori[i]], HIGH);
      delay (ABBASTANZA);
    }
    else  // aggiunto l'else per spegnere il led del pulsante
      digitalWrite (LEDperPULSANTI[i], LOW);
  }
  //Ledperpulsanti; questo non serve più

Per finire, qualche altro consiglio diciamo più che altro "stilistico", che quindi puoi accettare o meno visto che sono più che altro "convenzioni", ma penso siano utili per cercare sempre di fare un codice più leggibile, che significa anche rendere a te (e non solo) più facile il debug.

Intanto con identificativi lunghi è preferibile usare la cosiddetta forma "cammellata" ossia con le sole iniziali maiuscole e, più che altro per convenzione, la prima lettera minuscola (es. non "LEDperPULSANTI" ma "ledPerPulsanti") e più immediatamente rappresentativi del loro scopo (es. non "T_acceso" e "T_spento", ma "tempoON" e "tempoOFF", una funzione che aggiorna i led dei pulsanti la chiamerei "aggiornaLedPulsanti", e l'array dove metto i pin corrispondenti ai led "ledPulsanti[]").

Le maiuscole si usano solo per le costanti (come hai fatto) ma anche queste dandogli un nome più significativo possibile anche se relativamente abbreviato (es. non solo "P" ma "TOT_PULSANTI", e, come detto, non "ABBASTANZA" ma "DEBOUNCE" o "RITARDO_TASTO" ad esempio).

Poi le quadre che contengono gli indici (lo stesso vale per le parentesi delle funzioni) meglio metterle sempre vicino al nome per evidenziare più facilmente subito che si tratta di un array o una funzione (es. non "pinMode (PULSANTI , INPUT)" ma "pinMode(PULSANTI*, INPUT)" lo stesso quando richiamo una funzione, es. non "Ledperpulsanti;" meglio "Ledperpulsanti();") .*