Tastiera a matrice per inserire password ed attivazione impianto antintifurto

ho trovato questo esempio online che fa proprio al caso mio, ora me lo studio ben benino!!!

Ah, bé .. così di sicuro non lo vedi accendersi ...
... guarda cosa hai scritto e DOVE lo hai scritto ... XD

Sei in un loop() che gira in continuazione ...
... ad inizio loop spegni il LED ...
... con l'IF lo accendi e ... qualche microSecondo dopo, torni ad inizio del loop e ... lo spegni :grin: :grin: :grin:

Come pretenderesti di vederlo acceso ??? :astonished:

Guglielmo

Prof l'ho messo anche nel void setup ed addirittura cancellato ma nulla. :roll_eyes:

per caso hai visitato il link che ho postato? mi togli spieghi una cosa, pensavo esistessero soltanto void setup e void loop, invece vedo che la parola void viene utilizzata in continuazione. a che serve?

Come ti ho già detto ... purtroppo per fare bene le cose tocca studiare ...

Libreria Keypad ... QUI ... leggi le funzioni che hai usato e vedrai ... che è impossibile che tu riesca a far funzionare il programma così ...
... in particolare ... vedi la differenza tra la waitForKey() e la getKey() ???

Or ... ragiona ... quante probabilità ci sono che in pochi microSecondi tu abbia digitato la combinazione ??? :grin:

Devi usare funzioni che si fermano e aspettano (... wait forever until someone presses a key), non funzioni che passano via senza attendere (... Returns the key that is pressed, if any. This function is non-blocking) !

Dimmi se ti è chiaro il concetto ...

Guglielmo

P.S. : No, non ho guardato il link, non mi interessa che si copi un qualche cosa senza capire, mi interessa che uno "capisca" e che domani, una volta capito, sappia fare da solo !

P.P.S : per il "void" ... leggiti tutta QUESTA discussione ... e se dopo hai ancora dubbi, chiedi :wink:

EUREKA!!!!! Funzionaaaaaaa :grin: :grin:

#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.waitForKey();
   code [0] = key;
   //keypad.setDebounceTime (5);
   
  key = keypad.waitForKey();
   code [1] = key;
   //keypad.setDebounceTime (5);
  
  key = keypad.waitForKey();
   code [2] = key;
   //keypad.setDebounceTime (5);
  
  key = keypad.waitForKey();
   code [3] = key;
   //keypad.setDebounceTime (5);
   

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

Un'info. Ho notato che pigiando i tasti nel monitor della porta seriale non mi esce scritta la sequenza 1-2-3-A. Per far apparire il codice devo premere più volte, suppongo questo sia dovuto al waitForKey, giusto?

Ora provo a creare un'altro tasto che cancella la memoria dell'array.

Ps. Grazie 1000

Vedi che a "capire" le cose, piano piano si trova la soluzione :wink:

Puoi del tutto eliminare le righe :

  if (key != NO_KEY)
  Serial.println(key);

... mentre, se vuoi vedere i caratteri premuti, aggiungi un "Serial.println(key);" dopo ciascuna "key = keypad.waitForKey();" :slight_smile:

Guglielmo

Buonaseeeeeeeraaaaa 8)

vi voglio aggiornare sull'evoluzione del progetto.
Oggi ho implementato la funzione che con il tasto asterisco (*) il programma mi da codice errato e mi spegne il led.

L'unico problema che ho riscontrato e che proprio non riesco a risolvere è il fatto che se inizio a digitare una delle 4 cifre del codice e poi premo il tasto asterisco prima di darmi codice errato mi fa inserire tutte e 4 le cifre.

Sto cercando un comando che mi dia la possibilità, una volta pigiato asterisco, di bloccare il void loop e ricominciare tutto dall'inizio. Ho provato le funzioni break e continue ma non fanno al mio caso.

Allego il codice:

#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()
{
  
  Serial.print("DIGITA CODICE:");
       
  
    
    key = keypad.waitForKey(); 
    if (key == '*') {
    key = (0);
    digitalWrite (LED, LOW);
    Serial.print ("CODICE ERRATO");
    }

 
  key = keypad.waitForKey();
   code [0] = key;
   keypad.setDebounceTime (5);
   Serial.println (key);
   
  key = keypad.waitForKey();
   code [1] = key;
   keypad.setDebounceTime (5);
   Serial.println (key);
  
  key = keypad.waitForKey();
   code [2] = key;
   keypad.setDebounceTime (5);
   Serial.println (key);
  
  key = keypad.waitForKey();
   code [3] = key;
   keypad.setDebounceTime (5);
   Serial.println (key);
   

  if ((code[0] == '1') && (code[1] == '2') && (code[2] == '3') && (code[3] == 'A')) {
  digitalWrite (LED, HIGH);
  Serial.print ("CODICE ESATTO!");
  
}
}

Ciao,
così non ci riesci ...

... ora devi fare un passetto in più ed imparare ad assegnare i valori all'array tramite una variabile "indice" (e NON indicando fisso il singolo elemento come ora) che, ogni volta che leggi un tasto, incrementi di uno o che, quando leggi "*" azzeri ...

Quando poi la variabile "indice" raggiunge il valore 4 ... hai tutte le cifre e puoi fare il confronto, azzerare l'indice e ricominciare ... :wink:

Vediamo un po come la imposti ... :slight_smile:

Guglielmo

Ok prof, stasera ci provo e vediamo cosa ne esce.

Ps. Mi sto divertendo troppo ASSAJE!!!

supremo_dkg:
Ps. Mi sto divertendo troppo ASSAJE!!!

Pure io ... :grin: :grin: :grin:

Guglielmo

se può interessare c'è questa lib per gestire le password da keypad
http://playground.arduino.cc/Code/Password

ricdata:
se può interessare c'è questa lib per gestire le password da keypad .....

Ma come, noi ci stiamo divertendo e tu ... vorresti che utilizzasse la "pappa fatta" ??? :astonished:

E che imparerebbe in questo modo ??? ]:smiley:

Guglielmo

non ci crederai, ma mi aspettavo questa risposta ]:smiley:

le basi sembra che l'abbia capite, ora guardando le funzioni, se vuole può imparare il resto :wink:

PS: scusa se ti ho rotto il giocattolo :grin:

ricdata:
....
le basi sembra che l'abbia capite, ora guardando le funzioni, se vuole può imparare il resto :wink:

Vediamo come se la cava con gli indici, passiamo poi al ciclo while invece di leggere uno per uno i tasti e poi ... si, potremo dire che le basi ci sono :wink:

ricdata:
PS: scusa se ti ho rotto il giocattolo :grin:

:grin: :grin: :grin: :grin: altrimenti mi togli tutto il divertimento XD XD XD XD

Guglielmo

gpb01:
:grin: :grin: :grin: :grin: altrimenti mi togli tutto il divertimento XD XD XD XD

Guglielmo

... Diabolicus ...

Mi verrebbe voglia di cancellarvi i post ma siete troppo forti :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Prof scusate per l'assenza ma sono stato molto impegnato per lavoro, inoltre stasera scendo a nNapoli (sono napoletano ma vivo a roma) e torno su domenica sera.

Utilizzerò questo tempo per studiare i fondamenti del C e domenica sera faccio i compiti.

Per il resto mi sto divertendo e senza ddubbio sto imparando piùadesso che quando mi sono letto ppagine e pagine di tutorial.
Ho visto anche io che c'era la libreria Password ma per imparare qualcosa c'è bisogno di passare per la porta piccola. E poi, come ha detto il prof, è troppo semplice utilizzare cose già fatte senza sapere cosa si fa di preciso.

Grazie a tutti per il supporto
Antonio

supremo_dkg:
Prof scusate per l'assenza ma sono stato molto impegnato per lavoro, inoltre stasera scendo a nNapoli (sono napoletano ma vivo a roma) e torno su domenica sera.

Anto' ... ma ci mancherebbe .. questo deve essere un divertimento, mica un obbligo ! Noi siamo qui ... quando hai tempo e possibilità ... si va avanti :wink:

Buon fine settimana e buon studio :slight_smile:

Guglielmo

Avevo paura ti fossi rattristato per la mia assenza.... :stuck_out_tongue_closed_eyes:

Scusa se mi "infiltro" (:P) nella discussione , ma fra un po dovro' realizzare qualcosa di simile (matrice e password diferenziali, non per antifurto), e dato che sto imparando pure io (o almeno ci provo :P) ...

Un'indicazione di massima, e' possibile utilizzare una qualche linea dedicata (magari un'interrupt) come tasto "enter" per "risvegliare" un sistema di inserimento codici da tastiera a matrice dallo sleep ? ... dovrebbe essere un'applicazione che puo rimanere a batteria tampone anche per giorni, se salta la luce (ma di solito e' connessa alla rete), quindi mi chiedevo se i vari sistemi di gestione delle password inserite tramite tastiera a matrice siano compatibili con i sistemi di risparmio energetico "estremo" (tipo ad esempio quelli utilizzati da Leo per il micrologio, o simili)

L'idea era quella di avere due dei tasti che fanno da "start/apri" e "chiudi" (chiamali "verde" e "rosso" ) ... ed usarli con una sequenza tipo questa: verde-cifra-cifra-cifra...ecc...cifra-verde per aprire (il primo "verde" risveglia il micro dallo sleep ed inizia la scansione, l'ultimo "verde" dice al micro che hai finito di inserire le cifre, cosi puo controllare ed agire di conseguenza) ... poi dato che mentre e' aperto non serve mandarlo in sleep, il rosso si limita a controllare un micro (per verificare che il portello sia chiuso) e se si, chiude ed azzera tutto e torna in sleep ... poi ho in mente altre funzioni, e piu funzioni per diverse combinazioni, ma quelle verranno dopo, al momento mi interessa capire se i vari sistemi di sleep e risparmio energetico sarebbero compatibili con un'applicazione di questo tipo ...