Cronometro "manuale ad orecchio" per led (o laser) a tempo di musica

Buongiorno a tutti, sono abbastanza nuovo del forum e non sono certo sia la sezione adatta, ma non ho trovato altri topic che parlavano di un progetto (e problema) strettamente simile al mio o che potessero risolvere i miei dubbi. Se ho sbagliato mi scuso in anticipo.

Il mio progetto ha questo scopo finale: far "cambiare" il led acceso a tempo di musica, ed il tempo lo do io (ad orecchio) usando un pulsante (premo il pulsante ad ogni battito della canzone per 2 o più volte, via via che premo il programma fa la media degli ultimi tempi fra una pressione e l' altra e continua a cambiare il led acceso all' infinito seguendo il tempo di questa media).

(Non penso influisca più di tanto ma sto usando un Arduino nano, non mi servono più pin di quelli che ci son su questo modello).

Per ora sto ancora finendo di programmare il cronometro, ma con questo codice (in teoria) già dovrebbe cambiare led ad ogni pressione del pulsante.

Purtroppo quando accendo l' Arduino ed inizia ad eseguire il programma si accende il primo led ( ledA ) e resta acceso qualsiasi azione io compia, e non capisco se è un errore di logica o se non ho scritto bene qualcosa (la compilazione va sempre a buon fine, e dal lato hardware/collegamenti funziona tutto testando con altri sketch).

(Sto pensando adesso di cambiare metodo per il cronometro e di usare i millis() al posto di contare le "int a", ma non mi sembra quello il problema del mio programma. Comunque appena ho tempo farò una prova anche in quel modo).

Il mio codice attuale è questo, se vi va potete dargli un' occhiata o consigliarmi qualche modo migliore per arrivare a quel che vorrei costruire;

int ledA = 8; /* Led n.1 */
int ledB = 9; /* Led n.2 */
int ledS =10; /* Led n.3, giusto come spia */
int bottoneA = 11; /* Pulsante n.1 (a "clik") */
int p = 0; /* "Stato" del pulsante */
unsigned int a = 0; /* Vorrei che si aggiungesse +1 ad ogni centesimo di secondo secondo */

/* Abbreviazioni */

/* Le ho impostate così perchè se in futuro volessi aggiungere altri 2 led mi basterebbe
cambiare il nome qui nelle variabili piuttoto che cercarle in giro per tutto il codice*/

int LSS = ledS;
int LAA = ledA;
int LBB = ledB;
int LAC = ledA; /* Se aggiungerò un int ledC in futuro, mi basterà modificare questa variabile in "int LAC = ledC" */
int LAD = ledB; /* Se aggiungerò un int ledD in futuro, mi basterà modificare questa variabile in "int LAD = ledD" */
int BA = bottoneA; /* Per non stare sempre a scrivere bottoneA */
int DL = 10; /* Valore delay = 1/100 di secondo, ma mi basterebbe una precisione di 1/10 di secondo */

/*
Queste mi serviranno in sviluppi futuri per programmare sto maledetto cronometro
*/

int q; /*(il tempo dalla prima alla seconda pressione del pulsante)*/
int w; /*(il tempo dalla prima alla terza pressione del pulsante)*/
int e; /*(il tempo dalla prima alla quarta pressione del pulsante)*/
int r = w - q; /*(il tempo fra la seconda e la terza pressione del pulsante*/
int t = e - w; /*(il tempo fra la terza e la quarda pressione del pulsante*/
int y = (q + r)/2; /*(la media fra le prime 3 pressioni (0,q,r)*/
int x = (q + r + t)/2; /*(la media fra le 4 pressioni (0,q,r,t)*/


void setup() {
  pinMode (ledA, OUTPUT);
  pinMode (ledB, OUTPUT);
  pinMode (ledS, OUTPUT);
  pinMode (bottoneA, INPUT);
}

void loop() {
  
  if (p == 0 && digitalRead (BA) == LOW) {
    digitalWrite (LSS, HIGH); /* Giusto per farmi sapere che l' arduino è pronto dopo l' accensione*/
  }
  
  if (p == 0 && digitalRead (BA) == HIGH) { /* Appena premo il pulsante la prima volta, p da 0 diventa 1*/
    digitalWrite (LSS, LOW); /* si spenge la spia ledS */
    p = 1; /* Qui dovrei cambiare la variabile p per far sapere in futuro che ho premuto il pulsante */
    a++;
    delay(DL);
  }

   if (p == 1 && digitalRead (BA) == LOW) { /* Appena rilascio il pulsante la p da 1 diventa 2 */
    p = 2;
    a++;
    delay(DL);
   }
   
  if (p = 1 && digitalRead (BA) == HIGH) { /* Questo è per il tempo che mi ci vuole per levare il dito dal pulsante */
    a++; /* La a continua a contare anche se io sto ancora premendo il pulsante*/
    delay(DL);
  }

  if (p = 2 && digitalRead (BA) == HIGH) { /* Idem al primo passaggio, ma con l' incremento della p */
    p = 3;
    q = a; /* per fissare quanto tempo è trascorso fra la prima e la seconda pressione del pulsante */
    a++;
    delay(DL);
  }
  
  if (p = 2 && digitalRead (BA) == LOW) { /* continuano i passaggi precedenti fino alla quarta pressione del pulsante*/
   a++;
   delay(DL);
  }

  if (p == 3 && digitalRead (BA) == LOW) { /* p = 3 ed il pulsante è LOW, p = 4 */
    p = 4;
    a++;
    delay(DL);
   }

  if (p == 3 && digitalRead (BA) == HIGH) {/* p = 3 e l' interruttore è HIGH, p = 3 */
    a++;
    delay(DL);
  }

  if (p == 4 && digitalRead (BA) == HIGH) {/* p = 4 ed il pulsante è stato premuto, p = 5 */
    p = 5;
    w = a; /* Per fissare quanto tempo è trascorso fra la prima e la terza pressione del pulsante */
    a++;
    delay(DL);
  }

  if (p == 4 && digitalRead (BA) == LOW) {/* p = 4 e l' interruttore è LOW, p = 4 */
    a++;
    delay(DL);
  }

  if (p == 5 && digitalRead (BA) == LOW) {/* p = 5 ed il pulsante è LOW, p = 6 */
    p = 6;
    a++;
    delay(DL);
  }

  if (p == 5 && digitalRead (BA) == HIGH) {/* p = 5 e l' interruttore è HIGH, p = 5 */
    a++;
    delay(DL);
  }

    if (p == 6 && digitalRead (BA) == HIGH) {/* p = 6 ed il pulsante è stato premuto, p = 7 */
    p = 7;
    e = a; /* Per fissare quanto tempo è trascorso fra la prima e la quarta pressione del pulsante */
    a++;
    delay(DL);
  }

  if (p == 6 && digitalRead (BA) == LOW) {/* p = 6 e l' interruttore è HIGH, p = 6 */
    a++;
    delay(DL);
  }

  if (p == 7 && digitalRead (BA) == LOW) {/* p = 6 ed il pulsante è LOW, p = 8 */
    p = 8; /* Per ora finisco a 4 pressioni, quando risolverò il problema penserò a finire il cronometro */
    a++;
    delay(DL);
  }

  if (p == 7 && digitalRead (BA) == HIGH) {/* p = 7 e l' interruttore è HIGH, p = 7 */
    a++;
    delay(DL);
  }
  
/* Nonostante abbia inserito i successivi 2 if di "diagnostica",
nella pratica poi non cambia il risultato: resta sempre acceso LedA ( LAA)*/

if (p == 8 && digitalRead (BA) == LOW) {
    digitalWrite (LAA, LOW); /* Per ora finisco così*/
    digitalWrite (LBB, LOW);
  }

  if (p == 8 && digitalRead (BA) == HIGH) {
    digitalWrite (LAA, HIGH);
    digitalWrite (LBB, HIGH);
  }



  /* varie accensioni dei led:
  (prima pressione si accende ledA,
   seconda pressione si accende ledB e si spegne ledA
   terza pressione si riaccende ledA e si spegne ledB
   e così via per adesso che provo con 2 led... */

  if (p == 1 || p == 2) {
    digitalWrite (LAD, LOW); /* LAD (=b se ci son solo 2 led), LOW*/
    digitalWrite (LAA, HIGH); /* LAA (=a), HIGH*/
  }

  if (p == 3 || p == 4) {
    digitalWrite (LAA, LOW); /* LAA (=a), LOW*/
    digitalWrite (LBB, HIGH); /* LBB (=b), HIGH*/
  }

  if (p == 5 || p == 6) {
    digitalWrite (LBB, LOW); /* LBB (=b), LOW*/
    digitalWrite (LAC, HIGH); /* LAC (=a se ci son solo 2 led), HIGH*/
  }

  if (p == 7 || p == 8) {
    digitalWrite (LAC, LOW); /* LAC (=a se ci son solo 2 led), LOW*/
    digitalWrite (LAD, HIGH); /* LAD (=b se ci son solo 2 led), HIGH*/
  }

}

(Perdonatemi se il codice può sembrare lungo, ma per ora è quello che ho potuto fare con le mie poche conoscenze. In realtà è alquanto semplice. Non ho trovato altri modi migliori ed efficaci per programmare un cronometro, e non so ancora come farò a cambiare il led con il tempo della media... ci penserò più avanti se risolvo questo problema, altrimenti è inutile se devo cambiare programma).