Accendere un led con password tramite seriale

Ciao a tutti :wink:

Allora la mia idea è quella di accendere un led tramite una password da me impostata in precedenza e tramite il monitor seriale digitare la password, se corretta si accende il led.

Ho scaricato per fare ciò la libreria password ma senza successo :angry:

Questo è il mio codice:

#include <Password.h> //libreria della PASSWORD

//sintassi per creare una variabile speciale della libreria che contiene la password
Password password = Password (" cane "); // Password nomechevuoi = Password (" password ");

void setup()
{
Serial.begin(9600);
Serial.println("ACCENSIONE LUCI CON PASSWORD");
pinMode(13,OUTPUT);
pinMode(13,LOW);
}//fine del setup

void loop()
{

if(Serial.available()) //controllo se la comunicazione seriale è disponibile
{
if(password.evaluate())
{
Serial.println("La password digita e' esatta.");
digitalWrite(13,HIGH);

}//fine dell'if se la password è corretta

else
{
Serial.println("ERRORE");
digitalWrite(13,LOW);
}

}//fine if se la comunicazione seriale è disponibile

}//fine del loop

I problemi sono due:

  • nonostante digiti la password corretta la risposta è che è sbagliata e di conseguenza niente led acceso
  • Che comunica la parola "errore" all'infinito... non c'è un modo che comunichi una parola solo per una volta?

Grazie :slight_smile:

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare.
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Hai un link a questa libreria ? Non l'avevo mai sentita !?!

Eccoti accontentato Nid:

http://playground.arduino.cc/Code/Password

Una roba con scritto "Under Construction" ? :o

Non ho detto che sia una "buona" libreria, ti ho solo comunicato dove trovarla.

Personalmente non mi sognerei mai di usare una libreria per una password! :smiley:

#include <Password.h> //libreria della PASSWORD

//sintassi per creare una variabile speciale della libreria che contiene la password
Password miapassword = Password ("cane"); // Password nomechevuoi = Password (" password ");



void setup()
{
  Serial.begin(9600);
  Serial.println("ACCENSIONE LUCI CON PASSWORD");
  pinMode(13,OUTPUT);
  pinMode(13,LOW);
}//fine del setup

void loop()
{
  
  if(Serial.available()) //controllo se la comunicazione seriale è disponibile
  {
    if(miapassword.evaluate())
    {
      Serial.println("La password digita e' esatta.");
      digitalWrite(13,HIGH);     
           
    }//fine dell'if se la password è corretta
    
    else
    {
      Serial.println("ERRORE");
      digitalWrite(13,LOW);
    }
    
    
  }
  
}

Io ho semplicemente fatto un breve ricerca per fare in modo di utilizzare una password.

Vorrei chiedere allora se esiste un modo di comparare due stringhe tipo come in C++ strcmp così da verificare che ciò che viene digitato sia corretto.
Per ora vorrei provare a gestire un led da monitor seriale in quanto vorrei successivamente gestire l'accensione di un led tramite un keypad sempre digitando una password.
Grazie:)

coppolino:
Ciao a tutti :wink:

Allora la mia idea è quella di accendere un led tramite una password da me impostata in precedenza e tramite il monitor seriale digitare la password, se corretta si accende il led.

Ho scaricato per fare ciò la libreria password ma senza successo :angry:

Questo è il mio codice:

#include <Password.h> //libreria della PASSWORD

//sintassi per creare una variabile speciale della libreria che contiene la password
Password password = Password (" cane "); // Password nomechevuoi = Password (" password ");

void setup()
{
Serial.begin(9600);
Serial.println("ACCENSIONE LUCI CON PASSWORD");
pinMode(13,OUTPUT);
pinMode(13,LOW);
}//fine del setup

void loop()
{

if(Serial.available()) //controllo se la comunicazione seriale è disponibile
{
if(password.evaluate())
{
Serial.println("La password digita e' esatta.");
digitalWrite(13,HIGH);

}//fine dell'if se la password è corretta

else
{
Serial.println("ERRORE");
digitalWrite(13,LOW);
}

}//fine if se la comunicazione seriale è disponibile

}//fine del loop

I problemi sono due:

  • nonostante digiti la password corretta la risposta è che è sbagliata e di conseguenza niente led acceso
  • Che comunica la parola "errore" all'infinito... non c'è un modo che comunichi una parola solo per una volta?

Grazie :slight_smile:

Ciao!!! Sfogliando il codice ho visto una cosa che mi mette il dubbio anche se non sarà solo quella. Tu gli dai if serial available, ma la password cane ha 4 caratteri, quindi non dovresti mettere un while serial available??? Poi non vedo il serial read. Magari tutto questo lo fa la libreria...

Scusami ma nel link c'è un esempio. Perchè non parti da quello e lo modifichi???

coppolino:
Vorrei chiedere allora se esiste un modo di comparare due stringhe tipo come in C++ strcmp
vorrei successivamente gestire l'accensione di un led tramite un keypad sempre digitando una password

strcmp puoi usarlo su arduino, e' pur sempre un ambiente in cui poter usare C/C++
qui c'e' un esempio per keypad proprio con strcmp
http://playground.arduino.cc/Main/KeypadPassword

Io ho infatti aperto l'esempio e poi di conseguenza ho semplicemente modificato.
Nell'esempio non c'è alcuna serial read

Qui c'è l'esempio di cui io ho modificato il codice senza successo:

#include <Password.h>

Password password = Password( "1234" );

byte currentLength = 0;

void setup(){
  Serial.begin(9600);
  Serial.println("Try to guess the password!");
  Serial.println("Reset with ! evaluate with ?");
  Serial.print("Enter password: ");
}

void loop(){
  if (Serial.available()){
    char input = Serial.read();
    switch (input){
      case '!': //reset password
        password.reset();
        currentLength = 0;
        Serial.println("\tPassword is reset!");
      break;
      case '?': //evaluate password
        if (password.evaluate()){
          Serial.println("\tYou guessed the correct password!");
        }else{
          Serial.println("\tYou did not guess the correct password!");
        }
      break;
      default: //append any keypress that is not a '!' nor a '?' to the currently guessed password.
        password << input;
        currentLength++;
        
        //Print some feedback.
        Serial.print("Enter password: ");
        for (byte i=0; i<currentLength; i++){
          Serial.print('*');
        }
        Serial.println();
     }
  }
}

Inoltre non ho capito l'utilità del ciclo while... :-[

In questi giorni appena possibile provo a rifare il programma con l'istruzione strcmp.

Solo su una cosa vorrei avere un chiarimento, ho letto che non da molto sono state introdotte le variabili stringhe quindi ad esempio come in C#?

coppolino:
Io ho infatti aperto l'esempio e poi di conseguenza ho semplicemente modificato.
Nell'esempio non c'è alcuna serial read

Qui c'è l'esempio di cui io ho modificato il codice senza successo:

#include <Password.h>

Password password = Password( "1234" );

byte currentLength = 0;

void setup(){
  Serial.begin(9600);
  Serial.println("Try to guess the password!");
  Serial.println("Reset with ! evaluate with ?");
  Serial.print("Enter password: ");
}

void loop(){
  if (Serial.available()){
    char input = Serial.read();
    switch (input){
      case '!': //reset password
        password.reset();
        currentLength = 0;
        Serial.println("\tPassword is reset!");
      break;
      case '?': //evaluate password
        if (password.evaluate()){
          Serial.println("\tYou guessed the correct password!");
        }else{
          Serial.println("\tYou did not guess the correct password!");
        }
      break;
      default: //append any keypress that is not a '!' nor a '?' to the currently guessed password.
        password << input;
        currentLength++;
       
        //Print some feedback.
        Serial.print("Enter password: ");
        for (byte i=0; i<currentLength; i++){
          Serial.print('*');
        }
        Serial.println();
    }
  }
}





Inoltre non ho capito l'utilità del ciclo while... :-[ 

In questi giorni appena possibile provo a rifare il programma con l'istruzione *strcmp*.


Solo su una cosa vorrei avere un chiarimento, ho letto che non da molto sono state introdotte le variabili stringhe quindi ad esempio come in C#?

L'utilità del ciclo while è semplice come quella dell'if.

If = se
While = fino a che
Nella comunicazione seriale con l'if chiudi il ciclo lavorando solo un byte. Con il while e un array fino a che c'è qualcosa nella seriale salva il dato in array*, incrementa i salva il dato successivo ecc...*

coppolino:
Solo su una cosa vorrei avere un chiarimento, ho letto che non da molto sono state introdotte le variabili stringhe quindi ad esempio come in C#?

C# non lo conosco, ma la classe String su arduino c'e', e non da poco ma da anni.
http://www.arduino.cc/en/Reference/StringConstructor

Ho provato con l'struzione strcmp ma in nessun caso si accende... :confused:

const int nmax=4;

char input[nmax];
char password[nmax]={'c','a','n','e'};
byte conta=0;

void setup() {
  
  Serial.begin(9600); //imposto la velocità di comunicazione
  pinMode(13,OUTPUT);
  
  Serial.print("DIGITA LA PASSWORD SE VUOI ACCENDERE LA LUCE E PREMI IL TASTO INVIA");  //richiesta di invio della password

}//fine del setup

void loop() {
  
if(Serial.available())
{
  while(nmax<conta)
  {
      input[conta]=Serial.read(); //lettura della seriale
      
      conta++;//incremento la variabile contatore
      
  }//fine del ciclo while
  
  
  
    if(strcmp(input,password)==0)
    {
      digitalWrite(13,HIGH);
    }
    
    else
      digitalWrite(13,LOW);
         
     
  
    
 }//end serial.available 

}//fine del loop

coppolino:
Ho provato con l'struzione strcmp ma in nessun caso si accende... :confused:

const int nmax=4;

char input[nmax];
char password[nmax]={'c','a','n','e'};
byte conta=0;

void setup() {
 
  Serial.begin(9600); //imposto la velocità di comunicazione
  pinMode(13,OUTPUT);
 
  Serial.print("DIGITA LA PASSWORD SE VUOI ACCENDERE LA LUCE E PREMI IL TASTO INVIA");  //richiesta di invio della password

}//fine del setup

void loop() {
 
if(Serial.available())
{
  while(nmax<conta)
  {
      input[conta]=Serial.read(); //lettura della seriale
     
      conta++;//incremento la variabile contatore
     
  }//fine del ciclo while
 
 
 
    if(strcmp(input,password)==0)
    {
      digitalWrite(13,HIGH);
    }
   
    else
      digitalWrite(13,LOW);

}//end serial.available

}//fine del loop

Scusami ma tu gli dici. Fino a che nmax è minore di conta. Nmax lo dichiari a 4, conta a 0. Anche se in seriale hai qualcosa non entrerai mai nel ciclo while. Poi perchè non hai usato while serial available???

Ecco il codice con le nuove modifiche ma nulla lo stesso... :confused:

const int nmax=4;

char input[nmax];
char password[nmax]={'c','a','n','e'};
byte conta=0;

void setup() {
  
  Serial.begin(9600); //imposto la velocità di comunicazione
  pinMode(13,OUTPUT);
  
  Serial.print("DIGITA LA PASSWORD SE VUOI ACCENDERE LA LUCE E PREMI IL TASTO INVIA");  //richiesta di invio della password

}//fine del setup

void loop() {
  
while(Serial.available())
{
  while(conta<nmax)
  {
      input[conta]=Serial.read(); //lettura della seriale
      
      conta++;//incremento la variabile contatore
      
  }//fine del ciclo while
  
  
  
    if(strcmp(input,password)==0)
      digitalWrite(13,HIGH);
    
    else
     digitalWrite(13,LOW);
    
    
 }//end serial.available 

}//fine del loop
const int nmax=5;

char input[nmax];
char password[nmax]="cane";
byte conta=0;

void setup() {
  
  Serial.begin(9600); //imposto la velocità di comunicazione
  pinMode(13,OUTPUT);
  
  Serial.print("DIGITA LA PASSWORD SE VUOI ACCENDERE LA LUCE E PREMI IL TASTO INVIA");  //richiesta di invio della password

}//fine del setup

void loop() {
conta=0;
  
  while( conta < nmax)
  {
      while( !Serial.available() );
      input[conta]=Serial.read();
      conta++;
  }
  
  input[conta]='\0';
  
    if(strcmp(input,password)==0)
      digitalWrite(13,HIGH);
    else
     digitalWrite(13,LOW);
 }

}//fine del loop

Prima di tutto scusate se non ho più preso parte alla questione ma ho avuto un periodo impegnativo e ho lasciato perdere diverse cose.

Tornando al problema grazie per le risposte e sopratutto all'algoritmo solamente che non ho capito alcune cose...
due per la precisione! :frowning: :confused:

char password[nmax]="cane";

Quale sarebbe la differenza con ciò che avevo fatto in precedenza scrivendo ogni singola lettere fra singoli apici

while( !Serial.available() );

Non ho capito il perchè della negazione, non deve controllare che la seriale sia attiva e disponibile per poter comunicare?

Grazie ancora :stuck_out_tongue: