อยากทรายรายละเอียด Code ของ แต่ละแถวว่าทำงานยังไงกำหนดอะไรบ้าง

กระทู้คำถาม
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <EEPROM.h>
#define Password_Lenght 5

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal_I2C lcd(0x27,16,2);

const byte ROWS = 4;
const byte COLS = 4;
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};
byte colPins[COLS] = {5, 4, 3, 2};

char Data[Password_Lenght];
char Data2[Password_Lenght];
char Master[Password_Lenght];
byte data_count = 0, master_count = 0;
bool Pass_is_good;
char key;
byte key_state = 0;
char last_press_key;
byte mode = 0;

int change_password_allow_time = 10000;
long time_old = 0;
bool just_allowed_pass =0;

char FistTimePassword[] = {'1','2','3','4'}; // setup first-time password here


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

void setup(){
  Serial.begin(9600);
  Check_EEPROM();
lcd.init();                      // initialize the lcd
  lcd.init();
  lcd.begin(16, 2);
lcd.clear();
lcd.backlight();
  pinMode(13, OUTPUT);
  digitalWrite(13,HIGH);
  pinMode(12, OUTPUT);
  digitalWrite(12,HIGH);
  
}
  
void loop()
{
  key = keypad.getKey();
  key_state = keypad.getState();

  if(key){
    last_press_key = key;
    Serial.println(key);
  }


if( mode == 3){
    if(last_press_key == 'A' && key_state == 2){
      mode = 1;
    }
    if(last_press_key == '*' && key_state == 2){
      mode = 0;
    lcd.clear();
    lcd.setCursor(4,0);
    lcd.print("LOCKED");
    digitalWrite(13, HIGH);
    delay(2000);          
    }        
}

  if(mode == 0){
    lcd.setCursor(1,0);
    lcd.print("Enter Password");
  }else if(mode == 1){
    lcd.setCursor(0,0);
    lcd.print("Set New Password");    
  }else if(mode == 2){
    lcd.setCursor(0,0);
    lcd.print("Password Again");      
  }else if(mode == 3){
    lcd.setCursor(4,0);
    lcd.print("UNLOCKED");        
  }


  if (key && key != '#' && mode != 3)
  {
    collectKey();
  }

  if(data_count == Password_Lenght-1)
  {
    if(mode == 0){
      lcd.clear();
      if(!strcmp(Data, Master)) {
        lcd.setCursor(2, 0);
        lcd.print("WELCOME BACK");
        lcd.setCursor(4, 1);
        lcd.print("MASTER");
        
        just_allowed_pass = 1;
        time_old = millis();
  
        digitalWrite(13, LOW);
        
        delay(2000);
        mode = 3;
      }
      

    
      else{
        lcd.setCursor(2, 0);
        lcd.print("INCORRECT !");
        lcd.setCursor(4, 1);
        lcd.print("PASSWORD");
        delay(2000);
      }
      delay(1000);//
      lcd.clear();
      clearData();
      
     // digitalWrite(13, LOW);
    }else if( mode == 1){
      lcd.clear();
      mode = 2;
      for(int i = 0; i < Password_Lenght; i = i+1){
      Data2 = Data;
     }
      clearData();
    }else if(mode == 2){
      if(!strcmp(Data, Data2)){
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("New Password is ");  
        lcd.setCursor(4, 1);  
        lcd.print(Data);  
        delay(2000);
        lcd.clear();
        lcd.setCursor(4, 0);
        lcd.print("Saving...");
        for(int i =0; i <= 100; i =  i+10){
          lcd.setCursor(4, 1);
          lcd.print(i);
          lcd.setCursor(7, 1);
          lcd.print("%");
          delay(200);
        }
        EEPROM.put(0, Data);
        EEPROM.get(0, Master);
        delay(500);
      }else{
        lcd.clear();
        lcd.setCursor(4, 0);
        lcd.print("PASSWORD");  
        lcd.setCursor(3, 1);  
        lcd.print("NOT MATCH!");  
        delay(2000);        
      }
      mode = 3;
      clearData();
      lcd.clear();
    }
  }
}

void collectKey(){
  Data[data_count] = key;
  lcd.setCursor(4+data_count,1);
  lcd.print("*");
  data_count++;  
}

void clearData()
{
  while(data_count !=0)
  {  
    Data[data_count--] = 0;
  }
}


void Check_EEPROM(){
  EEPROM.get(0, Master);
  if(Master[0] == 0 && Master[1] == 0 && Master[2] == 0 && Master[3] == 0){ // check if EEPRM have store password ?
    Serial.println("'0','0','0','0'"); // if not found will burn EEPROM a first time password
    EEPROM.put(0, FistTimePassword);
    
    EEPROM.get(0, Master);
  }
}
แสดงความคิดเห็น
โปรดศึกษาและยอมรับนโยบายข้อมูลส่วนบุคคลก่อนเริ่มใช้งาน อ่านเพิ่มเติมได้ที่นี่