Ciao a tutti 
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 
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 
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 !?!
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! 
#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 
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 
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 
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... 
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... 
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... 
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!

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 