[Risolto] Combinazione Pulsanti

Vorrei realizzare un piccolo circuito che, immettendo una sequenza tramite 4 pulsanti, la confronti con una caricata al interno dello sketch e se le due corrispondono si dovrebbe accendere un led.
Il problema sta nella realizzazione dello sketch poiché la parte circuitale non è un problema.
Ho già scritto uno uno sketch che pero non funziona:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int  button1 = 10;
const int  button2 = 9;
const int  button3 = 8;
const int  button4 = 7;





int val1= 0;
int val2= 0;
int val3= 0;
int val4= 0;

int i = 0;

int codice[4] = {val1, val2, val3, val4};  
int sequenza[4] = {button3, button1, button4, button2};

void setup() {
  lcd.begin(16, 2);
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);
  pinMode(button4, INPUT);
  }

void loop() {
    val1 = digitalRead(button1);
    val2 = digitalRead(button2);
    val3 = digitalRead(button3);
    val4 = digitalRead(button4);
   for(i=0; i<4; i++) { 
    if (codice[i] == sequenza[i]) {
     lcd.clear();
     lcd.setCursor(2,0);
     lcd.print("System Armed");
    
     }
     }
     }

Potreste indicarmi dove sbaglio?
La scheda Arduino che utilizzo è - Arduino UNO Rev.3- (Atmega328)
Grazie in anticipo per le risposte.

io farei semplicemente

cicla fino a che i=4
se è premuto un pulsante
vet(i)=pulsante
i++

poi con un ciclo confronti i due vettori..

int sequenza[4] = {button3, button1, button4, button2};

non Ti fa un array con i contenuti delle variabili button1 fino button4.
Perché non leggi i stati dei pulsanti direttamente nel array?

sequenza[0]= digitalRead(button1);

o meglio leggi lo stato del pulsante durante il controllo mettendo i Pin dei 4 pulsanti in un altro array:

if (codice[ i ] == digitalRead(button[ i ])) {

Ciao Uwe

Ho provato con questo codice dove metto i Pin dei pulsanti in un array, ne creo un altro con la combinazione e un altro vuoto dove memorizzare gli input; ma lo stesso non funziona!

int led = 9;
int pinPulsanti[] = {13,12,11,10};
int sequenza[] = {13,12,11,10};
int codice[5];


void setup() {
  for(int indice = 0; indice < 4; indice++)  {
  pinMode(pinPulsanti[indice], INPUT);
  pinMode(led, OUTPUT);
  }
 }

void loop() {
    for(int indice = 0; indice < 4; indice++)  {
    codice[5] = digitalRead(pinPulsanti[indice]);
    if (codice[indice] == sequenza[indice]) {
     digitalWrite(led, HIGH);
     }
     }
     }

Dove sbaglio?

int led = 9;
int pinPulsanti[] = {13,12,11,10};
int sequenza[] = {13,12,11,10};
int codice[5];


void setup() {
  for(int indice = 0; indice < 4; indice++)  {
  pinMode(pinPulsanti[indice], INPUT);
  pinMode(led, OUTPUT);// pignoleria: va messo fuori dal ciclo for perchè così lo inizializzi 4 volte di fila
  }
 }

void loop() {
    for(int indice = 0; indice < 4; indice++)  {
    codice[5] = digitalRead(pinPulsanti[indice]); // aggiorni sempre lo stesso elemento dell'array
    if (codice[indice] == sequenza[indice]) { // sequenza[indice] può valere 13,12,11 oppure 10, come fa corrispondere allo stato del pulsante?
     digitalWrite(led, HIGH);
     }
     }
     }

Leggi i commenti che ho messo e ritenta :wink:

L'errore è qui:

int pinPulsanti[] = {13,12,11,10};
int sequenza[] = {13,12,11,10};

Crei un vettore che contiene i numeri 13, 12, 11 e 10. Non lo stato dei pulsanti D13, D12, D11 e D10.
Te lo aveva già suggerito Uwe

for(int indice = 0; indice < 4; indice++)  {
    codice[5] = digitalRead(pinPulsanti[indice]); 
    if (codice[indice] == sequenza[indice]) { del pulsante?
     digitalWrite(led, HIGH);
}}

scrivi il valore letto fuori dal Array ( l' array di 5 elementi ha gli elementi da 0 a 4) e percui sovvrascrivi la variabile che é memorizzata nella Ram dopo l# array (non so dirti quale é)
Il secondo errore é che scrivi il pulsante in un elemento fisso che alla fine non viene confrontato col array di riferimento.

Altro consiglio metti una funzione a temp ( per esempio 5 secondi entro il quale il codice deve essere inserito senó si svuota il array di ricezione (codice)). In questo modo quando hai sbagliato a inserire il codice riparte dopo 5 secondi da zero.

Questa logica di leggere i pin non funziona come vorresti. Devi immettere il codice in qualche microsecondo perché la lettura dei pulsanti avviene con questa velocitá.
La lettura deve avvenire con una logica diversa.

Devi leggere tutti 4 pulsanti.
Controlli se non sono premuti 2 pulsanti in contemporanea. se sí la lettura viene scartata
Se un pulsante é premuto scrivi il relativo numero nel array pulsanti premuti
Incrementi l' indice dell array pulsanti premuti
Aspetti che il pulsante sia stato rilasciato
Se l'array pulsanti premuti é pieno ( premuti il numero di pulsanti correspondenti alla lunghezza del codice segreto) fai il controllo dell'array pulsanti premuti. Accendi il led e svuoti l' array pulsanti premuti premuta e azzeri l'indice dell'array pulsanti premuti.
Se é passato il tempo utile per immettere la sequenza svuoti l' array pulsanti premuti premuta e azzeri l'indice dell'array pulsanti premuti.
Riparti con questo ciclo.

Ciao Uwe

Ho provato con quest' altro codice ma mi da errore nella compilazione

int led = 12;
int sequenza[] = {10,9,8,7};
int pulsantiPremuti[4];

int button1 = 10;
int button2 = 9;
int button3 = 8;
int button4 = 7;

int i = 0;

void setup() {
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);
  pinMode(button4, INPUT);
  pinMode(led, OUTPUT);
  
void loop()  {
  digitalRead(button1);
  digitalRead(button2);
  digitalRead(button3);
  digitalRead(button4);
  
  if (button1 == HIGH) {
    codice[1] = 10;
    i++;
  if (button2 == HIGH) {
    codice[2] = 9;
    i++;
  if (button3 == HIGH) {
    codice[3] = 8;
    i++;
  if (button4 == HIGH) {
    codice[4] = 7;
    i++;
    
 if (i == 4) {
   if (pulsantipremuti[] == sequenza[]) {
     digitalWrite(led, HIGH);
     }
     }
     }
     }
     }
     }
     }
     }

Uwe ha detto che il codice deve essere inserito in qualche microsecondo, ma come non so come fare.
Scusate ma sono alle prime armi con Arduino.

Hertz:
Uwe ha detto che il codice deve essere inserito in qualche microsecondo, ma come non so come fare.

Intendevo dire che il Sketch era scritto in moco che Tu dovevi inserire da tastiera il codice in velocitá supersonica.

Ti da problemi in compilazione perché
if (pulsantipremuti[] == sequenza[]) {
mancano gli indici.

Il Sketch fa illuminare il LED se schiacci tutti i 4 pulsanti in contemporanea.
Ciao Uwe

Grazie a tutti per le risposte.
Alla fine ci sono riuscito! Ora per migliorare il progetto avevo pensato di immettere la sequenza con un telecomando a infrarossi con il ricevitore
IRM-3638.
Cosa ne pensate?

Mi permetto di dirti che come scrivi il codice (indentazione e parentisi graffe) non permette una facile lettura del codice:

void loop()  
{ digitalRead(button1);
  digitalRead(button2);
  digitalRead(button3);
  digitalRead(button4);
  if (button1 == HIGH) 
  { codice[1] = 10;
    i++;
    if (button2 == HIGH) 
    { codice[2] = 9;
      i++;
      if (button3 == HIGH) 
      { codice[3] = 8;
        i++;
        if (button4 == HIGH) 
       { codice[4] = 7;
         i++;
         if (i == 4) 
         {  if (pulsantipremuti[] == sequenza[]) // test errato
            { digitalWrite(led, HIGH);
            }
         }
       }
     }
  }

Come l'ho scritto io è evidente che gli if sono uno DENTRO all'altro, nel tuo codice sembrava quasi fosse un select (if multiplo)
Come le ho scritte io, le graffe chiuse devono essere sulla stessa colonna delle corrispondente graffa aperta. Molto più semplice non perdersi con le chiusure di graffa. Di solito mi sposto di 2 spazi alla volta.
Infatti tu di graffe ne chiudi a bizzeffe e a caso. Una di quelle graffe poi è da mettere moolto prima. La setup() deve avere la sua chiusa graffa PRIMA della loop

void setup()
{
}

void loop()
{
}