Problema porta seriale Mega impazzita

Buongiorno a tutti, siete la mia unica speranza poichè io non ci capisco niente.
Ho un progetto piuttosto complesso, dove ci sono ben 35 pulsanti e 35 relativi led. Questi pulsanti sono 17 su un arduino mega, e 18 su un altro arduino mega.
In pratica c’è un gioco che si compone di due parti.
Nella prima parte bisogna premere la combinazione giusta di pulsanti. Si passa poi ad una fase successiva in cui bisogna volta in volta premere tre pulsanti. Se questi tre pulsanti corrispondono ad una combinazione corretta (ci sono 4 combinazioni possibili), uno dei due arduino in base alla combinazione esegue una determinata cosa.
Ovviamente in tutto ciò gli arduino sono in costante comunicazione, attraverso le seriali 1 e 3 (la 0 è libera così posso leggere il monitor seriale).
Il problema gigante è questo: all’avvio della seconda parte, l’arduino che “gestisce”, senza che venga premuto niente, riceve due segnali sulla seriale, come se l’altro arduino avesse mandato segnale che due dei suoi pulsanti sono stati premuti. A volte invece funziona come deve e non legge nulla finchè non viene premuto un pulsante. Altre volte ancora, invece, legge continuamente, a ripetizione, finchè non viene riavviato. Preciso che non penso possa essere un “rimasuglio” della seriale della parte prima, perché tra l’ultimo messaggio seriale della parte 1 e il primo messaggio della parte 2 ci passano varie istruzioni e vari delay.
In tutto ciò ho controllato se per caso l’altro arduino sta eseguendo il comando “serial.write” ma non risulta. Non so proprio che pesci prendere.
In prove fatte con sketch più semplici, le seriali non danno problemi.
Non capisco se è un problema hardware o di programmazione, siccome per questo “gioco” ci sono una miriade di fili e non ho idea se qualche contatto traballante possa interferire con la seriale.
Io inoltre non so benissimo come funzioni la comunicazione seriale… è possibile che un messaggio spedito dal trasmettitore rimanga “in attesa” di essere letto per diversi secondi? O può essere letto solo nell’esatto momento in cui viene mandato?

Dipende.
Forse se metti i 2 sketch si può dire qualcosa di più preciso.

Certo, ve li metto… Mi dispiace perchè sono sketch un po’ impresentabili e confusionari… Sono frutto di unione di due sketch fatti da persone diverse, quindi con pin dichiarati due volte con nomi diversi, mille commentature, insomma un po’ un disastro… Purtoppo nessuno di noi è un esperto e siamo un po’ alle prime armi (seconde, dai :grin:)…Provo a metterveli lo stesso…

Questo è lo sketch più complesso perchè l’arduino è quello che nella seconda parte “controlla” tutti i pulsanti che vengono premuti e attua le conseguenze

#include <Tone.h>
Tone tone1;
Tone tone2;

int laser = 67;

int untastopremuto = 0;

int count = 0;

int a = 0;

int b = 0;

int conta = 0;

int x = 0;

int k = 0;

char *myStrings[] = {"chi", "cosa", "volere", "tu", "dove", "umani", "noi", "essere", "nonsense", "ripeti"};

int LEDArray[] = {22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 68 } ;

int fineditutto = 0;

int LUCI = 66;

int pintattile = 3;

int pinserratura = 4;

int pinarduinosonar = 6;
int pinraspberry = 7;
int pinrelayampli = 8;

int pindiamantetolto = 5;
int EBBASTACAZZO;
int pulsante1 = 23;
int led1 = 22;
int pulsante2 = 25;
int led2 = 24;
int pulsante3 = 27;
int led3 = 26;
int pulsante4 = 29;
int led4 = 28;
int pulsante5 = 31;
int led5 = 30;
int pulsante6 = 33;
int led6 = 32;
int pulsante7 = 35;
int led7 = 34;
int pulsante8 = 37;
int led8 = 36;
int pulsante9 = 39;
int led9 = 38;
int pulsante10 = 41;
int led10 = 40;
int pulsante11 = 43;
int led11 = 42;
int pulsante12 = 45;
int led12 = 44;
int pulsante13 = 47;
int led13 = 46;
int pulsante14 = 49;
int led14 = 48;
int pulsante15 = 51;
int led15 = 50;
int pulsante16 = 53;
int led16 = 52;
int pulsante17 = 69; //69 sarebbe il 15 ma usato come digitale
int led17 = 68;


int valpulsante1;
int valpulsante2;
int valpulsante3;
int valpulsante4;
int valpulsante5;
int valpulsante6;
int valpulsante7;
int valpulsante8;
int valpulsante9;
int valpulsante10;
int valpulsante11;
int valpulsante12;
int valpulsante13;
int valpulsante14;
int valpulsante15;
int valpulsante16;
int valpulsante17;


int mem1pulsante1;
int mem1pulsante2;
int mem1pulsante3;
int mem1pulsante4;
int mem1pulsante5;
int mem1pulsante6;
int mem1pulsante7;
int mem1pulsante8;
int mem1pulsante9;
int mem1pulsante10;
int mem1pulsante11;
int mem1pulsante12;
int mem1pulsante13;
int mem1pulsante14;
int mem1pulsante15;
int mem1pulsante16;
int mem1pulsante17;


int mem2pulsante1;
int mem2pulsante2;
int mem2pulsante3;
int mem2pulsante4;
int mem2pulsante5;
int mem2pulsante6;
int mem2pulsante7;
int mem2pulsante8;
int mem2pulsante9;
int mem2pulsante10;
int mem2pulsante11;
int mem2pulsante12;
int mem2pulsante13;
int mem2pulsante14;
int mem2pulsante15;
int mem2pulsante16;
int mem2pulsante17;

int BUTTONArray[] = {23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 69 };
int combinazionegiusta;

int fine;

int sendok; //emettitore

//char appoggio[10]; //emettitore


//char stringa1[20];//ricevitore

int reciveok;//ricevitore

int iniziacomunicazione;

int finaleextra;



void setup() {

  // put your setup code here, to run once:
  tone1.begin(54);//asseorizz, filo blu, ring 2
  tone2.begin(55);//assevert, filo marrone, tip
  pinMode (laser, OUTPUT);

  for (count = 0; count < 17 ; count++) {
    pinMode(BUTTONArray[count], INPUT);// tutti i pulsanti impostati come input
    pinMode(LEDArray[count], OUTPUT);// tutti i led impostati come output
  }
  pinMode (pintattile, INPUT_PULLUP);
  pinMode (pinserratura, OUTPUT); // chiavistello semi
  pinMode (pinarduinosonar, OUTPUT); // avvia arduino dei sonar
  pinMode (pinraspberry, OUTPUT);
  pinMode (pindiamantetolto, INPUT_PULLUP);
  pinMode (pinrelayampli, OUTPUT);

  pinMode(pulsante1, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(pulsante2, INPUT);
  pinMode(led2, OUTPUT);
  pinMode(pulsante3, INPUT);
  pinMode(led3, OUTPUT);
  pinMode(pulsante4, INPUT);
  pinMode(led4, OUTPUT);
  pinMode(pulsante5, INPUT);
  pinMode(led5, OUTPUT);
  pinMode(pulsante6, INPUT);
  pinMode(led6, OUTPUT);
  pinMode(pulsante7, INPUT);
  pinMode(led7, OUTPUT);
  pinMode(pulsante8, INPUT);
  pinMode(led8, OUTPUT);
  pinMode(pulsante9, INPUT);
  pinMode(led9, OUTPUT);
  pinMode(pulsante10, INPUT);
  pinMode(led10, OUTPUT);
  pinMode(pulsante11, INPUT);
  pinMode(led11, OUTPUT);
  pinMode(pulsante12, INPUT);
  pinMode(led12, OUTPUT);
  pinMode(pulsante13, INPUT);
  pinMode(led13, OUTPUT);
  pinMode(pulsante14, INPUT);
  pinMode(led14, OUTPUT);
  pinMode(pulsante15, INPUT);
  pinMode(led15, OUTPUT);
  pinMode(pulsante16, INPUT);
  pinMode(pulsante17, INPUT);
  pinMode(led16, OUTPUT);
  pinMode(led17, OUTPUT);


  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  digitalWrite(led5, LOW);
  digitalWrite(led6, LOW);
  digitalWrite(led7, LOW);
  digitalWrite(led8, LOW);
  digitalWrite(led9, LOW);
  digitalWrite(led10, LOW);
  digitalWrite(led11, LOW);
  digitalWrite(led12, LOW);
  digitalWrite(led13, LOW);
  digitalWrite(led14, LOW);
  digitalWrite(led15, LOW);
  digitalWrite(led16, LOW);
  digitalWrite(led17, LOW);


  Serial.begin(9600);
  Serial1.begin(9600);//emettitore
  Serial3.begin(9600);//ricevitore

  combinazionegiusta = 0;

  fine = 0;

  sendok = 0;

  reciveok = 0;
  iniziacomunicazione = 0;
  finaleextra = 0;
  EBBASTACAZZO = 0;

}



void loop() {
  if (EBBASTACAZZO == 0) {//quando =1, l'arduino spegne tutto (a diamante tolto)
    if ((digitalRead(pintattile)) == LOW){

    Serial.println ("avvio");
    Serial1.write (4); //avvia anche l'altro arduino
    giocoluci1();

    //while (fineditutto == 0) {

    // put your main code here, to run repeatedly:
    while (iniziacomunicazione == 0)
    {
      //if (fine == 0) {

      leggipulsantifabio();


      if (mem1pulsante6 == 1 && mem1pulsante5 == 1 && mem1pulsante15 == 1 && mem1pulsante14 == 1 && mem1pulsante13 == 1 && mem1pulsante12 == 1 && mem1pulsante11 == 1 && mem1pulsante1 == 0 && mem1pulsante2 == 0 && mem1pulsante3 == 0 && mem1pulsante4 == 0 && mem1pulsante7 == 0 && mem1pulsante8 == 0 && mem1pulsante9 == 0 && mem1pulsante10 == 0 && mem1pulsante16 == 0 && mem1pulsante17 == 0) {

        sendok = 1;

        /*itoa(sendok, appoggio, 10);

          Serial1.write(appoggio, 10);*/
        Serial1.write( sendok);

        combinazionegiusta = 1;

      }

      else {

        sendok = 0;

        /*itoa(sendok, appoggio, 10);

          Serial1.write(appoggio, 10);*/
        Serial1.write(sendok);

        combinazionegiusta = 0;

      }

      /*Serial2.readBytes(stringa1, 20);

          reciveok = atoi(stringa1);*/

      reciveok = Serial3.read();


      if (combinazionegiusta == 1 && reciveok == 1 && mem1pulsante11 == 1 && mem1pulsante12 == 1 && mem1pulsante13 == 1 && mem1pulsante14 == 1 && mem1pulsante15 == 1 && mem1pulsante5 == 1 && mem1pulsante6 == 1 && mem1pulsante1 == 0 && mem1pulsante2 == 0 && mem1pulsante3 == 0 && mem1pulsante4 == 0  && mem1pulsante7 == 0 && mem1pulsante8 == 0 && mem1pulsante9 == 0 && mem1pulsante10 == 0 && mem1pulsante16 == 0 && mem1pulsante17 == 0) {

        /*itoa(sendok, appoggio, 10);

          Serial1.write(appoggio, 10);*/

        //Serial1.write(sendok);
        giocoluci2();

        //fine = 1;
        iniziacomunicazione = 1;

        digitalWrite (pinrelayampli, HIGH);
        for (count = 0; count < 17 ; count++) {
          digitalWrite (LEDArray[count], HIGH);


        }
        delay(1000);
        Serial.println ("chiusura blocco1");
      }
    }
    while (iniziacomunicazione == 1) {
// non aggiungere nessun delay qui!!!

 Serial.println ("sto per leggere i pulsanti");

      while (untastopremuto == 0) { // serve a non incrementare il controllo del pulsante premuto (a) se non è stato premuto di nuovo almeno un pulsante
        for (count = 0; count < 17  ; count++) {

          if ((digitalRead(BUTTONArray[count])) == HIGH) {
            digitalWrite (LEDArray[count], LOW);
            delay(200);
            digitalWrite (LEDArray[count], HIGH);
            if (count == 0) {
              a = 1; //chi, tasto 1
            }
            else if (count == 1) {
              a = 3; //cosa, tasto 2
            }
            else if (count == 2) {
              a = 6561; //nonsense
            }
            else if (count == 3) {
              a = 6561; //nonsense
            }
            else if (count == 4) {
              a = 9; //volere, tasto 5
            }
            else if (count == 5) {
              a = 6561; //nonsense
            }
            else if (count == 6) {
              a = 6561; //nonsense
            }
            else if (count == 7) {
              a = 6561; //nonsense
            }
            else if (count == 8) {
              a = 19683; //ripeti, tasto 9
            }
            else if (count == 9) {
              a = 6561; //nonsense
            }
            else if (count == 10) {
              a = 6561; //nonsense
            }
            else if (count == 11) {
              a = 6561; //nonsense
            }
            else if (count == 12) {
              a = 6561; //nonsense
            }
            else if (count == 13) {
              a = 6561; //nonsense
            }
            else if (count == 14) {
              a = 243; //umani, tasto 15
            }
            else if (count == 15) {
              a = 6561; //nonsense
            }
            else if (count == 16) {
              a = 6561; //nonsense
            }


            /*valori (potenze di 3): 3, 9, 27, 81, 243, 729,2187, 6561,19683*/

            Serial.println (count);

            delay (400);
            untastopremuto = 1;
          }
        }

        if (Serial1.available()) {
        

          b = Serial1.read();
          if (b == 0) {
            a = 6561; //nonsense
          }
          if (b == 1) { //tu
            a = 27;
          }
          if (b == 2) { // dove
            a = 81;
          }
          if (b == 3) { //noi
            a = 729;
          }
          if (b == 4) { //essere
            a = 2187;
          }
          if (b == 5) { //chi
            a = 1;
          }

          Serial.print ("b");
          Serial.println (b);
          untastopremuto = 1;
        }
      }


      untastopremuto = 0; // così si può ricevere un nuovo pulsante

  
      if (conta < 2) { //prima della terza parola
        conta++;
        x = x + a;
      }
      else {//terza parola
        x = x + a;
        if (x == (3 + 9 + 27)) //cosa volere tu
        {
          Serial.println ("noi volere energia");
          figure(193, 778); // noi: biscia orizzontale
          figure (502, 542);// volere:: quadratino piccolo
          figure (776, 310); //energia: doppio pesce verticale
          while (!(k == 1)) {
            for (count = 0; count < 17  ; count++) { 
           if ((digitalRead(BUTTONArray[count]) == HIGH)){
                digitalWrite (LEDArray[count], LOW);
              delay(200);
              digitalWrite (LEDArray[count], HIGH);
             if (count == 8) { //ripeti
              Serial.println ("ripeto");

                  delay(500);
                  figure(193, 778);
                  figure (502, 542);
                  figure (776, 310);
                  delay (250);
                }
                else {
                  k = 1;
                }

              }

            }
            if (Serial1.available()) {
              k = 1;
            }
          }
        }

        else if (x == (81 + 243 + 2187)) { //dove essere umani
          Serial.println("tizio deforme");
          digitalWrite(LUCI, HIGH);
          //fineditutto = 1;
          iniziacomunicazione = 2; // fa uscire dal ciclo while della comunicazione

        }
        else if (x == (81 + 729 + 2187)) { //dove noi essere
          Serial.println ("terra tempo diverso" );
          figure(35, 45); //angoli di rettangolo
          figure(303, 306); //mandorla rotante
          figure (310, 776); // doppio pesce orizz
          finaleextra = 1;

          while (!(k == 1)) {
            for (count = 0; count < 17  ; count++) {
              if ((digitalRead(BUTTONArray[count]) == HIGH)){
                digitalWrite (LEDArray[count], LOW);
              delay(200);
              digitalWrite (LEDArray[count], HIGH);
             if (count == 8) { //ripeti
               Serial.println ("ripeto");

                  delay(500);
                  figure(35, 45);
                  figure(303, 306);
                  figure (310, 776);
                  delay (250);
                }

                else {
                  k = 1;
                }

              }

            }
            if (Serial1.available()) {
              k = 1;
            }
          }
        }
        else if (x == (1 + 27 + 2187)) { //chi tu essere
          Serial.println("io sono dhsajhdsja0/guardiano?");
          figure(193, 778); // noi: biscia orizz
          figure(204, 108); //essere: uguale
          figure(159, 150); //guardiano: rettangolo sovrapposto
          while (!(k == 1)) {
            for (count = 0; count < 17  ; count++) {
              if ((digitalRead(BUTTONArray[count]) == HIGH)){
                digitalWrite (LEDArray[count], LOW);
              delay(200);
              digitalWrite (LEDArray[count], HIGH);
             if (count == 8) { //ripeti
               Serial.println ("ripeto");

                  delay(500);
                  figure(193, 778);
                  figure(204, 108);
                  figure(159, 150);
                  delay (250);
                }
                else {
                  k = 1;
                }

              }

            }
            if (Serial1.available()) {
              k = 1;
            }
          }
        }
        else if (x == (3 + 27 + 2187)) { //cosa tu essere
          Serial.println ("noi essere fhdjsfkdj/guardiano?");
          figure(193, 778);// biscia orizz
          figure(204, 108);
          figure(159, 150);
          while (!(k == 1)) {
            for (count = 0; count < 17  ; count++) {
              if ((digitalRead(BUTTONArray[count]) == HIGH)){
                digitalWrite (LEDArray[count], LOW);
              delay(200);
              digitalWrite (LEDArray[count], HIGH); 
                if (count == 8) { //ripeti
                   Serial.println ("ripeto");

                  delay(500);
                  figure(193, 778);
                  figure(204, 108);
                  figure(159, 150);
                  delay (250);
                }
                else {
                  k = 1;
                }

              }

            }
            if (Serial1.available()) {
              k = 1;
            }
          }
        }
        
        else {
          Serial.println ("io non capire1");
          figure(193, 778);
          figure(204, 404); // infinito
          figure(202, 272); //il più strano
          while (!(k == 1)) {
            for (count = 0; count < 17  ; count++) {
              if ((digitalRead(BUTTONArray[count]) == HIGH)) {
                digitalWrite (LEDArray[count], LOW);
                delay(200);
                digitalWrite (LEDArray[count], HIGH);
                if (count == 8) { //ripeti
                   Serial.println ("ripeto");
                  delay(500);
                  Serial.println ("io non capire2");
                  figure(193, 778);
                  figure(204, 404);
                  figure (202, 272);
                  delay (250);
                }
                else {
                  k = 1;
                }


              }
            }
            if (Serial1.available()) {
              k = 1;
            }
          }

        }
        conta = 0;
        x = 0;
        k = 0;
      }
    }

  // queste seguenti cose sono fuori dai cicli while della comunicazione 
  for (count = 0; count < 17 ; count++) {
    digitalWrite (LEDArray[count], LOW);

  }
  Serial1.write (3);
  digitalWrite(pinrelayampli, LOW);
  digitalWrite (pinserratura, HIGH);
  delay(400);
  digitalWrite (pinserratura, LOW);
  digitalWrite (pinarduinosonar, HIGH);
  delay(400);
  digitalWrite (pinarduinosonar, LOW);
  Serial.println ("serratura sbloccata e sonar attivati");
  digitalWrite (pinraspberry, HIGH);
  delay(400);
  digitalWrite (pinraspberry, LOW);
  Serial.println ("raspberry allertato comunicazione terminata");
  while (!((digitalRead(pindiamantetolto)) == LOW)) {} //sta in attesa a non fare niente finchè il diamante non viene tolto e il segnale diventa LOW)
  if (finaleextra == 1) { // manda a raspberry 3 segnali in 1 sec
    digitalWrite (pinraspberry, HIGH);
    delay(100);
    digitalWrite (pinraspberry, LOW);
    delay(200);
    digitalWrite (pinraspberry, HIGH);
    delay(100);
    digitalWrite (pinraspberry, LOW);
    delay(200);
    digitalWrite (pinraspberry, HIGH);
    delay(100);
    digitalWrite (pinraspberry, LOW);
    Serial.println ("allertato raspberry finale extra");
  }
  else {
    digitalWrite (pinraspberry, HIGH);
    delay(200);
    digitalWrite (pinraspberry, LOW);
    delay(200);
    digitalWrite (pinraspberry, HIGH);
    delay(200);
    digitalWrite (pinraspberry, LOW);
    delay(200);
    Serial.println ("allertato raspberry diamante tolto");
  }
}
}
}

//funzione che viene eseguita ogni volta che sopra c'è scritto "figure()"
void figure(int orizz, int vert) {
  delay(200);
  digitalWrite(laser, HIGH);
  tone1.play(orizz);
  tone2.play(vert);
  delay(2500);
  digitalWrite(laser, LOW);
  tone1.stop();
  tone2.stop();
  delay(200);
}


void giocoluci1()
{
  delay(500);
  digitalWrite(led11, LOW);
  digitalWrite(led12, LOW);
  delay(1000);
  digitalWrite(led1, HIGH);
  delay(100);
  digitalWrite(led2, HIGH);
  delay(100);
  digitalWrite(led3, HIGH);
  delay(100);
  digitalWrite(led4, HIGH);
  delay(100);
  digitalWrite(led5, HIGH);
  delay(100);
  digitalWrite(led7, HIGH);
  delay(100);
  digitalWrite(led8, HIGH);
  delay(100);
  digitalWrite(led9, HIGH);
  delay(100);
  digitalWrite(led10, HIGH);
  delay(100);
  digitalWrite(led6, HIGH);
  delay(100);
  digitalWrite(led15, HIGH);
  delay(100);
  digitalWrite(led14, HIGH);
  digitalWrite(led16, HIGH);
  delay(100);
  digitalWrite(led13, HIGH);
  digitalWrite(led17, HIGH);
  delay(100);
  digitalWrite(led12, HIGH);
  delay(100);
  digitalWrite(led11, HIGH);
  delay(1800);
  digitalWrite(led11, LOW);
  delay(100);
  digitalWrite(led12, LOW);
  delay(100);
  digitalWrite(led13, LOW);
  digitalWrite(led17, LOW);
  delay(100);
  digitalWrite(led14, LOW);
  digitalWrite(led16, LOW);
  delay(100);
  digitalWrite(led15, LOW);
  delay(100);
  digitalWrite(led6, LOW);
  delay(100);
  digitalWrite(led10, LOW);
  delay(100);
  digitalWrite(led9, LOW);
  delay(100);
  digitalWrite(led8, LOW);
  delay(100);
  digitalWrite(led7, LOW);
  delay(100);
  digitalWrite(led5, LOW);
  delay(100);
  digitalWrite(led4, LOW);
  delay(100);
  digitalWrite(led3, LOW);
  delay(100);
  digitalWrite(led2, LOW);
  delay(100);
  digitalWrite(led1, LOW);
  delay(100);
}


void leggipulsantifabio () {
  valpulsante1 = digitalRead(pulsante1);
  if (valpulsante1 == HIGH && mem2pulsante1 == 0) {
    mem1pulsante1 = 1;
    digitalWrite(led1, HIGH);
  }
  if (valpulsante1 == LOW && mem1pulsante1 == 1) {
    mem2pulsante1 = 1;
  }
  if (valpulsante1 == HIGH && mem2pulsante1 == 1) {
    digitalWrite(led1, LOW);
    mem1pulsante1 = 0;
  }
  if (valpulsante1 == LOW && mem1pulsante1 == 0) {
    mem2pulsante1 = 0;
  }


  valpulsante2 = digitalRead(pulsante2);
  if (valpulsante2 == HIGH && mem2pulsante2 == 0) {
    mem1pulsante2 = 1;
    digitalWrite(led2, HIGH);
  }
  if (valpulsante2 == LOW && mem1pulsante2 == 1) {
    mem2pulsante2 = 1;
  }
  if (valpulsante2 == HIGH && mem2pulsante2 == 1) {
    digitalWrite(led2, LOW);
    mem1pulsante2 = 0;
  }
  if (valpulsante2 == LOW && mem1pulsante2 == 0) {
    mem2pulsante2 = 0;
  }


  valpulsante3 = digitalRead(pulsante3);
  if (valpulsante3 == HIGH && mem2pulsante3 == 0) {
    mem1pulsante3 = 1;
    digitalWrite(led3, HIGH);
  }
  if (valpulsante3 == LOW && mem1pulsante3 == 1) {
    mem2pulsante3 = 1;
  }
  if (valpulsante3 == HIGH && mem2pulsante3 == 1) {
    digitalWrite(led3, LOW);
    mem1pulsante3 = 0;
  }
  if (valpulsante3 == LOW && mem1pulsante3 == 0) {
    mem2pulsante3 = 0;
  }

  valpulsante4 = digitalRead(pulsante4);
  if (valpulsante4 == HIGH && mem2pulsante4 == 0) {
    mem1pulsante4 = 1;
    digitalWrite(led4, HIGH);
  }
  if (valpulsante4 == LOW && mem1pulsante4 == 1) {
    mem2pulsante4 = 1;
  }
  if (valpulsante4 == HIGH && mem2pulsante4 == 1) {
    digitalWrite(led4, LOW);
    mem1pulsante4 = 0;
  }
  if (valpulsante4 == LOW && mem1pulsante4 == 0) {
    mem2pulsante4 = 0;
  }

  valpulsante5 = digitalRead(pulsante5);
  if (valpulsante5 == HIGH && mem2pulsante5 == 0) {
    mem1pulsante5 = 1;
    digitalWrite(led5, HIGH);
  }
  if (valpulsante5 == LOW && mem1pulsante5 == 1) {
    mem2pulsante5 = 1;
  }
  if (valpulsante5 == HIGH && mem2pulsante5 == 1) {
    digitalWrite(led5, LOW);
    mem1pulsante5 = 0;
  }
  if (valpulsante5 == LOW && mem1pulsante5 == 0) {
    mem2pulsante5 = 0;
  }


  valpulsante6 = digitalRead(pulsante6);
  if (valpulsante6 == HIGH && mem2pulsante6 == 0) {
    mem1pulsante6 = 1;
    digitalWrite(led6, HIGH);
  }
  if (valpulsante6 == LOW && mem1pulsante6 == 1) {
    mem2pulsante6 = 1;
  }
  if (valpulsante6 == HIGH && mem2pulsante6 == 1) {
    digitalWrite(led6, LOW);
    mem1pulsante6 = 0;
  }
  if (valpulsante6 == LOW && mem1pulsante6 == 0) {
    mem2pulsante6 = 0;
  }



  valpulsante7 = digitalRead(pulsante7);
  if (valpulsante7 == HIGH && mem2pulsante7 == 0) {
    mem1pulsante7 = 1;
    digitalWrite(led7, HIGH);
  }
  if (valpulsante7 == LOW && mem1pulsante7 == 1) {
    mem2pulsante7 = 1;
  }
  if (valpulsante7 == HIGH && mem2pulsante7 == 1) {
    digitalWrite(led7, LOW);
    mem1pulsante7 = 0;
  }
  if (valpulsante7 == LOW && mem1pulsante7 == 0) {
    mem2pulsante7 = 0;
  }


  valpulsante8 = digitalRead(pulsante8);
  if (valpulsante8 == HIGH && mem2pulsante8 == 0) {
    mem1pulsante8 = 1;
    digitalWrite(led8, HIGH);
  }
  if (valpulsante8 == LOW && mem1pulsante8 == 1) {
    mem2pulsante8 = 1;
  }
  if (valpulsante8 == HIGH && mem2pulsante8 == 1) {
    digitalWrite(led8, LOW);
    mem1pulsante8 = 0;
  }
  if (valpulsante8 == LOW && mem1pulsante8 == 0) {
    mem2pulsante8 = 0;
  }


  valpulsante9 = digitalRead(pulsante9);
  if (valpulsante9 == HIGH && mem2pulsante9 == 0) {
    mem1pulsante9 = 1;
    digitalWrite(led9, HIGH);
  }
  if (valpulsante9 == LOW && mem1pulsante9 == 1) {
    mem2pulsante9 = 1;
  }
  if (valpulsante9 == HIGH && mem2pulsante9 == 1) {
    digitalWrite(led9, LOW);
    mem1pulsante9 = 0;
  }
  if (valpulsante9 == LOW && mem1pulsante9 == 0) {
    mem2pulsante9 = 0;
  }



  valpulsante10 = digitalRead(pulsante10);
  if (valpulsante10 == HIGH && mem2pulsante10 == 0) {
    mem1pulsante10 = 1;
    digitalWrite(led10, HIGH);
  }
  if (valpulsante10 == LOW && mem1pulsante10 == 1) {
    mem2pulsante10 = 1;
  }
  if (valpulsante10 == HIGH && mem2pulsante10 == 1) {
    digitalWrite(led10, LOW);
    mem1pulsante10 = 0;
  }
  if (valpulsante10 == LOW && mem1pulsante10 == 0) {
    mem2pulsante10 = 0;
  }



  valpulsante11 = digitalRead(pulsante11);
  if (valpulsante11 == HIGH && mem2pulsante11 == 0) {
    mem1pulsante11 = 1;
    digitalWrite(led11, HIGH);
  }
  if (valpulsante11 == LOW && mem1pulsante11 == 1) {
    mem2pulsante11 = 1;
  }
  if (valpulsante11 == HIGH && mem2pulsante11 == 1) {
    digitalWrite(led11, LOW);
    mem1pulsante11 = 0;
  }
  if (valpulsante11 == LOW && mem1pulsante11 == 0) {
    mem2pulsante11 = 0;
  }



  valpulsante12 = digitalRead(pulsante12);
  if (valpulsante12 == HIGH && mem2pulsante12 == 0) {
    mem1pulsante12 = 1;
    digitalWrite(led12, HIGH);
  }
  if (valpulsante12 == LOW && mem1pulsante12 == 1) {
    mem2pulsante12 = 1;
  }
  if (valpulsante12 == HIGH && mem2pulsante12 == 1) {
    digitalWrite(led12, LOW);
    mem1pulsante12 = 0;
  }
  if (valpulsante12 == LOW && mem1pulsante12 == 0) {
    mem2pulsante12 = 0;
  }



  valpulsante13 = digitalRead(pulsante13);
  if (valpulsante13 == HIGH && mem2pulsante13 == 0) {
    mem1pulsante13 = 1;
    digitalWrite(led13, HIGH);
  }
  if (valpulsante13 == LOW && mem1pulsante13 == 1) {
    mem2pulsante13 = 1;
  }
  if (valpulsante13 == HIGH && mem2pulsante13 == 1) {
    digitalWrite(led13, LOW);
    mem1pulsante13 = 0;
  }
  if (valpulsante13 == LOW && mem1pulsante13 == 0) {
    mem2pulsante13 = 0;
  }



  valpulsante14 = digitalRead(pulsante14);
  if (valpulsante14 == HIGH && mem2pulsante14 == 0) {
    mem1pulsante14 = 1;
    digitalWrite(led14, HIGH);
  }
  if (valpulsante14 == LOW && mem1pulsante14 == 1) {
    mem2pulsante14 = 1;
  }
  if (valpulsante14 == HIGH && mem2pulsante14 == 1) {
    digitalWrite(led14, LOW);
    mem1pulsante14 = 0;
  }
  if (valpulsante14 == LOW && mem1pulsante14 == 0) {
    mem2pulsante14 = 0;
  }



  valpulsante15 = digitalRead(pulsante15);
  if (valpulsante15 == HIGH && mem2pulsante15 == 0) {
    mem1pulsante15 = 1;
    digitalWrite(led15, HIGH);
  }
  if (valpulsante15 == LOW && mem1pulsante15 == 1) {
    mem2pulsante15 = 1;
  }
  if (valpulsante15 == HIGH && mem2pulsante15 == 1) {
    digitalWrite(led15, LOW);
    mem1pulsante15 = 0;
  }
  if (valpulsante15 == LOW && mem1pulsante15 == 0) {
    mem2pulsante15 = 0;
  }



  valpulsante16 = digitalRead(pulsante16);
  if (valpulsante16 == HIGH && mem2pulsante16 == 0) {
    mem1pulsante16 = 1;
    digitalWrite(led16, HIGH);
  }
  if (valpulsante16 == LOW && mem1pulsante16 == 1) {
    mem2pulsante16 = 1;
  }
  if (valpulsante16 == HIGH && mem2pulsante16 == 1) {
    digitalWrite(led16, LOW);
    mem1pulsante16 = 0;
  }
  if (valpulsante16 == LOW && mem1pulsante16 == 0) {
    mem2pulsante16 = 0;
  }



  valpulsante17 = digitalRead(pulsante17);
  if (valpulsante17 == HIGH && mem2pulsante17 == 0) {
    mem1pulsante17 = 1;
    digitalWrite(led17, HIGH);
  }
  if (valpulsante17 == LOW && mem1pulsante17 == 1) {
    mem2pulsante17 = 1;
  }
  if (valpulsante17 == HIGH && mem2pulsante17 == 1) {
    digitalWrite(led17, LOW);
    mem1pulsante17 = 0;
  }
  if (valpulsante17 == LOW && mem1pulsante17 == 0) {
    mem2pulsante17 = 0;
  }
}


void giocoluci2() {
  delay(500);

  digitalWrite(led5, LOW);
  digitalWrite(led6, LOW);
  digitalWrite(led13, LOW);
  digitalWrite(led14, LOW);
  digitalWrite(led15, LOW);
  digitalWrite(led11, LOW);
  digitalWrite(led12, LOW);
  delay(500);
  digitalWrite(led1, HIGH);
  digitalWrite(led10, HIGH);
  delay(100);
  digitalWrite(led2, HIGH);
  digitalWrite(led9, HIGH);
  delay(100);
  digitalWrite(led3, HIGH);
  digitalWrite(led8, HIGH);
  delay(100);
  digitalWrite(led4, HIGH);
  digitalWrite(led7, HIGH);
  delay(100);
  digitalWrite(led6, HIGH);
  delay(100);
  digitalWrite(led5, HIGH);
  delay(100);
  digitalWrite(led15, HIGH);
  delay(100);
  digitalWrite(led14, HIGH);
  digitalWrite(led16, HIGH);
  delay(100);
  digitalWrite(led13, HIGH);
  digitalWrite(led17, HIGH);
  delay(100);
  digitalWrite(led12, HIGH);
  delay(100);
  digitalWrite(led11, HIGH);
  delay(400);
}

Questo è l’arduino che nella seconda parte (ossia quella che presenta il problema) manda semplicemente un messaggio relativo al tipo di tasto che è stato premuto

int count = 0;
int b = 0;
int BUTTONArray[] = {23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 69, 68 }; 
int LEDArray[]= {22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 3, 4 } ;
// pin di input dove è collegato il pulsante

 
 char *myStrings[] = {"chi", "cosa", "volere", "tu", "dove", "umani", "noi", "essere","nonsense", "ripeti"};
int fineditutto = 0;
int theend= 0;


int pulsante18=23;
int led18=22;
int pulsante19=25;
int led19=24;
int pulsante20=27;
int led20=26;
int pulsante21=29;
int led21=28;
int pulsante22=31;
int led22=30;
int pulsante23=33;
int led23=32;
int pulsante24=35;
int led24=34;
int pulsante25=37;
int led25=36;
int pulsante26=39;
int led26=38;
int pulsante27=41;
int led27=40;
int pulsante28=43;
int led28=42;
int pulsante29=45;
int led29=44;
int pulsante30=47;
int led30=46;
int pulsante31=49;
int led31=48;
int pulsante32=51;
int led32=50;
int pulsante33=53;
int led33=52;
int pulsante34=69;
int led34=3;
int pulsante35=68;
int led35=4;

int valpulsante18;
int valpulsante19;
int valpulsante20;
int valpulsante21;
int valpulsante22;
int valpulsante23;
int valpulsante24;
int valpulsante25;
int valpulsante26;
int valpulsante27;
int valpulsante28;
int valpulsante29;
int valpulsante30;
int valpulsante31;
int valpulsante32;
int valpulsante33;
int valpulsante34;
int valpulsante35;
 
int mem1pulsante18;
int mem1pulsante19;
int mem1pulsante20;
int mem1pulsante21;
int mem1pulsante22;
int mem1pulsante23;
int mem1pulsante24;
int mem1pulsante25;
int mem1pulsante26;
int mem1pulsante27;
int mem1pulsante28;
int mem1pulsante29;
int mem1pulsante30;
int mem1pulsante31;
int mem1pulsante32;
int mem1pulsante33;
int mem1pulsante34;
int mem1pulsante35;
 
int mem2pulsante18;
int mem2pulsante19;
int mem2pulsante20;
int mem2pulsante21;
int mem2pulsante22;
int mem2pulsante23;
int mem2pulsante24;
int mem2pulsante25;
int mem2pulsante26;
int mem2pulsante27;
int mem2pulsante28;
int mem2pulsante29;
int mem2pulsante30;
int mem2pulsante31;
int mem2pulsante32;
int mem2pulsante33;
int mem2pulsante34;
int mem2pulsante35;
 
int combinazionegiusta;
int fine;

int sendok; //emettitore
//char appoggio[10]; //emettitore
//char stringa1[20];//ricevitore

int reciveok;//ricevitore

int iniziacomunicazione = 0;

 
void setup() {
 

  // put your setup code here, to run once:
  for (count = 0; count<18 ; count++) {       // imposta il pin digitale come output
pinMode(BUTTONArray[count], INPUT);     // imposta il pin digitale come input
pinMode(LEDArray [count], OUTPUT);
}

pinMode(pulsante18, INPUT);
pinMode(led18, OUTPUT);
pinMode(pulsante19, INPUT);
pinMode(led19, OUTPUT);
pinMode(pulsante20, INPUT);
pinMode(led20, OUTPUT);
pinMode(pulsante21, INPUT);
pinMode(led21, OUTPUT);
pinMode(pulsante22, INPUT);
pinMode(led22, OUTPUT);
pinMode(pulsante23, INPUT);
pinMode(led23, OUTPUT);
pinMode(pulsante24, INPUT);
pinMode(led24, OUTPUT);
pinMode(pulsante25, INPUT);
pinMode(led25, OUTPUT);
pinMode(pulsante26, INPUT);
pinMode(led26, OUTPUT);
pinMode(pulsante27, INPUT);
pinMode(led27, OUTPUT);
pinMode(pulsante28, INPUT);
pinMode(led28, OUTPUT);
pinMode(pulsante29, INPUT);
pinMode(led29, OUTPUT);
pinMode(pulsante30, INPUT);
pinMode(led30, OUTPUT);
pinMode(pulsante31, INPUT);
pinMode(led31, OUTPUT);
pinMode(pulsante32, INPUT);
pinMode(led32, OUTPUT);
pinMode(pulsante33, INPUT);
pinMode(led33, OUTPUT);
pinMode(led34, OUTPUT);
pinMode(led35, OUTPUT);
 
digitalWrite(led18, LOW);
digitalWrite(led19, LOW);
digitalWrite(led20, LOW);
digitalWrite(led21, LOW);
digitalWrite(led22, LOW);
digitalWrite(led23, LOW);
digitalWrite(led24, LOW);
digitalWrite(led25, LOW);
digitalWrite(led26, LOW);
digitalWrite(led27, LOW);
digitalWrite(led28, LOW);
digitalWrite(led29, LOW);
digitalWrite(led30, LOW);
digitalWrite(led31, LOW);
digitalWrite(led32, LOW);
digitalWrite(led33, LOW);
digitalWrite(led34, LOW);
digitalWrite(led35, LOW);
 
Serial.begin(9600);
Serial1.begin(9600);//ricevitore
Serial3.begin(9600);//emettitore

combinazionegiusta=0;

fine=0;

sendok=0;

reciveok=0;
mem1pulsante25=1;

}

 

void loop() {
  if (Serial1. available ()){
    if (Serial1.read()== 4)
  {
    giocodiluci1();
    
 while (iniziacomunicazione == 0){

leggipulsantifabio(); 

if  (mem1pulsante18==0 && mem1pulsante19==0 && mem1pulsante20==0 && mem1pulsante21==0 && mem1pulsante22==1 && mem1pulsante23==1 && mem1pulsante24==1 && mem1pulsante25==1 && mem1pulsante30==1 && mem1pulsante31==1 &&  mem1pulsante26==0 && mem1pulsante27==0 && mem1pulsante28==0 && mem1pulsante29==0 && mem1pulsante32==0 && mem1pulsante33==0 && mem1pulsante34==0 && mem1pulsante35==0){

  sendok=1;

 /* itoa(sendok, appoggio, 10);

  Serial2.write(appoggio, 10);*/
  Serial3.write(sendok);

  combinazionegiusta=1;

}

else{

  sendok=0;

  /*itoa(sendok, appoggio, 10);

  Serial2.write(appoggio, 10);*/
  Serial3.write(sendok);
  

  combinazionegiusta=0;

}

 /*Serial1.readBytes(stringa1, 20);  

    reciveok = atoi(stringa1);*/
    
reciveok = Serial1.read ();
 

 if (combinazionegiusta==1 && reciveok==1 && mem1pulsante18==0 && mem1pulsante19==0 && mem1pulsante20==0 && mem1pulsante21==0 && mem1pulsante22==1 && mem1pulsante23==1 && mem1pulsante24==1 && mem1pulsante25==1 && mem1pulsante26==0 && mem1pulsante27==0 && mem1pulsante28==0 && mem1pulsante29==0 && mem1pulsante30==1 && mem1pulsante31==1 && mem1pulsante32==0 && mem1pulsante33==0 && mem1pulsante34==0 && mem1pulsante35==0){

  /*itoa(sendok, appoggio, 10);

  Serial2.write(appoggio, 10);*/
  
//Serial2.write(sendok);

giocoluci2();

  //fine=1;
  iniziacomunicazione=1;
  for (count = 0; count<18 ; count++) {
  digitalWrite (LEDArray[count], HIGH);
 }  
delay(300);
}
 }

 

/*Serial.print("puls18: ");

Serial.println(valpulsante18);

Serial.print("puls19: ");

Serial.println(valpulsante19);

Serial.print("puls20: ");

Serial.println(valpulsante20);

Serial.print("puls21: ");

Serial.println(valpulsante21);

Serial.print("puls22: ");

Serial.println(valpulsante22);

Serial.print("puls23: ");

Serial.println(valpulsante23);

Serial.print("puls24: ");

Serial.println(valpulsante24);

Serial.print("puls25: ");

Serial.println(valpulsante25);

Serial.print("puls26: ");

Serial.println(valpulsante26);

Serial.print("puls27: ");

Serial.println(valpulsante27);

Serial.print("puls28: ");

Serial.println(valpulsante28);

Serial.print("puls29: ");

Serial.println(valpulsante29);

Serial.print("puls30: ");

Serial.println(valpulsante30);

Serial.print("puls31: ");

Serial.println(valpulsante31);

Serial.print("puls32: ");

Serial.println(valpulsante32);

Serial.print("puls33: ");

Serial.println(valpulsante33);

Serial.print("puls34: ");

Serial.println(valpulsante34);

Serial.print("puls35: ");

Serial.println(valpulsante35);

Serial.println("    ");

Serial.println("    ");

Serial.println("    ");

Serial.println("    ");*/


while (iniziacomunicazione == 1){
   
   for (count = 0; count<18  ; count++)
  {if ((digitalRead(BUTTONArray[count])) == HIGH) {
     digitalWrite (LEDArray[count], LOW);
      delay(200);
  digitalWrite (LEDArray[count], HIGH);
  
    if (count == 0) {b=0;} //{a=6561;}//nonsense, tasto 18
    else if (count == 1) {b=0;} //{a=6561;}//nonsense 
    else if (count == 2) {b=0;}//{a=6561;}//nonsense
    else if (count == 3) {b=0;}//{a=6561;}//nonsense
    else if (count == 4) {b=0;}//{a=6561;}//nonsense
    else if (count == 5) {b=0;}//{a=6561;}//nonsense
    else if (count == 6) {b=1;}//{a=27;}// tu, tasto 24
    else if (count == 7) {b=0;}//{a=6561;}//nonsense
    else if (count == 8) {b=0;}//{a=6561;}//nonsense
    else if (count == 9) {b=0;}//{a=6561;}//nonsense
    else if (count == 10) {b=0;}//{a=6561;}//nonsense
    else if (count == 11) {b=0;}//{a=6561;}//nonsense
    else if (count == 12) {b=2;}//{a=81;}//dove. tasto 30
    else if (count == 13) {b=0;}//{a=6561;}//nonsense
    else if (count == 14) {b=4;}//{a=2187;}//essere tasto 32
    else if (count == 15) {b=0;}//{a=6561;}//nonsense
    else if (count == 16) {b=0;}//{a=6561;}//nonsense
   else if (count == 17) {b=3;}//{a=729;}//noi , tasto 35
/*valori (potenze di 3): 3, 9, 27, 81, 243, 729,2187, 6561,19683*/
   
    Serial1.write(b);
     Serial.println(count);
    Serial.println(b);
    delay (250);
   
  }
  
  }
 fineditutto = Serial1.read();
if (fineditutto == 3){
  iniziacomunicazione=2; }


}
   
   for (count = 0; count<18 ; count++) {
  digitalWrite (LEDArray[count], LOW);
}
}
  }
}

void giocodiluci1 (){
  delay(500);
 

  digitalWrite(led18, LOW);

  digitalWrite(led19, LOW);

  digitalWrite(led20, LOW);

  digitalWrite(led21, LOW);

  digitalWrite(led22, LOW);

  digitalWrite(led23, LOW);

  digitalWrite(led24, LOW);

  delay(1000);

  digitalWrite(led26, HIGH);

  delay(100);

  digitalWrite(led27, HIGH);

  delay(100);

  digitalWrite(led28, HIGH);

  delay(100);

  digitalWrite(led29, HIGH);

  delay(100);

  digitalWrite(led31, HIGH);

  delay(100);

  digitalWrite(led32, HIGH);

  delay(100);

  digitalWrite(led33, HIGH);

  delay(100);

  digitalWrite(led34, HIGH);

  delay(100);

  digitalWrite(led35, HIGH);

  delay(100);

  digitalWrite(led30, HIGH);

  delay(100);

  digitalWrite(led22, HIGH);

  delay(100);

  digitalWrite(led21, HIGH);

  digitalWrite(led23, HIGH);

  delay(100);

  digitalWrite(led20, HIGH);

  digitalWrite(led24, HIGH);

  delay(100);

  digitalWrite(led18, HIGH);

  delay(100);

  digitalWrite(led19, HIGH);

  delay(100);

  /*digitalWrite(led25, HIGH);

  delay(100);

  digitalWrite(led25, LOW);

  delay(100);

  digitalWrite(led25, HIGH);

  delay(100);

  digitalWrite(led25, LOW);

  delay(100);

  digitalWrite(led25, HIGH);

  delay(100);

  digitalWrite(led25, LOW);

  delay(100);

  digitalWrite(led25, HIGH);

  delay(100);

  digitalWrite(led25, LOW);

  delay(100);

  digitalWrite(led25, HIGH);

  delay(100);

  digitalWrite(led25, LOW);

  delay(100);

 digitalWrite(led25, HIGH);

  delay(100);

  digitalWrite(led25, LOW);

  delay(100);

  digitalWrite(led25, HIGH);

  delay(100);

  digitalWrite(led25, LOW);

  delay(100);

  digitalWrite(led25, HIGH);

  delay(100);

  digitalWrite(led25, LOW);

  delay(100);*/

  digitalWrite(led25, HIGH);

  delay(100);

  digitalWrite(led25, LOW);

  delay(100);

  digitalWrite(led25, HIGH);

  delay(100);

  digitalWrite(led25, LOW);

  delay(100);

  digitalWrite(led25, HIGH);

  delay(100);

 digitalWrite(led25, LOW);

  delay(100);

  digitalWrite(led25, HIGH);

  delay(100);

  digitalWrite(led25, LOW);

  delay(100);

  digitalWrite(led25, HIGH);

  delay(1000);

  digitalWrite(led19, LOW);

  delay(100);

  digitalWrite(led18, LOW);

  delay(100);

  digitalWrite(led24, LOW);

  digitalWrite(led20, LOW);

  delay(100);

  digitalWrite(led21, LOW);

  digitalWrite(led23, LOW);

  delay(100);

  digitalWrite(led22, LOW);

  delay(100);

  digitalWrite(led30, LOW);

  delay(100);

  digitalWrite(led35, LOW);

  delay(100);

  digitalWrite(led34, LOW);

  delay(100);

  digitalWrite(led33, LOW);

  delay(100);

  digitalWrite(led32, LOW);

  delay(100);

  digitalWrite(led31, LOW);

  delay(100);

  digitalWrite(led29, LOW);

  delay(100);

  digitalWrite(led28, LOW);

  delay(100);

  digitalWrite(led27, LOW);

  delay(100);

  digitalWrite(led26, LOW);

  delay(100);}


void leggipulsantifabio(){
  valpulsante18 = digitalRead(pulsante18);

if (valpulsante18==HIGH && mem2pulsante18==0){

  mem1pulsante18=1;

  digitalWrite(led18, HIGH);

  }

if (valpulsante18==LOW && mem1pulsante18==1){

  mem2pulsante18=1;

}

if(valpulsante18==HIGH && mem2pulsante18==1){

  digitalWrite(led18, LOW);

  mem1pulsante18=0;

}

if (valpulsante18==LOW && mem1pulsante18==0){

  mem2pulsante18=0;

}

 

 

 

valpulsante19 = digitalRead(pulsante19);

if (valpulsante19==HIGH && mem2pulsante19==0){

 mem1pulsante19=1;

  digitalWrite(led19, HIGH);

  }

if (valpulsante19==LOW && mem1pulsante19==1){

  mem2pulsante19=1;

}

if(valpulsante19==HIGH && mem2pulsante19==1){

  digitalWrite(led19, LOW);

  mem1pulsante19=0;

}

if (valpulsante19==LOW && mem1pulsante19==0){

  mem2pulsante19=0;

}

 

 

 

valpulsante20 = digitalRead(pulsante20);

if (valpulsante20==HIGH && mem2pulsante20==0){

  mem1pulsante20=1;

  digitalWrite(led20, HIGH);

  }

if (valpulsante20==LOW && mem1pulsante20==1){

  mem2pulsante20=1;

}

if(valpulsante20==HIGH && mem2pulsante20==1){

  digitalWrite(led20, LOW);

  mem1pulsante20=0;

}

if (valpulsante20==LOW && mem1pulsante20==0){

  mem2pulsante20=0;

}

 

 

 

valpulsante21 = digitalRead(pulsante21);

if (valpulsante21==HIGH && mem2pulsante21==0){

  mem1pulsante21=1;

  digitalWrite(led21, HIGH);

  }

if (valpulsante21==LOW && mem1pulsante21==1){

  mem2pulsante21=1;

}

if(valpulsante21==HIGH && mem2pulsante21==1){

  digitalWrite(led21, LOW);

  mem1pulsante21=0;

}

if (valpulsante21==LOW && mem1pulsante21==0){

  mem2pulsante21=0;

}

 

 

 

valpulsante22 = digitalRead(pulsante22);

if (valpulsante22==HIGH && mem2pulsante22==0){

  mem1pulsante22=1;

  digitalWrite(led22, HIGH);

  }

if (valpulsante22==LOW && mem1pulsante22==1){

  mem2pulsante22=1;

}

if(valpulsante22==HIGH && mem2pulsante22==1){

  digitalWrite(led22, LOW);

  mem1pulsante22=0;

}

if (valpulsante22==LOW && mem1pulsante22==0){

  mem2pulsante22=0;

}

 

 

 

valpulsante23 = digitalRead(pulsante23);

if (valpulsante23==HIGH && mem2pulsante23==0){

  mem1pulsante23=1;

  digitalWrite(led23, HIGH);

  }

if (valpulsante23==LOW && mem1pulsante23==1){

  mem2pulsante23=1;

}

if(valpulsante23==HIGH && mem2pulsante23==1){

  digitalWrite(led23, LOW);

  mem1pulsante23=0;

}

if (valpulsante23==LOW && mem1pulsante23==0){

  mem2pulsante23=0;

}

 

 

 

valpulsante24 = digitalRead(pulsante24);

if (valpulsante24==HIGH && mem2pulsante24==0){

 mem1pulsante24=1;

  digitalWrite(led24, HIGH);

  }

if (valpulsante24==LOW && mem1pulsante24==1){

  mem2pulsante24=1;

}

if(valpulsante24==HIGH && mem2pulsante24==1){

  digitalWrite(led24, LOW);

  mem1pulsante24=0;

}

if (valpulsante24==LOW && mem1pulsante24==0){

  mem2pulsante24=0;

}

 

 

 

valpulsante25 = digitalRead(pulsante25);

if (valpulsante25==HIGH && mem2pulsante25==0){

  mem1pulsante25=1;

  digitalWrite(led25, HIGH);

  }

if (valpulsante25==LOW && mem1pulsante25==1){

  mem2pulsante25=1;

}

if(valpulsante25==HIGH && mem2pulsante25==1){

  digitalWrite(led25, LOW);

  mem1pulsante25=0;

}

if (valpulsante25==LOW && mem1pulsante25==0){

  mem2pulsante25=0;

}

 

 

 

valpulsante26 = digitalRead(pulsante26);

if (valpulsante26==HIGH && mem2pulsante26==0){

  mem1pulsante26=1;

  digitalWrite(led26, HIGH);

  }

if (valpulsante26==LOW && mem1pulsante26==1){

  mem2pulsante26=1;

}

if(valpulsante26==HIGH && mem2pulsante26==1){

  digitalWrite(led26, LOW);

  mem1pulsante26=0;

}

if (valpulsante26==LOW && mem1pulsante26==0){

  mem2pulsante26=0;

}

 

 

 

valpulsante27 = digitalRead(pulsante27);

if (valpulsante27==HIGH && mem2pulsante27==0){

  mem1pulsante27=1;

  digitalWrite(led27, HIGH);

  }

if (valpulsante27==LOW && mem1pulsante27==1){

  mem2pulsante27=1;

}

if(valpulsante27==HIGH && mem2pulsante27==1){

  digitalWrite(led27, LOW);

  mem1pulsante27=0;

}

if (valpulsante27==LOW && mem1pulsante27==0){

  mem2pulsante27=0;

}

 

 

 

valpulsante28 = digitalRead(pulsante28);

if (valpulsante28==HIGH && mem2pulsante28==0){

  mem1pulsante28=1;

  digitalWrite(led28, HIGH);

  }

if (valpulsante28==LOW && mem1pulsante28==1){

  mem2pulsante28=1;

}

if(valpulsante28==HIGH && mem2pulsante28==1){

  digitalWrite(led28, LOW);

  mem1pulsante28=0;

}

if (valpulsante28==LOW && mem1pulsante28==0){

  mem2pulsante28=0;

}

 

 

 

valpulsante29 = digitalRead(pulsante29);

if (valpulsante29==HIGH && mem2pulsante29==0){

 mem1pulsante29=1;

  digitalWrite(led29, HIGH);

  }

if (valpulsante29==LOW && mem1pulsante29==1){

  mem2pulsante29=1;

}

if(valpulsante29==HIGH && mem2pulsante29==1){

  digitalWrite(led29, LOW);

  mem1pulsante29=0;

}

if (valpulsante29==LOW && mem1pulsante29==0){

  mem2pulsante29=0;

}

 

 

 

valpulsante30 = digitalRead(pulsante30);

if (valpulsante30==HIGH && mem2pulsante30==0){

  mem1pulsante30=1;

  digitalWrite(led30, HIGH);

  }

if (valpulsante30==LOW && mem1pulsante30==1){

  mem2pulsante30=1;

}

if(valpulsante30==HIGH && mem2pulsante30==1){

  digitalWrite(led30, LOW);

  mem1pulsante30=0;

}

if (valpulsante30==LOW && mem1pulsante30==0){

  mem2pulsante30=0;

}

 

 

 

valpulsante31 = digitalRead(pulsante31);

if (valpulsante31==HIGH && mem2pulsante31==0){

  mem1pulsante31=1;

  digitalWrite(led31, HIGH);

  }

if (valpulsante31==LOW && mem1pulsante31==1){

  mem2pulsante31=1;

}

if(valpulsante31==HIGH && mem2pulsante31==1){

  digitalWrite(led31, LOW);

  mem1pulsante31=0;

}

if (valpulsante31==LOW && mem1pulsante31==0){

  mem2pulsante31=0;

}

 

 

 

valpulsante32 = digitalRead(pulsante32);

if (valpulsante32==HIGH && mem2pulsante32==0){

 mem1pulsante32=1;

  digitalWrite(led32, HIGH);

  }

if (valpulsante32==LOW && mem1pulsante32==1){

  mem2pulsante32=1;

}

if(valpulsante32==HIGH && mem2pulsante32==1){

  digitalWrite(led32, LOW);

  mem1pulsante32=0;

}

if (valpulsante32==LOW && mem1pulsante32==0){

  mem2pulsante32=0;

}

 

 

 

valpulsante33 = digitalRead(pulsante33);

if (valpulsante33==HIGH && mem2pulsante33==0){

  mem1pulsante33=1;

  digitalWrite(led33, HIGH);

  }

if (valpulsante33==LOW && mem1pulsante33==1){

  mem2pulsante33=1;

}

if(valpulsante33==HIGH && mem2pulsante33==1){

  digitalWrite(led33, LOW);

  mem1pulsante33=0;

}

if (valpulsante33==LOW && mem1pulsante33==0){

  mem2pulsante33=0;

}

 

 

 

valpulsante34 = digitalRead(pulsante34);

if (valpulsante34==HIGH && mem2pulsante34==0){

  mem1pulsante34=1;

  digitalWrite(led34, HIGH);

  }

if (valpulsante34==LOW && mem1pulsante34==1){

  mem2pulsante34=1;

}

if(valpulsante34==HIGH && mem2pulsante34==1){

  digitalWrite(led34, LOW);

  mem1pulsante34=0;

}

if (valpulsante34==LOW && mem1pulsante34==0){

  mem2pulsante34=0;

}

 

 

 

valpulsante35 = digitalRead(pulsante35);

if (valpulsante35==HIGH && mem2pulsante35==0){

  mem1pulsante35=1;

  digitalWrite(led35, HIGH);

  }

if (valpulsante35==LOW && mem1pulsante35==1){

  mem2pulsante35=1;

}

if(valpulsante35==HIGH && mem2pulsante35==1){

  digitalWrite(led35, LOW);

  mem1pulsante35=0;

}

if (valpulsante35==LOW && mem1pulsante35==0){

  mem2pulsante35=0;

}

}

void giocoluci2() {
  delay(500);
 

  digitalWrite(led30, LOW);

  digitalWrite(led31, LOW);

  digitalWrite(led22, LOW);

  digitalWrite(led23, LOW);

  digitalWrite(led24, LOW);

  delay(500);

  digitalWrite(led26, HIGH);
digitalWrite(led35, HIGH);

  delay(100);

  digitalWrite(led27, HIGH);

  digitalWrite(led34, HIGH);

  delay(100);

  digitalWrite(led33, HIGH);
digitalWrite(led28, HIGH);

  delay(100);

  digitalWrite(led32, HIGH);
  digitalWrite(led29, HIGH);

  delay(100);

  digitalWrite(led30, HIGH);

  delay(100);

  digitalWrite(led31, HIGH);

  delay(100);

  digitalWrite(led22, HIGH);

  delay(100);

  digitalWrite(led21, HIGH);

  digitalWrite(led23, HIGH);

  delay(100);

  digitalWrite(led20, HIGH);

  digitalWrite(led24, HIGH);

  delay(100);

  digitalWrite(led18, HIGH);

  delay(100);

  digitalWrite(led19, HIGH);

  delay(100);

  digitalWrite(led25, HIGH);

  delay(100);

  digitalWrite(led25, LOW);

  delay(100);

  digitalWrite(led25, HIGH);

  delay(100);}

Porta pazienza… sarete anche alle seconde armi, ma un minimo di sforzo lo dovete fare…
Togliete almeno le parti doppie e i commenti… e togliete anche qualche riga vuota…
Messi così sono incomprensibili

Non solo, ma FORMATTATE CORRETTAMNETE il codice (basta fare CTRL T nell’IDE) … REGOLAMENTO, punto 17.2.

Guglielmo

Arduino più complesso

#include <Tone.h>
Tone tone1;
Tone tone2;

int laser = 67;

int untastopremuto = 0;

int count = 0;

int a = 0;

int b = 0;

int conta = 0;

int x = 0;

int k = 0;

int LEDArray[] = {22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 68 } ;

int LUCI = 66;

int pintattile = 3;
int pinserratura = 4;
int pinarduinosonar = 6;
int pinraspberry = 7;
int pinrelayampli = 8;
int pindiamantetolto = 5;
int FINE;

int MEM1Array[18];
int MEM2Array[18];

int BUTTONArray[] = {23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 69 };
int combinazionegiusta;

int sendok; //emettitore

int reciveok;//ricevitore

int iniziacomunicazione;

int finaleextra;



void setup() {

  tone1.begin(54);
  tone2.begin(55);
  pinMode (laser, OUTPUT);

  for (count = 0; count < 17 ; count++) {
    pinMode(BUTTONArray[count], INPUT);
    pinMode(LEDArray[count], OUTPUT);
  }
  pinMode (pintattile, INPUT_PULLUP);
  pinMode (pinserratura, OUTPUT);
  pinMode (pinarduinosonar, OUTPUT);
  pinMode (pinraspberry, OUTPUT);
  pinMode (pindiamantetolto, INPUT_PULLUP);
  pinMode (pinrelayampli, OUTPUT);



  for (count = 0; count < 17 ; count++) {
    digitalWrite(LEDArray[count], LOW);
  }


  Serial.begin(9600);
  Serial1.begin(9600);//emettitore
  Serial3.begin(9600);//ricevitore

  combinazionegiusta = 0;

  sendok = 0;

  reciveok = 0;
  iniziacomunicazione = 0;
  finaleextra = 0;
  FINE = 0;

}



void loop() {
  if (FINE == 0) {
    if ((digitalRead(pintattile)) == LOW) {

      Serial.println ("avvio");
      Serial1.write (4); //avvia anche l'altro arduino
      giocoluci1();

      while (iniziacomunicazione == 0)
      {
        leggipulsantifabio();
       

        if (MEM1Array [0]== 0 && MEM1Array [1]== 0 && MEM1Array [2]== 0 && MEM1Array [3]== 0 && MEM1Array [4]== 1 && MEM1Array [5]== 1 && MEM1Array [6]== 0 && MEM1Array [7]== 0 && MEM1Array [8]== 0 && MEM1Array [9]== 0 && MEM1Array [10]== 1 && MEM1Array [11]== 1 && MEM1Array [12]== 1 && MEM1Array [12]== 1 && MEM1Array [14]== 1 && MEM1Array [15]== 0 && MEM1Array [16]== 0 ) {

          sendok = 1;

          Serial1.write( sendok);

          combinazionegiusta = 1;

        }

        else {

          sendok = 0;

          Serial1.write(sendok);

          combinazionegiusta = 0;

        }

        reciveok = Serial3.read();

        if (combinazionegiusta == 1 && reciveok == 1 && MEM1Array [0]== 0 && MEM1Array [1]== 0 && MEM1Array [2]== 0 && MEM1Array [3]== 0 && MEM1Array [4]== 1 && MEM1Array [5]== 1 && MEM1Array [6]== 0 && MEM1Array [7]== 0 && MEM1Array [8]== 0 && MEM1Array [9]== 0 && MEM1Array [10]== 1 && MEM1Array [11]== 1 && MEM1Array [12]== 1 && MEM1Array [12]== 1 && MEM1Array [14]== 1 && MEM1Array [15]== 0 && MEM1Array [16]== 0) {

          giocoluci2();

          iniziacomunicazione = 1;

          digitalWrite (pinrelayampli, HIGH);
          for (count = 0; count < 17 ; count++) {
            digitalWrite (LEDArray[count], HIGH);


          }
          delay(1000);
          Serial.println ("chiusura blocco1");
        }
      }
      while (iniziacomunicazione == 1) {
        // non aggiungere nessun delay qui!!!

        Serial.println ("sto per leggere i pulsanti");

        while (untastopremuto == 0) {
          for (count = 0; count < 17  ; count++) {

            if ((digitalRead(BUTTONArray[count])) == HIGH) {
              digitalWrite (LEDArray[count], LOW);
              delay(200);
              digitalWrite (LEDArray[count], HIGH);
              if (count == 0) {
                a = 1; //chi, tasto 1
              }
              else if (count == 1) {
                a = 3; //cosa, tasto 2
              }
              else if (count == 2) {
                a = 6561; //nonsense
              }
              else if (count == 3) {
                a = 6561; //nonsense
              }
              else if (count == 4) {
                a = 9; //volere, tasto 5
              }
              else if (count == 5) {
                a = 6561; //nonsense
              }
              else if (count == 6) {
                a = 6561; //nonsense
              }
              else if (count == 7) {
                a = 6561; //nonsense
              }
              else if (count == 8) {
                a = 19683; //ripeti, tasto 9
              }
              else if (count == 9) {
                a = 6561; //nonsense
              }
              else if (count == 10) {
                a = 6561; //nonsense
              }
              else if (count == 11) {
                a = 6561; //nonsense
              }
              else if (count == 12) {
                a = 6561; //nonsense
              }
              else if (count == 13) {
                a = 6561; //nonsense
              }
              else if (count == 14) {
                a = 243; //umani, tasto 15
              }
              else if (count == 15) {
                a = 6561; //nonsense
              }
              else if (count == 16) {
                a = 6561; //nonsense
              }


              Serial.println (count);

              delay (400);
              untastopremuto = 1;
            }
          }

          if (Serial1.available()) {


            b = Serial3.read();
            if (b == 0) {
              a = 6561; //nonsense
            }
            if (b == 1) { //tu
              a = 27;
            }
            if (b == 2) { // dove
              a = 81;
            }
            if (b == 3) { //noi
              a = 729;
            }
            if (b == 4) { //essere
              a = 2187;
            }
            if (b == 5) { //chi
              a = 1;
            }

            Serial.print ("b");
            Serial.println (b);
            untastopremuto = 1;
          }
        }


        untastopremuto = 0; // così si può ricevere un nuovo pulsante


        if (conta < 2) { //prima della terza parola
          conta++;
          x = x + a;
        }
        else {//terza parola
          x = x + a;
          if (x == (3 + 9 + 27)) //cosa volere tu
          {
            Serial.println ("noi volere energia");
            figure(193, 778); 
            figure (502, 542);
            figure (776, 310); 
            while (!(k == 1)) {
              for (count = 0; count < 17  ; count++) {
                if ((digitalRead(BUTTONArray[count]) == HIGH)) {
                  digitalWrite (LEDArray[count], LOW);
                  delay(200);
                  digitalWrite (LEDArray[count], HIGH);
                  if (count == 8) { //ripeti
                    Serial.println ("ripeto");

                    delay(500);
                    figure(193, 778);
                    figure (502, 542);
                    figure (776, 310);
                    delay (250);
                  }
                  else {
                    k = 1;
                  }

                }

              }
              if (Serial1.available()) {
                k = 1;
              }
            }
          }

          else if (x == (81 + 243 + 2187)) { 
            Serial.println("tizio deforme");
            digitalWrite(LUCI, HIGH);
            iniziacomunicazione = 2; // fa uscire dal ciclo while della comunicazione

          }
          else if (x == (81 + 729 + 2187)) { 
            Serial.println ("terra tempo diverso" );
            figure(35, 45); 
            figure(303, 306); 
            figure (310, 776); 
            finaleextra = 1;

            while (!(k == 1)) {
              for (count = 0; count < 17  ; count++) {
                if ((digitalRead(BUTTONArray[count]) == HIGH)) {
                  digitalWrite (LEDArray[count], LOW);
                  delay(200);
                  digitalWrite (LEDArray[count], HIGH);
                  if (count == 8) { //ripeti
                    Serial.println ("ripeto");

                    delay(500);
                    figure(35, 45);
                    figure(303, 306);
                    figure (310, 776);
                    delay (250);
                  }

                  else {
                    k = 1;
                  }

                }

              }
              if (Serial1.available()) {
                k = 1;
              }
            }
          }
          else if (x == (1 + 27 + 2187)) { 
            Serial.println("io sono dhsajhdsja0/guardiano?");
            figure(193, 778); 
            figure(204, 108); 
            figure(159, 150); 
            while (!(k == 1)) {
              for (count = 0; count < 17  ; count++) {
                if ((digitalRead(BUTTONArray[count]) == HIGH)) {
                  digitalWrite (LEDArray[count], LOW);
                  delay(200);
                  digitalWrite (LEDArray[count], HIGH);
                  if (count == 8) { //ripeti
                    Serial.println ("ripeto");

                    delay(500);
                    figure(193, 778);
                    figure(204, 108);
                    figure(159, 150);
                    delay (250);
                  }
                  else {
                    k = 1;
                  }

                }

              }
              if (Serial1.available()) {
                k = 1;
              }
            }
          }
          else if (x == (3 + 27 + 2187)) { 
            Serial.println ("noi essere fhdjsfkdj/guardiano?");
            figure(193, 778);
            figure(204, 108);
            figure(159, 150);
            while (!(k == 1)) {
              for (count = 0; count < 17  ; count++) {
                if ((digitalRead(BUTTONArray[count]) == HIGH)) {
                  digitalWrite (LEDArray[count], LOW);
                  delay(200);
                  digitalWrite (LEDArray[count], HIGH);
                  if (count == 8) { //ripeti
                    Serial.println ("ripeto");

                    delay(500);
                    figure(193, 778);
                    figure(204, 108);
                    figure(159, 150);
                    delay (250);
                  }
                  else {
                    k = 1;
                  }

                }

              }
              if (Serial1.available()) {
                k = 1;
              }
            }
          }

          else {
            Serial.println ("io non capire1");
            figure(193, 778);
            figure(204, 404); 
            figure(202, 272); 
            while (!(k == 1)) {
              for (count = 0; count < 17  ; count++) {
                if ((digitalRead(BUTTONArray[count]) == HIGH)) {
                  digitalWrite (LEDArray[count], LOW);
                  delay(200);
                  digitalWrite (LEDArray[count], HIGH);
                  if (count == 8) { 
                    Serial.println ("ripeto");
                    delay(500);
                    Serial.println ("io non capire2");
                    figure(193, 778);
                    figure(204, 404);
                    figure (202, 272);
                    delay (250);
                  }
                  else {
                    k = 1;
                  }


                }
              }
              if (Serial1.available()) {
                k = 1;
              }
            }

          }
          conta = 0;
          x = 0;
          k = 0;
        }
      }

      // queste seguenti cose sono fuori dai cicli while della comunicazione
      for (count = 0; count < 17 ; count++) {
        digitalWrite (LEDArray[count], LOW);

      }
      Serial1.write (3);
      digitalWrite(pinrelayampli, LOW);
      digitalWrite (pinserratura, HIGH);
      delay(400);
      digitalWrite (pinserratura, LOW);
      digitalWrite (pinarduinosonar, HIGH);
      delay(400);
      digitalWrite (pinarduinosonar, LOW);
      Serial.println ("serratura sbloccata e sonar attivati");
      digitalWrite (pinraspberry, HIGH);
      delay(400);
      digitalWrite (pinraspberry, LOW);
      Serial.println ("raspberry allertato comunicazione terminata");
      while (!((digitalRead(pindiamantetolto)) == LOW)) {} 
      if (finaleextra == 1) { 
        digitalWrite (pinraspberry, HIGH);
        delay(100);
        digitalWrite (pinraspberry, LOW);
        delay(200);
        digitalWrite (pinraspberry, HIGH);
        delay(100);
        digitalWrite (pinraspberry, LOW);
        delay(200);
        digitalWrite (pinraspberry, HIGH);
        delay(100);
        digitalWrite (pinraspberry, LOW);
        Serial.println ("allertato raspberry finale extra");
      }
      else {
        digitalWrite (pinraspberry, HIGH);
        delay(200);
        digitalWrite (pinraspberry, LOW);
        delay(200);
        digitalWrite (pinraspberry, HIGH);
        delay(200);
        digitalWrite (pinraspberry, LOW);
        delay(200);
        Serial.println ("allertato raspberry diamante tolto");
      }
    }
  }
}

//funzione che viene eseguita ogni volta che sopra c'è scritto "figure()"
void figure(int orizz, int vert) {
  delay(200);
  digitalWrite(laser, HIGH);
  tone1.play(orizz);
  tone2.play(vert);
  delay(2500);
  digitalWrite(laser, LOW);
  tone1.stop();
  tone2.stop();
  delay(200);
}


void giocoluci1()
{
  delay(500);
  digitalWrite(LEDArray[10], LOW);
  digitalWrite(LEDArray[11], LOW);
  delay(1000);
  digitalWrite(LEDArray[0], HIGH);
  delay(100);
  digitalWrite(LEDArray[1], HIGH);
  delay(100);
  digitalWrite(LEDArray[2], HIGH);
  delay(100);
  digitalWrite(LEDArray[3], HIGH);
  delay(100);
  digitalWrite(LEDArray[4], HIGH);
  delay(100);
  digitalWrite(LEDArray[6], HIGH);
  delay(100);
  digitalWrite(LEDArray[7], HIGH);
  delay(100);
  digitalWrite(LEDArray[8], HIGH);
  delay(100);
  digitalWrite(LEDArray[9], HIGH);
  delay(100);
  digitalWrite(LEDArray[5], HIGH);
  delay(100);
  digitalWrite(LEDArray[14], HIGH);
  delay(100);
  digitalWrite(LEDArray[13], HIGH);
  digitalWrite(LEDArray[15], HIGH);
  delay(100);
  digitalWrite(LEDArray[12], HIGH);
  digitalWrite(LEDArray[16], HIGH);
  delay(100);
  digitalWrite(LEDArray[11], HIGH);
  delay(100);
  digitalWrite(LEDArray[10], HIGH);
  delay(1800);
  digitalWrite(LEDArray[10], LOW);
  delay(100);
  digitalWrite(LEDArray[11], LOW);
  delay(100);
  digitalWrite(LEDArray[12], LOW);
  digitalWrite(LEDArray[16], LOW);
  delay(100);
  digitalWrite(LEDArray[13], LOW);
  digitalWrite(LEDArray[15], LOW);
  delay(100);
  digitalWrite(LEDArray[14], LOW);
  delay(100);
  digitalWrite(LEDArray[5], LOW);
  delay(100);
  digitalWrite(LEDArray[9], LOW);
  delay(100);
  digitalWrite(LEDArray[8], LOW);
  delay(100);
  digitalWrite(LEDArray[7], LOW);
  delay(100);
  digitalWrite(LEDArray[6], LOW);
  delay(100);
  digitalWrite(LEDArray[4], LOW);
  delay(100);
  digitalWrite(LEDArray[3], LOW);
  delay(100);
  digitalWrite(LEDArray[2], LOW);
  delay(100);
  digitalWrite(LEDArray[1], LOW);
  delay(100);
  digitalWrite(LEDArray[0], LOW);
  delay(100);
}


void leggipulsantifabio () {
    for (count==0; count<18; count ++){
  if ((digitalRead(BUTTONArray[count])) == HIGH){
    if (MEM2Array[count]==0){
      MEM1Array[count] =1;
      digitalWrite (LEDArray[count], HIGH);
  }
  if (MEM2Array[count]==1){
    digitalWrite (LEDArray[count], LOW);
    MEM1Array[count] = 0;
  }
    
  }
  if ((digitalRead(BUTTONArray[count])) == LOW){
    if (MEM1Array [count] ==1){
      MEM2Array [count] = 1;
    }
    if (MEM1Array [count] ==0){
      MEM2Array[count] = 0;
    }
  }
  }
}


void giocoluci2() {
  delay(500);

  digitalWrite(LEDArray[4], LOW);
  digitalWrite(LEDArray[5], LOW);
  digitalWrite(LEDArray[14], LOW);
  digitalWrite(LEDArray[13], LOW);
  digitalWrite(LEDArray[14], LOW);
  digitalWrite(LEDArray[10], LOW);
  digitalWrite(LEDArray[11], LOW);
  delay(500);
  digitalWrite(LEDArray[0], HIGH);
  digitalWrite(LEDArray[9], HIGH);
  delay(100);
  digitalWrite(LEDArray[1], HIGH);
  digitalWrite(LEDArray[8], HIGH);
  delay(100);
  digitalWrite(LEDArray[2], HIGH);
  digitalWrite(LEDArray[7], HIGH);
  delay(100);
  digitalWrite(LEDArray[3], HIGH);
  digitalWrite(LEDArray[6], HIGH);
  delay(100);
  digitalWrite(LEDArray[5], HIGH);
  delay(100);
  digitalWrite(LEDArray[4], HIGH);
  delay(100);
  digitalWrite(LEDArray[14], HIGH);
  delay(100);
  digitalWrite(LEDArray[13], HIGH);
  digitalWrite(LEDArray[15], HIGH);
  delay(100);
  digitalWrite(LEDArray[12], HIGH);
  digitalWrite(LEDArray[16], HIGH);
  delay(100);
  digitalWrite(LEDArray[11], HIGH);
  delay(100);
  digitalWrite(LEDArray[10], HIGH);
  delay(400);
}

Arduino più semplice

int count = 0;
int b = 0;
int BUTTONArray[] = {23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 69, 68 };
int LEDArray[] = {22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 3, 4 } ;

int fineditutto = 0;

int led18 = 22;
int led19 = 24;
int led20 = 26;
int led21 = 28;
int led22 = 30;
int led23 = 32;
int led24 = 34;
int led25 = 36;
int led26 = 38;
int led27 = 40;
int led28 = 42;
int led29 = 44;
int led30 = 46;
int led31 = 48;
int led32 = 50;
int led33 = 52;
int led34 = 3;
int led35 = 4;

int MEM1Array[18];
int MEM2Array[18];

int combinazionegiusta;

int sendok; //emettitore

int reciveok;//ricevitore

int iniziacomunicazione = 0;


void setup() {

  for (count = 0; count < 18 ; count++) {     // imposta il pin digitale come output
    pinMode(BUTTONArray[count], INPUT);     // imposta il pin digitale come input
    pinMode(LEDArray [count], OUTPUT);
  }

  for (count = 0; count < 18 ; count++) {     // imposta il pin digitale come output
    digitalWrite(LEDArray [count], LOW);
  }

  Serial.begin(9600);
  Serial1.begin(9600);//ricevitore
  Serial3.begin(9600);//emettitore

  combinazionegiusta = 0;


  sendok = 0;

  reciveok = 0;

  MEM1Array[6] = 1;

}



void loop() {
  if (Serial1. available ()) {
    if (Serial1.read() == 4)
    {
      giocodiluci1();

      while (iniziacomunicazione == 0) {

        leggipulsantifabio();
   

        if  (MEM1Array[0] == 0 && MEM1Array[1] == 0 && MEM1Array[2] == 0 && MEM1Array[3] == 0 && MEM1Array[4] == 1 && MEM1Array[5] == 1 && MEM1Array[6] == 1 && MEM1Array[7] == 1 && MEM1Array[8] == 0 &&MEM1Array[9] == 0 && MEM1Array[10] == 0 && MEM1Array[11] == 0 && MEM1Array[12] == 1 && MEM1Array[13] == 1 && MEM1Array[14] == 0 && MEM1Array[15] == 0 && MEM1Array[16] == 0 && MEM1Array[17] == 0 ) {

          sendok = 1;

          Serial3.write(sendok);

          combinazionegiusta = 1;

        }

        else {

          sendok = 0;

          Serial3.write(sendok);

          combinazionegiusta = 0;

        }


        reciveok = Serial1.read ();


        if (combinazionegiusta == 1 && reciveok == 1 && MEM1Array[0] == 0 &&MEM1Array[1] == 0 && MEM1Array[2] == 0 && MEM1Array[3]== 0 && MEM1Array[4] == 1 && MEM1Array[5] == 1 &&MEM1Array[6] == 1 && MEM1Array[7] == 1 && MEM1Array[8] == 0 && MEM1Array[9] == 0 && MEM1Array[10] == 0 && MEM1Array[11] == 0 && MEM1Array[12] == 1 && MEM1Array[13] == 1 && MEM1Array[14] == 0 && MEM1Array[15] == 0 && MEM1Array[16] == 0 && MEM1Array[17] == 0) {

          giocoluci2();

          iniziacomunicazione = 1;
          for (count = 0; count < 18 ; count++) {
            digitalWrite (LEDArray[count], HIGH);
          }
          delay(300);
        }
      }



      while (iniziacomunicazione == 1) {

        for (count = 0; count < 18  ; count++)
        { if ((digitalRead(BUTTONArray[count])) == HIGH) {
            digitalWrite (LEDArray[count], LOW);
            delay(200);
            digitalWrite (LEDArray[count], HIGH);

            if (count == 0) {
              b = 0; //nonsense, tasto 18
            } //{a=6561;}
            else if (count == 1) {
              b = 0; //nonsense
            } //{a=6561;}
            else if (count == 2) {
              b = 0; //nonsense
            }//{a=6561;}
            else if (count == 3) {
              b = 0; //nonsense
            }//{a=6561;}
            else if (count == 4) {
              b = 0; //nonsense
            }//{a=6561;}
            else if (count == 5) {
              b = 0; //nonsense
            }//{a=6561;}
            else if (count == 6) {
              b = 1; // tu, tasto 24
            }//{a=27;}
            else if (count == 7) {
              b = 0; //nonsense
            }//{a=6561;}
            else if (count == 8) {
              b = 0; //nonsense
            }//{a=6561;}
            else if (count == 9) {
              b = 0; //nonsense
            }//{a=6561;}
            else if (count == 10) {
              b = 0; //nonsense
            }//{a=6561;}
            else if (count == 11) {
              b = 0; //nonsense
            }//{a=6561;}
            else if (count == 12) {
              b = 2; //dove. tasto 30
            }//{a=81;}
            else if (count == 13) {
              b = 0; //nonsense
            }//{a=6561;}
            else if (count == 14) {
              b = 4; //essere tasto 32
            }//{a=2187;}
            else if (count == 15) {
              b = 0; //nonsense
            }//{a=6561;}
            else if (count == 16) {
              b = 0; //nonsense
            }//{a=6561;}
            else if (count == 17) {
              b = 3; //noi , tasto 35
            }//{a=729;}
            /*valori (potenze di 3): 3, 9, 27, 81, 243, 729,2187, 6561,19683*/

            Serial3.write(b);
            Serial.println(count);
            Serial.println(b);
            delay (250);

          }

        }
        fineditutto = Serial1.read();
        if (fineditutto == 3) {
          iniziacomunicazione = 2;
        }


      }

      for (count = 0; count < 18 ; count++) {
        digitalWrite (LEDArray[count], LOW);
      }
    }
  }
}

void giocodiluci1 () {
  delay(500);


  digitalWrite(led18, LOW);

  digitalWrite(led19, LOW);

  digitalWrite(led20, LOW);

  digitalWrite(led21, LOW);

  digitalWrite(led22, LOW);

  digitalWrite(led23, LOW);

  digitalWrite(led24, LOW);

  delay(1000);

  digitalWrite(led26, HIGH);

  delay(100);

  digitalWrite(led27, HIGH);

  delay(100);

  digitalWrite(led28, HIGH);

  delay(100);

  digitalWrite(led29, HIGH);

  delay(100);

  digitalWrite(led31, HIGH);

  delay(100);

  digitalWrite(led32, HIGH);

  delay(100);

  digitalWrite(led33, HIGH);

  delay(100);

  digitalWrite(led34, HIGH);

  delay(100);

  digitalWrite(led35, HIGH);

  delay(100);

  digitalWrite(led30, HIGH);

  delay(100);

  digitalWrite(led22, HIGH);

  delay(100);

  digitalWrite(led21, HIGH);

  digitalWrite(led23, HIGH);

  delay(100);

  digitalWrite(led20, HIGH);

  digitalWrite(led24, HIGH);

  delay(100);

  digitalWrite(led18, HIGH);

  delay(100);

  digitalWrite(led19, HIGH);

  delay(100);

  digitalWrite(led25, HIGH);

  delay(100);

  digitalWrite(led25, LOW);

  delay(100);

  digitalWrite(led25, HIGH);

  delay(100);

  digitalWrite(led25, LOW);

  delay(100);

  digitalWrite(led25, HIGH);

  delay(100);

  digitalWrite(led25, LOW);

  delay(100);

  digitalWrite(led25, HIGH);

  delay(100);

  digitalWrite(led25, LOW);

  delay(100);

  digitalWrite(led25, HIGH);

  delay(1000);

  digitalWrite(led19, LOW);

  delay(100);

  digitalWrite(led18, LOW);

  delay(100);

  digitalWrite(led24, LOW);

  digitalWrite(led20, LOW);

  delay(100);

  digitalWrite(led21, LOW);

  digitalWrite(led23, LOW);

  delay(100);

  digitalWrite(led22, LOW);

  delay(100);

  digitalWrite(led30, LOW);

  delay(100);

  digitalWrite(led35, LOW);

  delay(100);

  digitalWrite(led34, LOW);

  delay(100);

  digitalWrite(led33, LOW);

  delay(100);

  digitalWrite(led32, LOW);

  delay(100);

  digitalWrite(led31, LOW);

  delay(100);

  digitalWrite(led29, LOW);

  delay(100);

  digitalWrite(led28, LOW);

  delay(100);

  digitalWrite(led27, LOW);

  delay(100);

  digitalWrite(led26, LOW);

  delay(100);
}


void leggipulsantifabio() {
  for (count == 0; count < 18; count ++) {
    if ((digitalRead(BUTTONArray[count])) == HIGH) {
      if (MEM2Array[count] == 0) {
        MEM1Array[count] = 1;
        digitalWrite (LEDArray[count], HIGH);
      }
      if (MEM2Array[count] == 1) {
        digitalWrite (LEDArray[count], LOW);
                      MEM1Array[count] = 0;
      }

    }
    if ((digitalRead(BUTTONArray[count])) == LOW) {
      if (MEM1Array [count] == 1) {
        MEM2Array [count] = 1;
      }
      if (MEM1Array [count] == 0) {
        MEM2Array[count] = 0;
      }
    }
  }
}



void giocoluci2() {
  delay(500);


  digitalWrite(led30, LOW);

  digitalWrite(led31, LOW);

  digitalWrite(led22, LOW);

  digitalWrite(led23, LOW);

  digitalWrite(led24, LOW);

  delay(500);

  digitalWrite(led26, HIGH);
  digitalWrite(led35, HIGH);

  delay(100);

  digitalWrite(led27, HIGH);

  digitalWrite(led34, HIGH);

  delay(100);

  digitalWrite(led33, HIGH);
  digitalWrite(led28, HIGH);

  delay(100);

  digitalWrite(led32, HIGH);
  digitalWrite(led29, HIGH);

  delay(100);

  digitalWrite(led30, HIGH);

  delay(100);

  digitalWrite(led31, HIGH);

  delay(100);

  digitalWrite(led22, HIGH);

  delay(100);

  digitalWrite(led21, HIGH);

  digitalWrite(led23, HIGH);

  delay(100);

  digitalWrite(led20, HIGH);

  digitalWrite(led24, HIGH);

  delay(100);

  digitalWrite(led18, HIGH);

  delay(100);

  digitalWrite(led19, HIGH);

  delay(100);

  digitalWrite(led25, HIGH);

  delay(100);

  digitalWrite(led25, LOW);

  delay(100);

  digitalWrite(led25, HIGH);

  delay(100);
}

Ecco qui ragazzi… spero che ora ci capiate… giuro che mi sono impegnata, ci ho messo un sacco

Scusa eh, ma invece di scrivere un’infinità di if … then … else, ma perché non rendi più pulito il codice ed usi uno switch … case ? la leggibilità e la manutenibilità migliorano di parecchio.

Ovvero, dato che ‘count’ è un intero, al posto di

              if (count == 0) {
                a = 1; //chi, tasto 1
              }
              else if (count == 1) {
                a = 3; //cosa, tasto 2
              }
              else if (count == 2) {
                a = 6561; //nonsense
              }
              else if (count == 3) {
                a = 6561; //nonsense
              }
              else if (count == 4) {
                a = 9; //volere, tasto 5
              }
              else if (count == 5) {
                a = 6561; //nonsense
              }
              else if (count == 6) {
                a = 6561; //nonsense
              }
              else if (count == 7) {
                a = 6561; //nonsense
              }
              else if (count == 8) {
                a = 19683; //ripeti, tasto 9
              }
              else if (count == 9) {
                a = 6561; //nonsense
              }
              else if (count == 10) {
                a = 6561; //nonsense
              }
              else if (count == 11) {
                a = 6561; //nonsense
              }
              else if (count == 12) {
                a = 6561; //nonsense
              }
              else if (count == 13) {
                a = 6561; //nonsense
              }
              else if (count == 14) {
                a = 243; //umani, tasto 15
              }
              else if (count == 15) {
                a = 6561; //nonsense
              }
              else if (count == 16) {
                a = 6561; //nonsense
              }

puoi scrivere in questo modo:

              switch (count)  {
                case 0:
                  a = 1;
                  break;
                case 1:
                  a = 3;
                  break;
                case 2:
                case 3:
                  a = 6561;
                  break;
                case 4:
                  a = 9;
                  break;
                case 5:
                case 6:
                case 7:
                  a = 6561;
                  break;
                case 8:
                  a = 19683;
                  break;
                case 9:
                case 10:
                case 11:
                case 12:
                case 13:
                  a = 6561;
                  break;
                case 14:
                  a = 243;
                  break;
                case 15:
                case 16:
                  a = 6561;
                  break;
                default:
                  a = 6561;
                  break;
              }

Guglielmo

P.S.: spero di aver copiato i valori giusti … comunque è il concetto che mi interessava farti capire :wink:

Ciao, grazie del consiglio, ho visto giusto una volta per caso usare la funzione switch, quando avevo già scritto lo sketch… insomma è una cosa abbastanza nuova… Per questo non l’ho usata. Provvederò :slight_smile:
Per quanto riguarda la seriale, sembra a posto lo sketch?

Nell’arduino semplice il vettore MEM1 non è inizialzzato se non nel sesto elemento. Gli altri avranno valori casuali alla creazione del vettore stesso.

Inoltre questo codice

    if ((digitalRead(BUTTONArray[count])) == LOW) {
      if (MEM1Array [count] == 1) {
        MEM2Array [count] = 1;
      }
      if (MEM1Array [count] == 0) {
        MEM2Array[count] = 0;

lo puoi semplificare con

if ((digitalRead(BUTTONArray[count])) == LOW) MEM2Array[count] = MEM1Array[count];

Grazie, tutti consigli preziosi :slight_smile:
Per quanto riguarda il vettore non inizializzato, mi sarà sfuggito perchè ho modificato il tutto per postarlo sul forum… lo sketch originale non ha nemmeno quell’array e non usa il ciclo FOR per la lettura dei pulsanti nella prima parte ( è la parte che non è stata curata da me e l’avevo tenuta così). Però funzionava, quindi non penso possa avere niente a che fare col problema della seriale (che si verifica nella parte successiva dello sketch)

Allora… c’ho provato, ma mi sono perso a metà… due commenti esplicativi avrebbero aiutato…
Per quello che ho visto, senza capire la logica dei 2 sketch, mi sono saltati all’occhio alcuni Serial.read() senza Serial.available() e alcuni Serial.available() senza Serial.read().
Dire che sono l’unica causa del problema è sicuramente esagerato, ma potrebbero essere parte del problema.

Accidenti i commenti li ho tolti quasi tutti perché avevo capito che rendessero lo sketch meno chiaro :frowning: Comunque immaginavo che nessuno ci avrebbe capito niente… già è un progetto piuttosto “pieno” come programmazione, e poi nonostante ci abbia lavorato tanto è ancora un po’ sporco… dunque per quanto riguarda la mancanza dei “serial. Available” è perché mi è stato detto che è superfluo… io non credendoci avevo già provato ad aggiungerli ma non era cambiato assolutamente niente…
Invece ad un certo punto c’è un serial. Available senza serial.read perché a me serve che l’arduino faccia una certa cosa non appena la porta diventa disponibile, indipendentemente dal valore che legge (di cui non mi interessa, per cui non glie l’ho nemmeno fatto leggere)

Niente dai, grazie comunque a chi ha dato un’occhiata :slight_smile:

Il read() senza l’available() restituisce comunque un valore (-1), anche se non c’è niente in arrivo sulla seriale. Quindi possono esserci delle situazioni in cui ti ritrovi con un valore senza senso.
La available() ti dice se c’è qualcosa disponibile sulla seriale, ma non lo toglie. Quindi alla read() successiva hai ancora quel valore.

Ed è possibile che Arduino mi converta il valore -1 in 1? Perché lui sul monitor seriale mi stampa come se avesse letto 1! Nel caso, è possibile che gli “tolga il -”?

Ad ogni modo, non penso il problema sia quello perché in quella parte di sketch lui develeggere solo nel caso in cui la porta è disponibile (c’è il comando serial.available). Inoltre queste due letture, quando va male, le fa solo a inizio ciclo, e dopo funziona. (Escluse quelle poche volte volte in cui ha continuato a ricevere per minuti interi, per poi riavviarsi da solo).

Ho notato anche che se apro il monitor seriale (che usa Serial0) l’arduino in questione si comporta come se avesse ricevuto un messaggio sulla porta che gli ho detto di usare per ricevere dall’altro Arduino (quindi serial3, ma ho provato anche la 2 e mi capita anche con quella).

Inoltre, i due Arduino sono alimentati o da PC o tramite una ciabatta e uno spinotto multi USB. Quando si presenta il problema, si presenta in entrambi i casi.

Concludo specificando che questo problema del “messaggio fantasma” a volte non si verifica e tutto funziona perfettamente (anche per 10 prove di fila).

Mah… dipende da come hai dichiarato la variabile dove salvi il valore. Cmq in linea di massima mi pare difficile.
Però senza capire cosa vorreste fare e come in realtà lo fate posso solo sparare un po’ a occhio.

Provo a spiegare un po’ lo sketch visto che mi sembri un esperto promettente :slight_smile:
Dunque il gioco è così:

Prima parte in cui tutti i pulsanti sono neri. Se li premi si accendono, se li premi nuovamente si spengono (è la funzione chiamata “leggipulsantifabio”).
Bisogna beccare una combinazione di alcuni pulsanti accesi ed altri spenti.

Gli Arduino verificano lo stato dei pulsanti comunicando costantemente tra loro e mandando il numero “1” quando la combinazione, per quanto riguarda la loro parte di pulsanti, è corretta, altrimenti 0.

Se la combinazione è giusta da entrambe le parti, c’è una accensione in serie di vari pulsanti (funzione giocodiluci1).

Dopodiché si esce dal ciclo while, e si entra in un altro ciclo while.

Stavolta, ogni pulsante rappresenta una parola, e il giocatore deve comporre delle frasi di tre parole premendo i pulsanti in successione. Ogni tre pulsanti premuti, gli Arduino verificano se è stata premuta una combinazione (frase) oppure no.
La cosa avviene assegnando un numero alla variabile A, diverso in base a che cosa è stato premuto: ognuno dei pulsanti “significativi” ha un suo numero, ed esiste un numero anche nel caso in cui venga premuto uno qualsiasi tra i pulsanti non significativi.

Ogni tre pulsanti premuti, vengono sommati i numeri di ognuno di questi pulsanti e ci sono 4 specifiche combinazioni (quindi somme) che provocano 4 tipi di risposte, più un quinto tipo di risposta se la somma non è nessuna delle 4.

Arduino A riceve i pulsanti di Arduino B. Viene utilizzata la porta seriale Serial.3.

Il problema avviene appena a inizio di questo secondo ciclo: entrambi gli Arduini leggono i loro pulsanti, e Arduino A legge anche la seriale 3. Solo se la seriale è available, legge il contenuto, che può essere (se non sbaglio) 0, 1, 2, 3, 4.

Quello che ogni tanto succede (e quando succede, il problema persiste fino a che non smanetto in qualche modo) è che, senza aver premuto alcun pulsante, Arduino A legge il valore 1 (a volte è capitato lo 0), per due volte. Senza che Arduino B trasmetta nulla. Quindi poi basta schiacciare un pulsante (letto come terzo input) e lui parte con una risposta. Dopodiché tutto funziona normalmente.

Se riavvio tutto, il problema rimane. A volte si risolve, ma non ho ancora capito come , poiché quando accade faccio di tutto: premo bene giù tutti i fili sui pin, stacco, riattacco, ricarico sketch, modifico sketch… insomma sembra tutto un po’ random. Quando funziona bene, funziona per un bel po’ di tempo. E a un bel momento torna a guastarsi.

Specifico che ci sono una miriade di fili, che il tutto viene mosso spesso e che i fili non sono saldati quindi ho incluso tra le ipotesi un problema di contatti.

Alle volte mi è successo che Arduino A, senza premere niente di niente, leggesse continuamente valori (mi pare 0 e 1), ad oltranza, per qualche minuto, poi si riavviasse da solo (come se avvenisse un reset).

Concludo dicendo che tutto lo sketch usa due porte per gli Arduino: con la 1, A manda e B riceve, mentre con la 3, B manda e A riceve.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.