Combinazione arduino con pulsanti

ciao ragazzi, ho provato a fare una cosa semplice per la scuola, praticamente devo premere una combinazione di tasti su 3 pulsanti: se la combinazione è errata non succede nulla, se è giusta allora lampeggiano 2 led
pur sembrando tutto giusto non funziona, chi sa darmi una mano?

const int button1=4;
const int button2=3;
const int button3=2;


const int led1=6;
const int led2=5;


int indice=0;

int pinPulsanti[]={4,2,3,3,4};
int sequenza[]= {4,2,3,3,4};
int codice[5];



void setup(){
  for (int indice=0; indice< 5; indice++){
    pinMode (pinPulsanti[indice], INPUT);
  }
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop(){
  for (int indice=0; indice<5; indice++) {
    codice[5]= digitalRead (pinPulsanti[indice]);
    if (codice [indice]== sequenza [indice]){
      digitalWrite(led1, HIGH);
      digitalWrite(led2, HIGH);
      delay (1000);
      digitalWrite(led1, HIGH);
      delay (300);
      digitalWrite(led2, HIGH);
      delay (300);
      digitalWrite(led1, HIGH);
      delay (300);
      digitalWrite(led2, HIGH);
    }
  }
}

Prima di tutto, essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ...

...poi, in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra). Grazie.

Guglielmo

..e DOPO che avrai fatto le cose richieste dal moderatore, direi che se non ci dici quale sia esattamente l'errore che riscontri è difficile, la mia sfera di cristallo l'ho prestata ad un amico... :wink:
Errore in compilazione? Se si, quale esattamente? Oppure un errore nel senso che non fa quello che ti aspetti? Ossia?

Gtanix oltre a presentarti devi anche editare il tuo primo messaggio e inserire il codice trai i tag code come indicato da Guglielmo, poi rivedi queste linee di codice che c'è qualcosina che non quadra :wink:

digitalRead(button1);
  digitalRead(button2);
  digitalRead(button3);
  if (button1 == HIGH)

questo è il nuovo programma, come mai non funziona?

const int button1=4;
const int button2=3;
const int button3=2;


const int led1=6;
const int led2=5;


int indice=0;

int pinPulsanti[]={4,2,3,3,4};
int sequenza[]= {4,2,3,3,4};
int codice[5];



void setup(){
  for (int indice=0; indice< 5; indice++){
    pinMode (pinPulsanti[indice], INPUT);
  }
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop(){
  for (int indice=0; indice<5; indice++) {
    codice[5]= digitalRead (pinPulsanti[indice]);
    if (codice [indice]== sequenza [indice]){
      digitalWrite(led1, HIGH);
      digitalWrite(led2, HIGH);
      delay (1000);
      digitalWrite(led1, HIGH);
      delay (300);
      digitalWrite(led2, HIGH);
      delay (300);
      digitalWrite(led1, HIGH);
      delay (300);
      digitalWrite(led2, HIGH);
    }
  }
}

-zef-:
Gtanix oltre a presentarti devi anche editare il tuo primo messaggio e inserire il codice trai i tag code come indicato da Guglielmo, poi rivedi queste linee di codice che c'è qualcosina che non quadra :wink:

digitalRead(button1);

digitalRead(button2);
  digitalRead(button3);
  if (button1 == HIGH)

ho cambiato il codice dimmi che ne pensi

Ad occhio vedo che c'é un po di confusione. In un programma simile io vedo bene una divisione in momenti:
0)led spenti e nessun pulsante premuto. In questo momento controllo in continuo se risulta premuto il primo pulsante
1)Se risulta premuto il primo pulsante passo al punto 1, alzando una flag. In questo punto faccio partire un dato timer millis() in cui controllo che sia premuto il pulsante successivo nella combinazione. Se si avanzo, se no torno al punto 0
3)Vedi punto 2
4)
5)
6)
.
.
.
N)Ad un certo punto, se é andato tutto bene, arriverò entro fine timer a premere l'ultimo tasto. Da qui é facile. Faccio scattare una seconda flag che mi fa lampeggiare i led. E alla fine del lampeggio torno alla fase 0

Ovviamente questa é soltanto una delle vie possibili, magari non la migliore, ma spero la piú semplice da scrivere

for viene eseguita in tempi rapidissimi, non segue il premere in sequenza i pulsanti per fare un confronto se è stato inserito il codice in modo corretto, basta che premi per un attimo un solo pulsante e in codice[] avrebbe tutti gli stessi valori anche se avresti scritto correttamente codice[indice] e non codice[5] che scrive sempre nello stesso punto dell'array.

Inoltre all'inizio del programma scrivi const int button1=4; per definire su quale pin è colelgato il pulsante, poi ti crei un array int pinPulsanti[]={4,2,3,3,4}; dove assegni di nuovo il pin 4 a pinPulsanti[0] e pinPulsanti[4] e idem per il pin 3 lo utilizzi due volte...

Ti consiglio di fare un passo indietro e ricominciare daccapo facendo un passo alla volta e verificando con Serial.print e il monitor seriale se quello che ti aspetti che succede funziona o meno

>gtanix: ti prego di NON usare il link "Report to moderator" per rispondere a domande o dare indicazioni sul codice. Quel link serve SOLO per segnalazioni importanti che richiedono un intervento di moderazione e quello che scrivi viene inviato a TUTTI i moderatori di TUTTO il forum Arduino !!!

Grazie,

Guglielmo

-zef-:
for viene eseguita in tempi rapidissimi, non segue il premere in sequenza i pulsanti per fare un confronto se è stato inserito il codice in modo corretto, basta che premi per un attimo un solo pulsante e in codice[] avrebbe tutti gli stessi valori anche se avresti scritto correttamente codice[indice] e non codice[5] che scrive sempre nello stesso punto dell'array.

Inoltre all'inizio del programma scrivi const int button1=4; per definire su quale pin è colelgato il pulsante, poi ti crei un array int pinPulsanti[]={4,2,3,3,4}; dove assegni di nuovo il pin 4 a pinPulsanti[0] e pinPulsanti[4] e idem per il pin 3 lo utilizzi due volte...

Ti consiglio di fare un passo indietro e ricominciare daccapo facendo un passo alla volta e verificando con Serial.print e il monitor seriale se quello che ti aspetti che succede funziona o meno

grazie mille ad entrambi, il problema è che non ho capito bene come dichiarare la sequenza giusta e come dire al programma che solo nel momento in cui il codice è giusto deve far lampeggiare i led,dal punto di vista circuitale spero sia giusto, scusate ma sono alle prime armi,comunque posto anche un'immagine circuitale.

Credo tu possa scrivere un array contenente i pin dei tasti, e un secondo array contenente, per richiamo, i pin dei tasto ordinati come sono nella password da inserire, inoltre una variabile che scorre l'array password e una variabile unsigned long per il timer (il tempo massimo tra una pressione e la successiva). Ogni volta che senti la pressione del tasto successivo della password carichi il timer e alzi di uno la variabile che ti indica il tasto successivo. Ogni volta che tale variabile raggiunge la lunghezza dell'array di password (ottenuta con sizeof(array)) faccio partire una funzione che esegue quello che é da eseguire a quel punto, e riporto l'indice della password a 0. Infine ogni qual colta termina il timer per la password riporto l'indice a 0.
Questo é sufficiente per risolvere il problema, ma per fare un lavoro completo, e stupire il prof, credo tu possa imparare l'uso dibuna tastiera. Vantaggi: con meno pin ottieni piú tasti (una 33 usa 6 pin e ha 9 tasti. 44=8 pin, 16 tasti...)

Silente:
Credo tu possa scrivere un array contenente i pin dei tasti, e un secondo array contenente, per richiamo, i pin dei tasto ordinati come sono nella password da inserire, inoltre una variabile che scorre l'array password e una variabile unsigned long per il timer (il tempo massimo tra una pressione e la successiva). Ogni volta che senti la pressione del tasto successivo della password carichi il timer e alzi di uno la variabile che ti indica il tasto successivo. Ogni volta che tale variabile raggiunge la lunghezza dell'array di password (ottenuta con sizeof(array)) faccio partire una funzione che esegue quello che é da eseguire a quel punto, e riporto l'indice della password a 0. Infine ogni qual colta termina il timer per la password riporto l'indice a 0.
Questo é sufficiente per risolvere il problema, ma per fare un lavoro completo, e stupire il prof, credo tu possa imparare l'uso dibuna tastiera. Vantaggi: con meno pin ottieni piú tasti (una 33 usa 6 pin e ha 9 tasti. 44=8 pin, 16 tasti...)

che ne dici di così, mi da expected primary expression token

int led2=5;
int led1 = 6;
int sequenza[] = {4,3,2,3};
int pulsantiPremuti[4];

int button1 = 4;
int button2 = 3;
int button3 = 2;
int codice[5];

int i = 0;

void setup() {
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
}
  
void loop() {
  digitalRead(button1);
  digitalRead(button2);
  digitalRead(button3);
  
  if (button1 == HIGH) {
    codice[1] = 4;
    i++;
  if (button2 == HIGH) {
    codice[2] = 3;
    i++;
  if (button3 == HIGH) {
    codice[3] = 2;
    i++;
    
if (i == 4) {
   {if (pulsantiPremuti[] == sequenza[]) {
     digitalWrite(led1, HIGH);
     digitalWrite(led2,HIGH);
     }
     }
     }
     }
     }
     }
}
  1. Prendi il codice, usa l'apposito strumento del IDE che trovi in Tools -> Auto Format così da renderlo correttamente indentato ovunque !

  2. NON è amesso il confronto che hai fatto tu : "if (pulsantiPremuti[] == sequenza[])" devi usare le funzioni di comparazione che trovi nella AVR libc (libreria sempre inclusa di base in ogni programma) in <string.h> o effettuare la comparazione elemento per elemento.

Guglielmo

continui a fare gli stessi errori:

digitalRead(button1);
  digitalRead(button2);
  digitalRead(button3);
  
  if (button1 == HIGH) {

leggi i tre pulsanti ma non salvi da nessuna parte il risultato, messi così i digitalRead non servono a nulla, poi fai il confronto se button1 è high, visto che lo hai dichiarato con un valore di 4 con "int button1 = 4;" sarà sempre high indipendentemente dal premere o meno il pulsante collegato al pin 4...

-zef-:
continui a fare gli stessi errori:

digitalRead(button1);

digitalRead(button2);
  digitalRead(button3);
 
  if (button1 == HIGH) {




leggi i tre pulsanti ma non salvi da nessuna parte il risultato, messi così i digitalRead non servono a nulla, poi fai il confronto se button1 è high, visto che lo hai dichiarato con un valore di 4 con "**int button1 = 4;**" sarà sempre high indipendentemente dal premere o meno il pulsante collegato al pin 4...

come faccio a farli risultare normalmente chiusi?

gtanix:
come faccio a farli risultare normalmente chiusi?

Scusa ... ma cosa c'entra ?

Ti sta dicendo che tutte quelle istruzioni NON hanno senso ...
... le prime tre perché NON salvi da nessuna parte lo stato del bottone che leggi e quindi ... che lo leggi a fare ?
... la IF perché tu confronti una variabile che contiene il numero di un pin (e NON il valore che assume il pin) con un livello logico !

Corregile e poi si vede ... ::slight_smile:

Guglielmo

Io personalmente procederei in maniera diversa. Salverei la combinazione come int e poi assegnerei ad ogni tastp una cifra, moltiplicandola per 10 alla potenza dell'ordine del tasto partendo da 0. Ad esempio se è la terza volta che premi elevi 10 alla 2 poi sommi tutti questi numeri e se corrispondono Alla passw accendi i led. Ovviamente la password di confronto andrà salvata al contrario. Ad esempio se vuoi la combinazione 3 2 3 1 l'intero corrispondente sarà 1323

ghiso983:
Io personalmente procederei in maniera diversa. ...

Se il tastierino ha solo tasti numerici, mi sembra una semplice ed efficiente soluzione ... in questo modo deve fare solo un banale confronto tra due interi :slight_smile:

Guglielmo

Credo sia veramente un idea geniale. Non capisco solo perché andrebbe salvata rovescia la password. Se vuoi premere prima il tasto 3, poi il 2, poi l'1 allora il numero deve essere 321 (il primo numero moltiplicato due volte da 300+ il secondo moltiplicato una da 20+ il terzo ed ultimo mai moltiplicato da 1)

-zef-:
continui a fare gli stessi errori:

digitalRead(button1);

digitalRead(button2);
  digitalRead(button3);
 
  if (button1 == HIGH) {




leggi i tre pulsanti ma non salvi da nessuna parte il risultato, messi così i digitalRead non servono a nulla, poi fai il confronto se button1 è high, visto che lo hai dichiarato con un valore di 4 con "**int button1 = 4;**" sarà sempre high indipendentemente dal premere o meno il pulsante collegato al pin 4...

ho provato a seguire i tuoi consigli, che ne dici, adesso salva gli stati giusto?Come procedo?

const int button1=4;
const int button2=3;
const int button3=2;


const int led1=6;
const int led2=5;


int indice=0;

int pinPulsanti[]={4,2,3,3,4};
int sequenza[]= {4,2,3,3,4};
int codice[5];

long debounceDelay = 5000;

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


void setup(){
  for (int indice=0; indice< 5; indice++){
    pinMode (pinPulsanti[indice], INPUT);
  }
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop()
{
	val1 = digitalRead(button1);
	val2 = digitalRead(button2);
	val3 = digitalRead(button3);
}