Tastiera a matrice per inserire password ed attivazione impianto antintifurto

Buonasera a tutti,
è il primo post che scrivo e spero di essere completo.

Sto progettando un impianto antintrusione. Per adesso mi sto limitando ad imparare a programmare i vari componenti e, dopo averne preso coscienza, creare il progetto vero e proprio.
Il problema che vorrei sottoporvi è questo, ho comprato una tastiera a matrice 4x4 e vorrei utilizzarla in modo tale che, una volta inserita una password (Es. 1234A) essa mi attivi un loop output (accendere un led o far suonare una piezo o, in futuro, mi attivi l'antifurto).

Seguendo i vari tutorial il rete ho impostato la tastiera affinchè mi dia i feedback dei tasti pigiati sul monitor seriale ma proprio non riesco a risolvere il problema della password.

Potete aiutarmi? Grazie

Antonio 8)

Cosa é il Tuo problema? Spiega le cose concretamente.
Ciao Uwe

uwefed:
Cosa é il Tuo problema? Spiega le cose concretamente.
Ciao Uwe

il codice è questo

#include <Keypad.h>
#define LED 13

const byte ROWS = 4; // Quattro righe
const byte COLS = 4; // Quattro colonne
// Definizione mappa della tastiera
byte keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {
  9, 8, 7, 6 }; // Connessione delle righe: Riga0, Riga1, Riga2 e Riga3 ai pins di Arduino.
byte colPins[COLS] = {
  5, 4, 3, 2 }; // Connessione delle colonne: Colonna0, Colonna1 , Colonna2 e Colonna3 ai pins di Arduino. 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); 
 // Creazione della tastiera



void setup() {
  Serial.begin(9600);
  pinMode (LED, OUTPUT);
}
void loop()
{
  digitalWrite (LED, LOW); 
  char key = keypad.getKey();
   
   
  
  if (key != NO_KEY){
    Serial.println(key);
  }
     if (keypad.getKeys())
    {digitalWrite (LED, HIGH);
    }       
}

in questo momento vorrei fare in modo che digitando sulla tastiera il codice 123A mi si deve accendere il LED.

Grazie

@ supremo_dkg : Invece di usare stravaganti ed invisibili colori per il codice (sul mio iMac NON si vede) ... usa, come da REGOLAMENTO, i tag "code (bottone # che hai quando sei in edit ... terzultimo della seconda fila).

Cortesemente ... correggi il tuo precedente post racchiudendo il codice nei suddetti TAG. Grazie.

Guglielmo

gpb01:
@ supremo_dkg : Invece di usare stravaganti ed invisibili colori per il codice (sul mio iMac NON si vede) ... usa, come da REGOLAMENTO, i tag "code (bottone # che hai quando sei in edit ... terzultimo della seconda fila).

Cortesemente ... correggi il tuo precedente post racchiudendo il codice nei suddetti TAG. Grazie.

Guglielmo

Guglielmo come ho scritto all'inizio del post è la prima volta che scrivo su questo forum e mi scuso in anticipo se sbaglio qualcosa. Non volevo ASSOLUTAMENTE andare contro il REGOLAMENTO.

Perdonato … :grin: :grin: :grin: :grin: :grin:

A parte scherzi, hai visto che non si leggeva nulla ??? Non solo, se non si usano i tag CODE, a volte ci sono combinazioni di caratteri nel codice che … guarda caso corrispondono alle stesse combinazioni di alcune faccine e … ti ritrovi il codice cambiato con l’inserimento di “smiles” :stuck_out_tongue_closed_eyes:

Guglielmo

supremo_dkg:
in questo momento vorrei fare in modo che digitando sulla tastiera il codice 123A mi si deve accendere il LED.

Come hai ben visto, tu leggi un tasto alla volta.

Quello che dovrai fare è allora un ciclo in cui leggerai più volte la tastiera, salverai il valore letto in un elemento di un array e, letti 4 caratteri, andrai a vedere se nell'array hai 1 2 3 A ...
... se SI, accenderai il LED, se no cancellerai tutto e ricomincerai a leggere il nuovo pin.

Magari io prevederei anche un tasto che, se premuto, dice al programma di cancellare tutto e ricominciare da capo (es. il tasto #) ...
... ma questo lo puoi fare dopo ... come dopo potrai aggiungere anche un meccanismo di timeout ...

Una cosa per volta ... :wink:

Guglielmo

grazie mille.

Ora provo, vediamo cosa ne esce!! Mi sai indirizzare sul metodo per racchiudere i tasti premuti in un array?

http://arduino.cc/en/Reference/Array
prendi una variabielche fa da indice e carichi il primo tasto nel primo elemento del array e poi incrementi l’ indice per caracare il prossimo tasto nel sucessivo elemento del array. Arrivato al 4 tasto controlli.
Ciao Uwe

io ci ho provato ma purtroppo senza buoni risultati.

#include <Keypad.h>
#define LED 13

const byte ROWS = 4; // Quattro righe
const byte COLS = 4; // Quattro colonne
// Definizione mappa della tastiera
byte keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'},
};
byte rowPins[ROWS] = {
  9, 8, 7, 6 }; // Connessione delle righe: Riga0, Riga1, Riga2 e Riga3 ai pins di Arduino.
byte colPins[COLS] = {
  5, 4, 3, 2 }; // Connessione delle colonne: Colonna0, Colonna1 , Colonna2 e Colonna3 ai pins di Arduino. 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); 
 // Creazione della tastiera

int code [] = {1,2,3,4};
int = i

void setup() {
  Serial.begin(9600);
  pinMode (LED, OUTPUT);
}
void loop()
{
  digitalWrite (LED, LOW); 
  char key = keypad.getKey();
  int code [0] = key;
  setDebounceTime (10);
  char key = keypad.getKey();
  int code [1] = key;
  setDebounceTime (10);
  char key = keypad.getKey();
  int code [2] = key;
  setDebounceTime (10);
  char key = keypad.getKey();
  int code [3] = key;
   

if (int code[]== {1,2,3,4}) {
  digitalWrite (LED, HIGH);
  
}
}

dove sto sbagliando?

Ps. mi sto avvicinando adesso alla programmazione, prima di scrivervi ho studiato anche la sezione dedicata alle array su html.it con la speranza di schiarirmi le idee!!!

Allora ... cominciamo a correggere alcune cose ...

  1. Hai già dichiarato globale la variabile code di quattro elementi che, all'inizio, contengono 1,2,3,4 e quindi, in seguito, NON devi ridichiararla ...
int code [] = {1,2,3,4};

Se non ti serviva inizializzarla, potevi semplicemente scrivere :

int code [4];
  1. Dato che l'hai già dichiarata globale, all'interno delle funzioni (es. loop()) NON la devi dichiarare di nuovo, cosa che invece tu, inconsciamente fai ...
int code [0] = key;

Devi scrivere solamente :

code [0] = key;
  1. A parte l'errore di dichiarare ancora una volta un'altra variabile code (... NON devi mettere ogni volta int, altrimenti il compilatore pensa che stai dichiarando una nuova variabile di tipo int), sarebbe bello se si potesse fare così ...
if (int code[]== {1,2,3,4}) {

... purtroppo NON si può ed occorre confrontare ciascun elemento.

Sei all'inizio e quindi fallo nella maniera più "brutale" ...

if ( (code[0] == 1) && (code[1] == 2) && (code[2] == 3) && (code[3] == 4) ) {

... in realtà ci sono sistemi più eleganti, ma ... come detto, impara una cosa per volta :wink:

Guglielmo

P.S. : Sicuro che keypad.getKey() ritorna il valore numerico 1,2,3,4 e non il carattere ASCII corrispondente da te definito '1', '2', '3', '4' ? Perché altrimenti così non ti funziona ... e devi fare i confronto mettendo gli apicetti ...

Aggiungo che dato che il valore tornato dalla keypad.getKey() è un char ... allora, per non complicarti la vita, anche l'array code è bene dichiaralo di 4 char e non di 4 int !!!

Non ho mai usato quella libreria, ma mi sembra di capire che alla pressione del tasto 1 ti ritorna quello che tu hai definito, ovvero il CARATTERE 1 che è ben diverso dal valore 1.

Il valore 1 vale numericamente 1, il carattere '1' ASCII vale numericamente 49 !!!

I confronti nelle if dovrai quindi farli racchiudendo il carattere tra singoli apici !

Guglielmo

sto scendendo e non ho tempo di correggere lo sketch ma stasera lo farò sicuramente.

Grazie mille Guglielmo, sei diventato il mio maestro!!!! :grin:

un'informazione, la variabile di tipo char mi permette anche di inserire le lettere giusto? quindi potrei creare un codice 1,2,3,4,A?

a più tardi!!!

supremo_dkg:
un'informazione, la variabile di tipo char mi permette anche di inserire le lettere giusto? quindi potrei creare un codice 1,2,3,4,A?

Si, certamente, anche perché ... quella che per te è una lettera, esempio 'A', nel codice ASCII corrisponde al valore numerico 65 quindi internamente ... sempre con un numero è memorizzata :wink:

Guglielmo

eccomi qui, ho modificato il codice come mi ha consigliato Guglielmo

#include <Keypad.h>
#define LED 13

const byte ROWS = 4; // Quattro righe
const byte COLS = 4; // Quattro colonne
// Definizione mappa della tastiera
byte keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'},
};
byte rowPins[ROWS] = {
  9, 8, 7, 6 }; // Connessione delle righe: Riga0, Riga1, Riga2 e Riga3 ai pins di Arduino.
byte colPins[COLS] = {
  5, 4, 3, 2 }; // Connessione delle colonne: Colonna0, Colonna1 , Colonna2 e Colonna3 ai pins di Arduino. 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); 
 // Creazione della tastiera

char code [4] 
int = i

void setup() {
  Serial.begin(9600);
  pinMode (LED, OUTPUT);
}
void loop()
{
  digitalWrite (LED, LOW); 
  char key = keypad.getKey();
   code [0] = key;
  setDebounceTime (10);
  char key = keypad.getKey();
   code [1] = key;
  setDebounceTime (10);
  char key = keypad.getKey();
   code [2] = key;
  setDebounceTime (10);
  char key = keypad.getKey();
   code [3] = key;
   

  if ( (code[0] == '49') && (code[1] == '50') && (code[2] == '51') && (code[3] == '65') ) {
  digitalWrite (LED, HIGH);
  
}
}

Il problema adesso è che l’IDE mi evidenzia questa parte di codice:

byte keys[ROWS][COLS] = {

e mi riporta come errore la seguente frase:

error: expected constructor, destructor, or type conversion before ‘void’

a cosa è dovuto?

Un’altra curiosità, per vedere se ho capito bene, quando pigio un tasto sulla tastiera a matrice, l’IDE, non vede un cambiamento di stato HIGH - LOW ma richiama il carattere ASCII che ho utilizzato in questa parte di codice per definire il pulsante?

byte keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'},
};

Grazie

Antonio

Antonio,
non volermene, ma devi studiarti un po’ di più Arduino ed il suo linguaggio … intendo proprio un po’ di basi teoriche …

1° errore semplice … (e questo è di distrazione)

byte keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

… l’ultimo array NON deve finire con una virgola visto che non c’è altro che segue.

altri errori più gravi (… e questi sono per gravi lacune) …

a) punti e virgola mancanti , assegnazione di un typo ad una variabile …

char code [4] 
int = i

… devi scrivere :

char code [4] ;
int  i;

b) variabili locali e globali …
il tipo davanti ad una variabile va messo solo quando la si dichiara, no ogni volta … altrimenti si definiscono N variabili diverse !!! Quindi, visto che a te serve molte volte “key” la definisci fori come variabile globale e NON 4 volte come locale …

char code [4] ;
int  i;
char key;

e poi nelle chiamate NON devi definire il tipo … per cui :

key = keypad.getKey();

c) setDebounceTime è un metodo della classe Keypad … non la puoi chiamare così , ma, come hai fatto per la getKey() la devi chiamare così :

keypad.setDebounceTime (10);

d) Se usi i singoli apici identifichi dei caratteri ASCII e non il loro valore ! Quindi nell’ IF , ad esempio, o metti code[0] == 49 oppure metti code[0] == ‘1’ e così via …
Può sembrare strano, ma in C … un apicetto fa molta differenza !!!

Quindi … il codice diventa :

#include <Keypad.h>
#define LED 13

const byte ROWS = 4; // Quattro righe
const byte COLS = 4; // Quattro colonne
// Definizione mappa della tastiera
byte keys[ROWS][COLS] = {
   {
      '1','2','3','A'   }
   ,
   {
      '4','5','6','B'   }
   ,
   {
      '7','8','9','C'   }
   ,
   {
      '*','0','#','D'   }
};
byte rowPins[ROWS] = {
   9, 8, 7, 6 }; // Connessione delle righe: Riga0, Riga1, Riga2 e Riga3 ai pins di Arduino.
byte colPins[COLS] = {
   5, 4, 3, 2 }; // Connessione delle colonne: Colonna0, Colonna1 , Colonna2 e Colonna3 ai pins di Arduino. 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); 
// Creazione della tastiera

char code [4];
int i;
char key;

void setup() {
   Serial.begin(9600);
   pinMode (LED, OUTPUT);
}
void loop()
{
   digitalWrite (LED, LOW); 
   key = keypad.getKey();
   code [0] = key;
   keypad.setDebounceTime(10);
   key = keypad.getKey();
   code [1] = key;
   keypad.setDebounceTime (10);
   key = keypad.getKey();
   code [2] = key;
   keypad.setDebounceTime (10);
   key = keypad.getKey();
   code [3] = key;


   if ( (code[0] == '1') && (code[1] == '2') && (code[2] == '3') && (code[3] == 'A') ) {
      digitalWrite (LED, HIGH);

   }
}

… che non so se funziona o meno … dato che non ho la tastiera :grin: :grin: :grin:

Guglielmo

:blush: scusate prof.

ci tengo a precisare che un po degli errori che mi hai elencato li avevo gia corretti e non ho avuto il tempo di ripostare il codice..... =(

grazie

supremo_dkg:
:blush: scusate prof.

:grin: :grin: :grin: uno che mi desse del Prof. mi mancava ... XD XD XD

Guglielmo

Nada de Nada.

L’IDE non mi restituisce errori ma manco si accende sto benedetto LED

#include <Keypad.h>
#define LED 13

const byte ROWS = 4; // Quattro righe
const byte COLS = 4; // Quattro colonne

// Definizione mappa della tastiera
byte keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {
  9, 8, 7, 6 }; // Connessione delle righe: Riga0, Riga1, Riga2 e Riga3 ai pins di Arduino.
byte colPins[COLS] = {
  5, 4, 3, 2 }; // Connessione delle colonne: Colonna0, Colonna1 , Colonna2 e Colonna3 ai pins di Arduino. 
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); 
 // Creazione della tastiera

char code [4]; 
char key;

void setup() {
  Serial.begin(9600);
  pinMode (LED, OUTPUT);
}
void loop()
{
  if (key != NO_KEY)
  Serial.println(key);
       
  digitalWrite (LED, LOW);
 
  key = keypad.getKey();
   code [0] = key;
   keypad.setDebounceTime (5);
   
  key = keypad.getKey();
   code [1] = key;
   keypad.setDebounceTime (5);
  
  key = keypad.getKey();
   code [2] = key;
   keypad.setDebounceTime (5);
  
  key = keypad.getKey();
   code [3] = key;
   keypad.setDebounceTime (5);
   

  if ((code[0] == '1') && (code[1] == '2') && (code[2] == '3') && (code[3] == 'A')) {
  digitalWrite (LED, HIGH);
  
}
}