Pages: [1] 2   Go Down
Author Topic: Usare pulsanti analogici e password!  (Read 1377 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti, vorrei realizzare con il mio Arduino Uno una schermata di accesso con password, l'unico problema(forse) è che utilizzo dei pulsanti analogici, non possiedo un tastierino.
Volevo sapere se era possibile creare una password di soli 4 numeri usando 4 pulsanti analogici. Vi sarei molto grato se mi aiutaste in questa piccola impresa.
Grazie.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 47
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

secondo me è possibile..basterebbe creare una variabile X..a ogni pulsante dai la possibilità di aumentare di n il valore di x e al raggiungimento di un valore predefinito Y permetti di visualizzare la schermata precedente..esemplificando

x=0
se premi i pulsanti nella sequenza 1,3,4,2 ottieni il valore 5
se li premi 2,4,1,3 ottieni 6

se 5 è il valore corretto accedi al livello successivo...spiegato alla "carlona" ma potrebbe essere un punto di partenza..spero per te smiley-razz
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao, si sta pensando una cosa simile anche io.. vediamo cosa ne esce fuori smiley !
Nel frattempo se qualcuno ha realizzato qualcosa di simile in passato, gli sarei molto grato se potesse pubblicare la porzione di codice.

Grazie
Logged

Italy
Offline Offline
Full Member
***
Karma: 1
Posts: 192
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao.
Anche io pochi giorni fa ho sbattuto la testa per cercare di realizzare un progetto simile.
Il codice che ho scritto è questo:
Code:
//PSW CON PULSANTI//

//VARIABILI
int sequenza = 0;
//int buttonState_aux = 0;
//PULSANTI
const int first_button = 2;
const int second_button = 3;
const int third_button = 4;
const int fourth_button = 5;
//LED
const int first_led = 6;
const int second_led = 7;
const int third_led = 8;
const int fourth_led = 9;
//SEGNALE DI ABILITAZIONE
const int enable_signal = 10;
//LED DI FUNZIONAMENTO
const int on_led = 13;
//PIN COMUNICAZIONE SERIALE
const int serial = 11;
 
void setup () {
  pinMode (first_button, INPUT);   //primo pulsante
  pinMode (second_button, INPUT);   //secondo pulsante
  pinMode (third_button, INPUT);   //terzo pulsante
  pinMode (fourth_button, INPUT);   //quarto pulsante
  pinMode (first_led, OUTPUT);  //primo pulsante ok
  pinMode (second_led, OUTPUT);  //secondo pulsante ok nella giusta sequenza
  pinMode (third_led, OUTPUT);  //terzo pulsante ok nella giusta sequenza
  pinMode (fourth_led, OUTPUT);  //quarto pulsante ok nella giusta sequenza
  pinMode (enable_signal, OUTPUT); //segnale di abilitazione (sequenza ok)
  pinMode (on_led, OUTPUT); //led di funzionamento
}
 
void loop () {
digitalWrite(on_led, HIGH);

  //SE NON E' STATO PREMUTO ALCUN PULSANTE DELLA SEQUENZA
  if (sequenza == 0) {
    if (digitalRead(second_button) == HIGH) {
      sequenza = 1;
      digitalWrite(first_led, HIGH);
      delay(1000);    //per evitare che si entri immediatamente nell'if succesivo nel caso in cui il pulsante è tenuto premuto per + di un secondo
    }
  }
  //SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA
  if (sequenza == 1 && !digitalRead(first_button) && !digitalRead(second_button) && !digitalRead(third_button)) {
    if (digitalRead(fourth_button) == HIGH) {
      sequenza = 2;
      digitalWrite(second_led, HIGH);
      delay(1000);
    }
  }
  //SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA E IL SECONDO E' ERRATO
  if (sequenza == 1 && (digitalRead(first_button) || digitalRead(second_button) || digitalRead(third_button))) {
      sequenza = 0;
      digitalWrite(first_led, LOW);
  }
  //SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA
  if (sequenza == 2 && !digitalRead(second_button) && !digitalRead(third_button) && !digitalRead(fourth_button)) {
    if (digitalRead(first_button) == HIGH) {
      sequenza = 3;
      digitalWrite(third_led, HIGH);
      delay(1000);
    }
  }
  //SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA E IL TERZO E' ERRATO
  if (sequenza == 2 && (digitalRead(second_button) || digitalRead(third_button) || digitalRead(fourth_button))) {
      sequenza = 0;
      digitalWrite(first_led, LOW);
      digitalWrite(second_led, LOW);
  }
  //SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA
  if (sequenza == 3 && !digitalRead(first_button) && !digitalRead(second_button) && !digitalRead(fourth_button)) {
    if (digitalRead(third_button) == HIGH) {
      sequenza = 0;    //RESETTO
      digitalWrite(fourth_led, HIGH);
      digitalWrite(enable_signal, HIGH);   //ATTIVO IL SEGNALE DI ENABLE    
      delay(1000);               //LO TENGO ATTIVO PER 1 SECONDO
      digitalWrite(enable_signal, LOW);  //LO DISATTIVO
      //RESETTO TUTTI I LED
      digitalWrite(first_led, LOW);
      digitalWrite(second_led, LOW);
      digitalWrite(third_led, LOW);
      digitalWrite(fourth_led, LOW);
    }
  }
  //SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA E IL QUARTO E' ERRATO
  if (sequenza == 3 && (digitalRead(first_button) || digitalRead(second_button) || digitalRead(fourth_button))) {
      sequenza = 0;
      digitalWrite(first_led, LOW);
      digitalWrite(second_led, LOW);
      digitalWrite(third_led, LOW);
  }
}
Ho preso il sorgente da questo sito: http://www.agostinopolizzano.info/home/content/riconoscitore-di-sequenza-microcontrollore
è lo ho successivamente modificato alle mie esigenze.
In questo esempio alla pressione di un pulsante si accende un led, nel caso la sequenza non corrisponde si spengono tutti e riparte il programma.
Nella seconda versione che ho scritto, invece dei led ho usato un display LCD che alla giusta sequenza  stampa una stringa.
ecco il codice:
Code:
//PSW CON PULSANTI ED LCD 16*2//
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//VARIABILI
int sequenza = 0;
//int buttonState_aux = 0;
//PULSANTI
const int first_button = 10;
const int second_button = 9;
const int third_button = 8;
const int fourth_button = 7;
//LED
const int enable_signal = 6;
//LED DI FUNZIONAMENTO
const int on_led = 13;

 
void setup () {
  pinMode (first_button, INPUT);   //primo pulsante
  pinMode (second_button, INPUT);   //secondo pulsante
  pinMode (third_button, INPUT);   //terzo pulsante
  pinMode (fourth_button, INPUT);   //quarto pulsante
  pinMode (enable_signal, OUTPUT); //segnale di abilitazione (sequenza ok)
  pinMode (on_led, OUTPUT); //led di funzionamento
  lcd.begin(16, 2);
}
 
void loop () {
digitalWrite(on_led, HIGH);

  //SE NON E' STATO PREMUTO ALCUN PULSANTE DELLA SEQUENZA
  if (sequenza == 0) {
    if (digitalRead(second_button) == HIGH) {
      sequenza = 1;
      lcd.print("2");
      delay(1000);    //per evitare che si entri immediatamente nell'if succesivo nel caso in cui il pulsante è tenuto premuto per + di un secondo
    }
  }
  //SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA
  if (sequenza == 1 && !digitalRead(first_button) && !digitalRead(second_button) && !digitalRead(third_button)) {
    if (digitalRead(fourth_button) == HIGH) {
      sequenza = 2;
      lcd.print("4");
      delay(1000);
    }
  }
  //SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA E IL SECONDO E' ERRATO
  if (sequenza == 1 && (digitalRead(first_button) || digitalRead(second_button) || digitalRead(third_button))) {
      sequenza = 0;
      lcd.clear();
  }
  //SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA
  if (sequenza == 2 && !digitalRead(second_button) && !digitalRead(third_button) && !digitalRead(fourth_button)) {
    if (digitalRead(first_button) == HIGH) {
      sequenza = 3;
      lcd.print("1");
      delay(1000);
    }
  }
  //SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA E IL TERZO E' ERRATO
  if (sequenza == 2 && (digitalRead(second_button) || digitalRead(third_button) || digitalRead(fourth_button))) {
      sequenza = 0;
      lcd.clear();
  }
  //SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA
  if (sequenza == 3 && !digitalRead(first_button) && !digitalRead(second_button) && !digitalRead(fourth_button)) {
    if (digitalRead(third_button) == HIGH) {
      sequenza = 0;    //RESETTO
      lcd.print("3");
      delay(1250);
      lcd.clear();
      lcd.setCursor(2, 0);
      lcd.print("Psw Corretta");
      digitalWrite(enable_signal, HIGH);   //ATTIVO IL SEGNALE DI ENABLE    
      delay(4000);               //LO TENGO ATTIVO PER 5 SECONDI
      digitalWrite(enable_signal, LOW);  //LO DISATTIVO
      lcd.clear();
    }
  }
  //SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA E IL QUARTO E' ERRATO
  if (sequenza == 3 && (digitalRead(first_button) || digitalRead(second_button) || digitalRead(fourth_button))) {
      sequenza = 0;
      lcd.clear();
  }
}
Spero di esserti stato di aiuto.
Hertz.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 47
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao.
Anche io pochi giorni fa ho sbattuto la testa per cercare di realizzare un progetto simile.
Il codice che ho scritto è questo:
Code:
//PSW CON PULSANTI//

//VARIABILI
int sequenza = 0;
//int buttonState_aux = 0;
//PULSANTI
const int first_button = 2;
const int second_button = 3;
const int third_button = 4;
const int fourth_button = 5;
//LED
const int first_led = 6;
const int second_led = 7;
const int third_led = 8;
const int fourth_led = 9;
//SEGNALE DI ABILITAZIONE
const int enable_signal = 10;
//LED DI FUNZIONAMENTO
const int on_led = 13;
//PIN COMUNICAZIONE SERIALE
const int serial = 11;
 
void setup () {
  pinMode (first_button, INPUT);   //primo pulsante
  pinMode (second_button, INPUT);   //secondo pulsante
  pinMode (third_button, INPUT);   //terzo pulsante
  pinMode (fourth_button, INPUT);   //quarto pulsante
  pinMode (first_led, OUTPUT);  //primo pulsante ok
  pinMode (second_led, OUTPUT);  //secondo pulsante ok nella giusta sequenza
  pinMode (third_led, OUTPUT);  //terzo pulsante ok nella giusta sequenza
  pinMode (fourth_led, OUTPUT);  //quarto pulsante ok nella giusta sequenza
  pinMode (enable_signal, OUTPUT); //segnale di abilitazione (sequenza ok)
  pinMode (on_led, OUTPUT); //led di funzionamento
}
 
void loop () {
digitalWrite(on_led, HIGH);

  //SE NON E' STATO PREMUTO ALCUN PULSANTE DELLA SEQUENZA
  if (sequenza == 0) {
    if (digitalRead(second_button) == HIGH) {
      sequenza = 1;
      digitalWrite(first_led, HIGH);
      delay(1000);    //per evitare che si entri immediatamente nell'if succesivo nel caso in cui il pulsante è tenuto premuto per + di un secondo
    }
  }
  //SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA
  if (sequenza == 1 && !digitalRead(first_button) && !digitalRead(second_button) && !digitalRead(third_button)) {
    if (digitalRead(fourth_button) == HIGH) {
      sequenza = 2;
      digitalWrite(second_led, HIGH);
      delay(1000);
    }
  }
  //SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA E IL SECONDO E' ERRATO
  if (sequenza == 1 && (digitalRead(first_button) || digitalRead(second_button) || digitalRead(third_button))) {
      sequenza = 0;
      digitalWrite(first_led, LOW);
  }
  //SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA
  if (sequenza == 2 && !digitalRead(second_button) && !digitalRead(third_button) && !digitalRead(fourth_button)) {
    if (digitalRead(first_button) == HIGH) {
      sequenza = 3;
      digitalWrite(third_led, HIGH);
      delay(1000);
    }
  }
  //SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA E IL TERZO E' ERRATO
  if (sequenza == 2 && (digitalRead(second_button) || digitalRead(third_button) || digitalRead(fourth_button))) {
      sequenza = 0;
      digitalWrite(first_led, LOW);
      digitalWrite(second_led, LOW);
  }
  //SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA
  if (sequenza == 3 && !digitalRead(first_button) && !digitalRead(second_button) && !digitalRead(fourth_button)) {
    if (digitalRead(third_button) == HIGH) {
      sequenza = 0;    //RESETTO
      digitalWrite(fourth_led, HIGH);
      digitalWrite(enable_signal, HIGH);   //ATTIVO IL SEGNALE DI ENABLE    
      delay(1000);               //LO TENGO ATTIVO PER 1 SECONDO
      digitalWrite(enable_signal, LOW);  //LO DISATTIVO
      //RESETTO TUTTI I LED
      digitalWrite(first_led, LOW);
      digitalWrite(second_led, LOW);
      digitalWrite(third_led, LOW);
      digitalWrite(fourth_led, LOW);
    }
  }
  //SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA E IL QUARTO E' ERRATO
  if (sequenza == 3 && (digitalRead(first_button) || digitalRead(second_button) || digitalRead(fourth_button))) {
      sequenza = 0;
      digitalWrite(first_led, LOW);
      digitalWrite(second_led, LOW);
      digitalWrite(third_led, LOW);
  }
}
Ho preso il sorgente da questo sito: http://www.agostinopolizzano.info/home/content/riconoscitore-di-sequenza-microcontrollore
è lo ho successivamente modificato alle mie esigenze.
In questo esempio alla pressione di un pulsante si accende un led, nel caso la sequenza non corrisponde si spengono tutti e riparte il programma.
Nella seconda versione che ho scritto, invece dei led ho usato un display LCD che alla giusta sequenza  stampa una stringa.
ecco il codice:
Code:
//PSW CON PULSANTI ED LCD 16*2//
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//VARIABILI
int sequenza = 0;
//int buttonState_aux = 0;
//PULSANTI
const int first_button = 10;
const int second_button = 9;
const int third_button = 8;
const int fourth_button = 7;
//LED
const int enable_signal = 6;
//LED DI FUNZIONAMENTO
const int on_led = 13;

 
void setup () {
  pinMode (first_button, INPUT);   //primo pulsante
  pinMode (second_button, INPUT);   //secondo pulsante
  pinMode (third_button, INPUT);   //terzo pulsante
  pinMode (fourth_button, INPUT);   //quarto pulsante
  pinMode (enable_signal, OUTPUT); //segnale di abilitazione (sequenza ok)
  pinMode (on_led, OUTPUT); //led di funzionamento
  lcd.begin(16, 2);
}
 
void loop () {
digitalWrite(on_led, HIGH);

  //SE NON E' STATO PREMUTO ALCUN PULSANTE DELLA SEQUENZA
  if (sequenza == 0) {
    if (digitalRead(second_button) == HIGH) {
      sequenza = 1;
      lcd.print("2");
      delay(1000);    //per evitare che si entri immediatamente nell'if succesivo nel caso in cui il pulsante è tenuto premuto per + di un secondo
    }
  }
  //SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA
  if (sequenza == 1 && !digitalRead(first_button) && !digitalRead(second_button) && !digitalRead(third_button)) {
    if (digitalRead(fourth_button) == HIGH) {
      sequenza = 2;
      lcd.print("4");
      delay(1000);
    }
  }
  //SE E' GIA' STATO PREMUTO IL PRIMO PULSANTE DELLA SEQUENZA E IL SECONDO E' ERRATO
  if (sequenza == 1 && (digitalRead(first_button) || digitalRead(second_button) || digitalRead(third_button))) {
      sequenza = 0;
      lcd.clear();
  }
  //SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA
  if (sequenza == 2 && !digitalRead(second_button) && !digitalRead(third_button) && !digitalRead(fourth_button)) {
    if (digitalRead(first_button) == HIGH) {
      sequenza = 3;
      lcd.print("1");
      delay(1000);
    }
  }
  //SE E' GIA' STATO PREMUTO IL SECONDO PULSANTE DELLA SEQUENZA E IL TERZO E' ERRATO
  if (sequenza == 2 && (digitalRead(second_button) || digitalRead(third_button) || digitalRead(fourth_button))) {
      sequenza = 0;
      lcd.clear();
  }
  //SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA
  if (sequenza == 3 && !digitalRead(first_button) && !digitalRead(second_button) && !digitalRead(fourth_button)) {
    if (digitalRead(third_button) == HIGH) {
      sequenza = 0;    //RESETTO
      lcd.print("3");
      delay(1250);
      lcd.clear();
      lcd.setCursor(2, 0);
      lcd.print("Psw Corretta");
      digitalWrite(enable_signal, HIGH);   //ATTIVO IL SEGNALE DI ENABLE    
      delay(4000);               //LO TENGO ATTIVO PER 5 SECONDI
      digitalWrite(enable_signal, LOW);  //LO DISATTIVO
      lcd.clear();
    }
  }
  //SE E' GIA' STATO PREMUTO IL TERZO PULSANTE DELLA SEQUENZA E IL QUARTO E' ERRATO
  if (sequenza == 3 && (digitalRead(first_button) || digitalRead(second_button) || digitalRead(fourth_button))) {
      sequenza = 0;
      lcd.clear();
  }
}
Spero di esserti stato di aiuto.
Hertz.

semplice ed efficace...in aggiunta puoi aggiungerci questo http://www.robot-italy.com/it/touch-shield.html
mi è venuto la voglia di farlo pure a me (non so per cosa lo userò ma lo userò smiley-razz)
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao.
Anche io pochi giorni fa ho sbattuto la testa per cercare di realizzare un progetto simile.
Il codice che ho scritto è questo etc.. etc..

Hertz era proprio quello che cercavo grazie mille.. l'ho già adattato con i miei pulsanti analogici, ora sto escogitando un modo per memorizzare facilemente la password tramite variabile con la possibilità di poterla settare da display.
Logged

Italy
Offline Offline
Full Member
***
Karma: 1
Posts: 192
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Se riesci nel impresa fammi sapere, anche io ci stavo provando!
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Anche se il codice è molto grezzo fa il suo lavoro.. ho creato un array chiamato
Code:
int PASSWORD[4]={1, 1, 1, 1};
int STATO=0;
int ERRORE=0;
Poi ho creato due variabili Errore e Stato perchè mi serviranno a capire se ho digitato il pulsante giusto
Code:
while(STATO <1 && ERRORE <1){
    lcd.setCursor(0,0);
    lcd.print("Password");
    if (get_key_pass() == PASSWORD[0])
    {
     STATO=STATO+1;
     lcd.setCursor(0,1);
     lcd.print(get_key_pass());
     delay(200);
    } if (isPressed(get_key_pass()) != PASSWORD[0]) {
    ERRORE=ERRORE+1;
     lcd.setCursor(0,1);
     lcd.print(get_key_pass());
     delay(200);
   }
    }
    while(STATO <2 && ERRORE < 2){
      if (get_key_pass() == PASSWORD[1])
    {
     STATO=STATO+1;
     lcd.setCursor(1,1);
     lcd.print(get_key_pass());
     delay(200);
    } if (isPressed(get_key_pass()) != PASSWORD[1]) {
    ERRORE=ERRORE+1;
     lcd.setCursor(1,1);
     lcd.print(get_key_pass());
     delay(200);
   }
      }
        while(STATO <3 && ERRORE < 3){
      if (get_key_pass() == PASSWORD[2])
    {
     STATO=STATO+1;
     lcd.setCursor(2,1);
     lcd.print(get_key_pass());
     delay(200);
    } if (isPressed(get_key_pass()) != PASSWORD[2]) {
    ERRORE=ERRORE+1;
     lcd.setCursor(2,1);
     lcd.print(get_key_pass());
     delay(200);
   }
      }
    while(STATO <4 && ERRORE < 4){
      if (get_key_pass() == PASSWORD[3])
    {
     STATO=STATO+1;
     lcd.setCursor(3,1);
     lcd.print(get_key_pass());
     delay(200);
    } if (isPressed(get_key_pass()) != PASSWORD[3]) {
    ERRORE=ERRORE+1;
     lcd.setCursor(3,1);
     lcd.print(get_key_pass());
     delay(200);
   }
      }
       while(STATO == 4)
     {
      lcd.setCursor(0,1);
      lcd.print("Accettata!");
      delay(1000);
      STATO=STATO-4;
      menuPrincipale();
      }
       while(ERRORE == 4)
      {     
      lcd.setCursor(0,1);
      lcd.print("Negato!");
      delay(1000);
      ERRORE=ERRORE-4;
      menuPrincipale();
      }
L'unico problema sta solo nel settare la password da Arduino, ho provato a sostituire un valore in questo modo
Code:
PASSWORD[1]="nome della variabile contenente il valore"; //[1] Sta per il secondo valore contentuto dentro l'array

Qualcuno saprebbe aiutarmi con gli array?Graziee
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Mi pare che il tuo codice abbia un grosso problema di logica.
Non puoi fare il controllo ad ogni tasto premuto, in questo modo un potenziale malvivente te lo trova con pochi tentativi. Tu devi prima far inserire tutta la combinazione e poi solo dopo controllare se la sequenza è giusta. Altrimenti dai informazioni sulla password.

Comunque hai poche combinazioni, non è il massimo della sicurezza.

Il secondo problema che hai non l'ho capito.
Logged


Offline Offline
Newbie
*
Karma: 1
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si in effetti non è il massimo, sto facendo tante prove.. in pratica vi spiego, i pulsanti quando non vengono premuti assumono valore "-1", quindi il ciclo "if" rileva subito i pulsante negativo e passa a quello successivo, ho provato ad inserire "isPressed" ma non attende il tocco del pulsante smiley-sad
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma non puoi usare dei normali pulsanti?
Logged


Offline Offline
Newbie
*
Karma: 1
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Purtroppo no mi servono solo quelli analogici
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Immagino ci sarà un inizio procedura acquisizione password, giusto? Da lì, campioni 4 pressioni. Solo dopo la 4a fai il check della password.
Logged


Offline Offline
Newbie
*
Karma: 1
Posts: 11
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Per chi fosse interessato dopo ore e ore seduto davanti sto benedetto codice, ho trovato la mia soluzione, un controllo tramite while e if.
Esamino singolarmente ogni valore del vettore nel mio caso dal primo (0) all'ultimo 4 (3)
Se ogni mia digitazione corrisponde al valore del pulsante (0,1,2,3), il controllo prosegue flaggando una variabile +1 "STATO",una variabile "ERRATO" e una variabile "CORRETTO"
Se alla fine del controllo ho più valori ERRATI, la procedura si ripete reinserendo la password, ovviamente prima svuoto le variabili e le porto a "0".
Se invece ottengo lo stesso valore della lunghezza della mia password cioè 4 nella variabile "CORRETTO" allora mi visualizzerà "Password Corretta" proseguendo con il programma.

Vi posto il codice se a qualcuno potrebbe servire.. vi ricordo che utilizzo solo pulsanti analogici e quindi nessun pulsante digitale.
Code:
//INIZIO FUNZIONE PASSWORD --------------------------------------------------------------------------------------------------------- 
 if (CORRETTO < 4){while(BT_1 == get_key_pass() || BT_2 == get_key_pass() || BT_3 == get_key_pass() || BT_4 == get_key_pass()){
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Password");
    while(STATO == 0)//Verifica la prima digitazione
    {
     while(!isPressed(get_key_pass())){
     if (get_key_pass() == PASSWORD[0])
    {
     lcd.setCursor(0,1);
     lcd.print(get_key_pass());
     CORRETTO+=1;
     STATO+=1;
     delay(500);
     break;
    }
    else if (get_key_pass() != PASSWORD[0])
    {
     lcd.setCursor(0,1);
     lcd.print(get_key_pass());
     ERRORE+=1;
     STATO+=1;
     delay(500);
     break;
    }}
    if (STATO == 1) {break;}
  }
 
    while(STATO == 1)//Verifica la seconda digitazione
    {
     while(!isPressed(get_key_pass())){
     if (get_key_pass() == PASSWORD[1])
    {
     lcd.setCursor(1,1);
     lcd.print(get_key_pass());
     CORRETTO+=1;
     STATO+=1;
     delay(500);
     break;
    }
    else if (get_key_pass() != PASSWORD[1])
    {
     lcd.setCursor(1,1);
     lcd.print(get_key_pass());
     ERRORE+=1;
     STATO+=1;
     delay(500);
     break;
    }}
    if (STATO == 2) {break;}
  }
  while(STATO == 2)//Verifica la terza digitazione
    {
     while(!isPressed(get_key_pass())){
     if (get_key_pass() == PASSWORD[2])
    {
     lcd.setCursor(2,1);
     lcd.print(get_key_pass());
     CORRETTO+=1;
     STATO+=1;
     delay(500);
     break;
    }
    else if (get_key_pass() != PASSWORD[2])
    {
     lcd.setCursor(2,1);
     lcd.print(get_key_pass());
     ERRORE+=1;
     STATO+=1;
     delay(500);
     break;
    }}
    if (STATO == 3) {break;}
  }
  while(STATO == 3)//Verifica la quarta digitazione
    {
     while(!isPressed(get_key_pass())){
     if (get_key_pass() == PASSWORD[3])
    {
     lcd.setCursor(3,1);
     lcd.print(get_key_pass());
     CORRETTO+=1;
     STATO+=1;
     delay(500);
     break;
    }
    else if (get_key_pass() != PASSWORD[3])
    {
     lcd.setCursor(3,1);
     lcd.print(get_key_pass());
     ERRORE+=1;
     STATO+=1;
     delay(500);
     break;
    }}
    if (STATO == 4) {break;}
  }
  while(STATO == 4)//Verifica se la password è corretta o sbagliata
    {
     if (CORRETTO == 4)
    {
     lcd.setCursor(0,1);
     lcd.print("Password");
     lcd.setCursor(0,1);
     lcd.print("Corretta");
     delay(500);
     lcd.clear();
     break;
    }
    else
    {
     lcd.setCursor(0,0);
     lcd.print("Password");
     lcd.setCursor(0,1);
     lcd.print("Sbagliata");
     CORRETTO=0;
     ERRORE=0;
     STATO=0;
     delay(500); 
     lcd.clear();
     break;
    }
  }}}
//FINE FUNZIONE PASSWORD ---------------------------------------------------------------------------------------------------------   
Sicuramente il mio codice non è il massimo dal punto di vista logico, ma funziona senza imperfezioni almeno fino ad adesso.

Per l'inserimento di una nuova password, ho utilizzato quasi lo stesso codice solo che per ogni pulsante digitato assegna quel valore all'array di quella posizione specifica quindi
Code:
PASSWORD[0]=valore pulsante premuto;
PASSWORD[1]=valore pulsante premuto;
etc etc

Grazie a chi mi ha aiutato nell'impresa smiley
« Last Edit: February 03, 2013, 07:42:29 am by dannythegreat » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

A me sembra complicato. Inoltre se vari la lunghezza della password sei costretto ad aggiungere un blocco di controllo.

Ti avevo suggerito di leggere prima l'inserimento di tutte le cifre che compongono la password e solo alla fine eseguire il controllo sulla sua validità.

Logged


Pages: [1] 2   Go Up
Jump to: