2016-12-05 9 views
0

Arduinoの起動/停止システムに問題があります。コードの新しいコピーをアップロードすると、コードを有効または無効にすることができますが、アップロード後に有効にしてセキュリティシステムを無効にしようとすると、2つの番号しか取り込まれず、誤ったパスワードになります。Arduinoキーパッド4x4からLCDの起動/停止(ホームセキュリティシステム)

#include "Keypad.h" 
#include "LiquidCrystal.h" 
#include "Password.h" 
LiquidCrystal lcd(0,1,10,11,12,13); 
char newPasswordString; //hold the new password 
char newPassword[4]; //character 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; 
// keypad type definition 
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] = {9,8,7,6}; //Rows 0 to 4 
byte colPins[COLS]= {5,4,3,2}; //Columns 0 to 4 

int count=0; 

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

void setup() 
{ 

    lcd.begin(16, 2); 
    mainScreen(); 
} 

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

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

void activate() { 
    if (password.evaluate()){ 
     lcd.clear(); 
     lcd.print("Activated."); 
     delay(1000); 
     mainScreen(); 
    } else { 
     lcd.clear(); 
     lcd.print("Wrong Password!"); 
    } 
} 

void deactivate(){ 
    if (password.evaluate()){ 
     lcd.clear(); 
     lcd.print("Deactivated."); 
     delay(1000); 
     mainScreen(); 
    } else { 
     lcd.clear(); 
     lcd.print("Wrong Password!"); 
     delay(1000); 
     mainScreen(); 
    } 
} 

void mainScreen(){ 
    lcd.clear(); 
    lcd.print("Enter Pin:"); 
    keypad.getKey(); 


} 
+0

あなたが実際に推測パスワードをクリアすることはありません。あなたは、LCD画面上に表示された推測をクリアするだけです。 –

答えて

0

これは初めて(アクティブ化)動作し、次回(非アクティブ化)は動作しません。 processNumberKeybyte currentPasswordLength = 0;

  • インクリメント:

    1. グローバル変数の宣言と初期化:currentPasswordLenght

      のみ出現は、これらのあるcurrentPasswordLength++;

    2. 比較と呼んactivateprocessNumberKey中:if (currentPasswordLength == maxPasswordLength) {

    第3のものもex 2番目のキーを押した後に無効化(第2ラウンド)が失敗してmaxPasswordLength6であり、有効化後にcurrentPasswordLength4である理由を平野に示します。作業コードの

    例:

    #include <Key.h> 
    #include <Keypad.h> 
    
    #include <Password.h> 
    
    const byte ROWS = 4; //four rows 
    const byte COLS = 4; //four columns 
    
    const char keys[ROWS][COLS] = { 
        {'1','2','3','A'}, 
        {'4','5','6','B'}, 
        {'7','8','9','C'}, 
        {'*','0','#','D'} 
        }; 
    
    const byte rowPins[ROWS] = {9,8,7,6}; 
    const byte colPins[COLS] = {5,4,3,2}; 
    
    Keypad keypad { makeKeymap(keys), rowPins, colPins, ROWS, COLS }; 
    Password passwd { "1234" }; 
    
    bool activated = false; 
    byte  count = 0; 
    
    uint32_t timeout = 0; 
    
    void setup() { 
        Serial.begin(115200); 
    } 
    
    void loop() { 
        char key = keypad.getKey(); 
    
        switch (key) { 
        case '0' ... '9': 
         Serial.print(key); 
         passwd << key; 
         timeout = millis() + 5000; 
         if (++count == 4) { 
         Serial.println(); 
         if (passwd.evaluate()) { 
          activated = !activated; 
          Serial.println(activated ? F("Activated") : F("Deactivated")); 
         } else { 
          Serial.println(F("Wrong password")); 
         } 
         passwd.reset(); 
         count = 0; 
         } 
         break; 
        case 'A' ... 'D': 
         break; 
        default: 
         delay(60); 
         break; 
        } 
    
        if ((count != 0) && (millis() > timeout)) { 
        Serial.println(F("\nTimeout")); 
        passwd.reset(); 
        count = 0; 
        } 
    } 
    
  • +0

    全く起動しません。私がそれを実行し、ピンに入れるたびにそれは非アクティブになります –

    +0

    @ ShivPatel 4番目の数字キーの後に 'A'キーを押しましたか?パスワードが6つのキーの場合にのみ、 'activate()'が自動的に呼び出されます。 – KIIV

    +0

    どのように変更すれば鍵長をチェックするのではなく、パスワードを確認するだけです –

    関連する問題