salve a tutti, ho appena iniziato a scrivacchiare qualche sketch con arduino e avrei bisogno del vostro aiuto per risolvere un problemino e capire meglio come funziona questo splendido oggetto. premetto che ho cercato varie volte su google una soluzione e che ho cercato di risolvere da solo ma proprio non mi viene in mente nulla. uso arduino mega 2560 su windows 7 con ide versione 1.0.5 .
vi illustro il mio problema, sto cercando di scrivere un programmino che attraverso LCD e tastierino numerico chieda la password, ne controlli la correttezza e, se corretta stampa la parola "menu" e attende l'inserimento di un numero corrispondente ad una funzionalità del menu (per ora attiva solo quella del sensore di fiamma), mentre se errata stampa "password errata" e richiede la password. il mio problema è che una volta inserita la password corretta il programma richiama la funzione "menu" ma rilegge ogni nuovo carattere come se fosse l'immissione della password e quindi al 5 carattere chiede di inserire nuovamente la password.
allego il codice, se qualcosa non è chiaro vi prego di chiedere, grazie mille!
/* @name file Keypadlcd
|| @version 1.0.0
|| @original author Borgonovo Niccolò
|| @date 31 july 2013
||
|| @description
|| | Use of the matrix Keypad library in "checking password" and lcd print
|| | Used for checking password and print information on Rover station.
||
|| @circuit
|| | like lcd and keypad circuit
|| #
*/
// include the library code:
#include <LiquidCrystal.h>
#include <Keypad.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(40, 42, 41, 43, 44, 45);
//Variable
int fire;
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
{'1','2','3','a'},
{'4','5','6','b'},
{'7','8','9','c'},
{'*','0','#','d'}
};
byte rowPins[ROWS] = {25, 24, 23, 22}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {31, 30, 29, 28}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
char password[5] = "b030";//password
char tempPassword[5];
int tempPasswordIndex = 0;
//set up
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(20, 4);
// Print a message to the LCD.
lcd.print("Inserire Password");
lcd.setCursor(0, 1);
lcd.print("poi premere un tasto");
lcd.setCursor(0, 2);
lcd.print("per confermare");
lcd.setCursor(0, 3);
}
void loop(){
char key = keypad.getKey();
if (key){
tempPassword[tempPasswordIndex] = key; //reading password
tempPasswordIndex++;
lcd.print("*");
if(tempPasswordIndex>4) //4 char for password
{
tempPasswordIndex = 0;
if(checkPassword()) //if true...
{
lcd.clear();
lcd.print("Password corretta");
delay(1000);
lcd.clear();
lcd.print("Benvenuto Borgo !");
delay(2000);
lcd.clear();
lcd.print("Menu");
menu(); // call "menu"
}
else //if false...
{
lcd.clear();
lcd.print("Password errata");
delay(500);
lcd.setCursor(0, 1);
lcd.print("Inserire nuovamente");
lcd.setCursor(0, 2);
lcd.print("la Password");
}
}
}
delay(100);
}
boolean checkPassword() // checking password
{
if(strncmp(password, tempPassword, 4) == 0)
{
return true;
}
else {
return false;
}
}
void menu() // <-------------------------- NOT WORK
{
char esci;
char sceltamenu = keypad.getKey();
lcd.print(" funzione menu");
//scelta menu
switch (sceltamenu) //<<------------- NOT WORK <------ stampa funzione menu, dopodichè rilegge ogni nuovo carattere come se fosse l'immissione della password
{
case '0':
lcd.print("Non Disponibile");
break;
case '1': // flame sensor
do{
esci = keypad.getKey();
lcd.print("Premere 1 per menu");
fire=analogRead(5); // Signal wire(green one) connect to analog pin 5. Red one connect to VCC and black one connect to GND.
if(fire<700){
lcd.print("Fire");
}
else{
lcd.print("No Fire");
}
delay(1000); // aspetta un secondo
}while(esci=!1);
break;
case '2':
lcd.print("Non Disponibile");
break;
case '3':
lcd.print("Non Disponibile");
break;
case '4':
lcd.print("Non Disponibile");
break;
case '5':
lcd.print("Non Disponibile");
break;
case '6':
lcd.print("Non Disponibile");
break;
case '7':
lcd.print("Non Disponibile");
break;
case '8':
lcd.print("Non Disponibile");
break;
case '9':
lcd.print("Non Disponibile");
break;
case 'a':
lcd.print("Non Disponibile");
break;
case 'b':
lcd.print("Non Disponibile");
break;
case 'c':
lcd.print("Non Disponibile");
break;
case 'd':
lcd.print("Non Disponibile");
break;
case '*':
lcd.print("Non Disponibile");
break;
}
}
edit by mod: per favore includi il codice usando gli appositi tag