Arduino Polska Forum

Pełna wersja: password.h
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam. Mam pytanko odnośnie biblioteki pasword.h na które nie znalazłem odpowiedzi.

Kod:
#include <Keypad.h>
#include <Password.h>

String newPasswordString; //hold the new password
char newPassword[6]; //charater string of newPasswordString

//initialize password to 1234
//you can use password.set(newPassword) to overwrite it
Password password = Password( "1234" );

byte maxPasswordLength = 6;
byte currentPasswordLength = 0;
const byte ROWS = 4; // Four rows
const byte COLS = 4; // Four columns

//Define the keymap
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};

//// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = {6,7,8,9}; //connect to row pinouts

// Connect keypad COL0, COL1, COL2 and COL3 to these Arduino pins.
byte colPins[COLS] = {2,3,4,5}; //connect to column pinouts

// Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
   Serial.begin(9600);
}

void loop(){
   char key = keypad.getKey();
   if (key != NO_KEY){
      delay(60);
      switch (key){
      case 'A': break;
      case 'B': break;
      case 'C': break;
      case 'D': changePassword(); break;
      case '#': checkPassword(); break;
      case '*': resetPassword(); break;
      default: processNumberKey(key);
      }
   }
}

void processNumberKey(char key) {
   Serial.print(key);
   currentPasswordLength++;
   password.append(key);
   if (currentPasswordLength == maxPasswordLength) {
      checkPassword();
   }
}

void checkPassword() {
   if (password.evaluate()){
      Serial.println(" OK.");
   } else {
      Serial.println(" Wrong passwowrd!");
   }
   resetPassword();
}

void resetPassword() {
   password.reset();
   currentPasswordLength = 0;
}

void changePassword() {
   newPasswordString = "123";
   newPasswordString.toCharArray(newPassword, newPasswordString.length()+1); //convert string to char array
password.set(newPassword);
   resetPassword();
   Serial.print("Password changed to ");
   Serial.println(newPasswordString);
}

void resetPassword() {
   //do something to resetPassword
}

Po naciśnięciu "D" wywoływana jest funkcja changePassword() która zmienia  hasło na 123. W jaki sposób zrobić tak żeby hasło zmieniało się na takie znaki jakie wstukam na klawiaturze? Nie krzyczcie, ani nie bijcie bo świeżak jestem.
Możesz napisać funkcję czytającą klawiaturę do stringa.
Na przykład:
Kod:
String Password()
{
    String password = "";
    while(1){
        char key = keypad.getKey();
        if (key){
                        
                if ((key=='0') || (key=='1') || (key=='2') ||
                    (key=='3') || (key=='4') || (key=='5') ||
                    (key=='6') || (key=='7') || (key=='8') ||
                    (key=='9')) // jesli wcisnąłem klawisze 0 - 9
                    {
                        password = password + key;// taka konkatenacja, to tylko w Adruino zadziała
                    }

                    if (key=='#') break;// zatwierdzamy wybór
            
                }
    }
    return password;
}

I w funkcji changePassword(), linijkę newPasswordString = "123";
zamień na newPasswordString = Password();

Powinno zadziałać, ale nie testowałem.
Dzięki. Funkcja działa idealnie, oprócz pewnego niuansu, ale o tym później. Buduję zamek do drzwi. Przyciskając do tej pory "D" była możliwa zmiana hasła bez podania poprzedniego i to nowe hasło odblokowywało drzwi. Zmieniłem to funkcją:

Kod:
if (key) {
      if (zmianaHaslaPozycja == 1 && key == zmianaHaslaCyfra1) {
          zmianaHaslaPozycja++;
        } else if (zmianaHaslaPozycja == 2 && key == zmianaHaslaCyfra2) {
          zmianaHaslaPozycja++;
        } else if (zmianaHaslaPozycja == 3 && key == zmianaHaslaCyfra3) {
          zmianaHaslaPozycja++;
        } else if (zmianaHaslaPozycja == 4 && key == zmianaHaslaCyfra4) {
          zmianaHaslaPozycja++;
      changePassword();
      zmianaHaslaPozycja = 1;}
}
Działa to idealnie. Muszę podać hasło aby móc je zmienić. 
A co do tego niuansu to przy zmianie hasła mogę podać większą liczbę cyfr niż zadeklarowana w maxPasswordLength. Postaram się to zmienić.
Dlaczego podczas wgrywania tego kodu pojawia się takie ostrzeżenie? 

Kod:
#include <Keypad.h>
#include <Password.h>

String newPasswordString; //hold the new password
char newPassword[6]; //charater string of newPasswordString

//initialize password to 1234
//you can use password.set(newPassword) to overwrite it
Password password = Password( "1234" );

byte maxPasswordLength = 6;
byte currentPasswordLength = 0;
const byte ROWS = 4; // Four rows
const byte COLS = 4; // Four columns

//Define the keymap
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};

//// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = {6,7,8,9}; //connect to row pinouts

// Connect keypad COL0, COL1, COL2 and COL3 to these Arduino pins.
byte colPins[COLS] = {2,3,4,5}; //connect to column pinouts

// Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
   Serial.begin(9600);
}

void loop(){
   char key = keypad.getKey();
   if (key != NO_KEY){
      delay(60);
      switch (key){
      case 'A': break;
      case 'B': break;
      case 'C': break;
      case 'D': changePassword(); break;
      case '#': checkPassword(); break;
      case '*': resetPassword(); break;
      default: processNumberKey(key);
      }
   }
}

void processNumberKey(char key) {
   Serial.print(key);
   currentPasswordLength++;
   password.append(key);
   if (currentPasswordLength == maxPasswordLength) {
      checkPassword();
   }
}

void checkPassword() {
   if (password.evaluate()){
      Serial.println(" OK.");
   } else {
      Serial.println(" Wrong passwowrd!");
   }
   resetPassword();
}

void resetPassword() {
   password.reset();
   currentPasswordLength = 0;
}

void changePassword() {
   newPasswordString = Password();
   newPasswordString.toCharArray(newPassword, newPasswordString.length()+1); //convert string to char array
password.set(newPassword);
   resetPassword();
   Serial.print("Password changed to ");
   Serial.println(newPasswordString);
}


String Password()
{
    String password = "";
    while(1){
        char key = keypad.getKey();
        if (key){
                       
                if ((key=='0') || (key=='1') || (key=='2') ||
                    (key=='3') || (key=='4') || (key=='5') ||
                    (key=='6') || (key=='7') || (key=='8') ||
                    (key=='9')) // jesli wcisnąłem klawisze 0 - 9
                    {
                        password = password + key;// taka konkatenacja, to tylko w Adruino zadziała
                    }

                    if (key=='#') break;// zatwierdzamy wybór
           
                }
    }
    return password;
}


"C:\Users\Pawel\Desktop\ostatnia_wersja.ino:9:38: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

Password password = Password( "1234" );

                                      ^

Szkic używa 5472 bajtów (17%) pamięci programu. Maksimum to 30720 bajtów.
Zmienne globalne używają 427 bajtów (20%) pamięci dynamicznej, pozostawiając 1621 bajtów dla zmiennych lokalnych. Maksimum to 2048 bajtów."

Nie wiem czy ma to znaczenie ale używam arduino idee 1.8.11

Edit.

Doszedłem o co biega. Linijkę Password password = Password( "1234" ); musiałem zmienić na Password password = Password( (char*)"1234" );