Код: #include <Keypad.h> #include <LiquidCrystal.h> #include <EEPROM.h>
#define lockPin 2 const String newPasswordKey = "s*123#s"; const int errorDelayTime = 1500; const byte ROWS = 4; const byte COLS = 4; char Keys[ROWS][COLS] = { {'1','2','3','c'}, {'4','5','6','d'}, {'7','8','9','a'}, {'*','0','#','s'} };
byte rowPins[ROWS] = {12, 11, 10, 9}; byte colPins[COLS] = {8, 7, 6, 5};
Keypad _keyboard = Keypad( makeKeymap(Keys), rowPins, colPins, ROWS, COLS);
LiquidCrystal lcd(A5, A4, A3, A2, A1, A0); String inputStr = ""; boolean checkStr = false; byte currentCursorPosition = 0; boolean makeNewPassword = false;
void setup(){ lcd.begin(16, 2); pinMode(lockPin, OUTPUT); }
void loop(){ char button = _keyboard.getKey();
if (button){ if (button == 'c'){ inputStr = ""; makeNewPassword = false; lcd.clear(); } else if (button == 'd'){ if(inputStr.length()>0){ byte currentPosition = inputStr.length()-1; inputStr.setCharAt(currentPosition, ' '); inputStr.trim(); lcd.setCursor(currentPosition, 1); lcd.write(" "); lcd.setCursor(currentPosition, 1); } } else if (button == 'a'){ checkStr = true; } else{ inputStr += button; lcd.setCursor(inputStr.length()-1, 1); if(makeNewPassword){ lcd.print(button); } else{ lcd.print("*"); } } }
if(inputStr.length()>=4 && checkStr == true){ int inputStrLen = inputStr.length(); if (inputStr == newPasswordKey){ lcd.clear(); lcd.write("New Password:"); lcd.setCursor(0,1); makeNewPassword = true; } else if(makeNewPassword == true){ if(inputStr.indexOf('s')>-1){ //ERROR //sound signal lcd.clear(); lcd.print("forbidden character"); delay(errorDelayTime); lcd.clear(); } else{ //read the new password and save it to the EEPROM for(int address = 0; address<1024; address++){ if((EEPROM.read(address) == 0xFF) && (EEPROM.read(address+1) == 0xFF)){ for(int Nchar=0; Nchar<inputStrLen; Nchar++){ EEPROM.write(address+1+Nchar, inputStr[Nchar]); } lcd.clear(); //sound signal lcd.print("PASSWORD SAVED"); delay(errorDelayTime); lcd.clear(); break; } if(address==1021){ //No space for new passwords //sound signal lcd.clear(); lcd.print("OUT OF MEMORY"); delay(errorDelayTime); lcd.clear(); break; } } }
makeNewPassword == false; }
else{ //check passwords byte currentEEPROMCell; String EEPROMPassword = ""; for(int readAddress=0; readAddress < 1024; readAddress++){ currentEEPROMCell = EEPROM.read(readAddress); if(currentEEPROMCell!= 0xFF){ EEPROMPassword += (char)currentEEPROMCell; } else{ if(inputStr == EEPROMPassword){ //sound signal lcd.clear(); lcd.print("ACCESS GRANTED"); digitalWrite(lockPin, HIGH); delay(2500); digitalWrite(lockPin, LOW); lcd.clear(); break; } else if(EEPROM.read(readAddress+1) == 0xFF){ //sound signal lcd.clear(); lcd.print("ACCESS DENIED"); delay(errorDelayTime); lcd.clear(); break; } else{ EEPROMPassword = ""; } } } EEPROMPassword = ""; } inputStr = ""; } else if(checkStr == true){ //String is too short lcd.clear(); lcd.print("SHORT PASSWORD"); delay(errorDelayTime); lcd.clear(); inputStr = ""; }
checkStr = false;
}
|