KHÓA THÔNG MINH - Cái nhìn tiếp cận các sản phẩm công nghiệp có tính ứng dụng cao - PHẦN II: Dùng-Đổi tự do mật khẩu (Sử dụng EEPROM)

I. Mở đầu

Xin chào mọi người, hôm nay chúng ta tiếp tục với chuỗi bài về chiếc khóa thông minh nhưng đơn giản, bài viết trước chúng ta đã tiếp cận với kĩ thuật đặt mật khẩu "chết" -mặc định cho khóa thì hôm nay sẽ lên một bước mới là đổi mật khẩu tự do. Để hiệu quả của bài viết này cao hơn mời mọi người vui lòng đọc kĩ bài viết trước tại đây và hiển nhiên tất cả các bài viết đúng không ạ!wink

Luôn nghiên cứu sâu sắc tất cả các vấn đề!

II. Chuẩn bị

mình xin sao lại ở bài viết trước!

1. EEPROM (bộ nhớ của ardunio)? Tại sao cần nó!

  • Để biết về EEPROM mọi người xem tại đây.
  • Về mục đích: ghi nhớ mật khẩu ta cài đặt.

2. Phần cứng

3. Phần mềm

  • Ardunio IDE hay codebender...
  • Các thư viện cần thiết thì trong ardunio IDE đã có sẵn. Còn về bàn phím 4x4 thì mình không dùng thư viện mà sẽ trình bày code rõ ràng trong chương trình con. Còn bạn nào muốn có hướng đi tượng tự thì tham khảo ở đây (nên đọc nó trước khi đọc tiếp bài viết!).

4. Kết nối: 

Đối với bàn phím khi các bạn mua về R1 bắt đầu từ trái! và nối vào các chân Digital thế nào cũng được chỉ cần sửa trong code!

Đối với LCD các bạn thích kết nối thế nào thì tùy, miễn là khai báo trong code hoặc dùng I2C.

III. Định hướng thuật toán

Đơn giản là thế này, ta hãy hình dung khi đến sân vận động xem đá bóng hay vào xem phim, đến hội trường...nó sẽ có các khán đài, dãy ghế A-Bờ-Cờ gì đó đúng không ạ. Vé cầm trên tay của chúng ta là Á-Ớ gì đấy thì chúng ta phải đến đúng chỗ đúng không nào. Vị thì ở đây khi chương trình chạy mấy cái vé đó là biến (int vong), các khán đài là các chương trình nhập-đổi mật khẩu...khi ta thực hiện thao tác thì sẽ gắn biến cho một giá trị, giá trị đó chỉ tương xứng với một chương trình để đẩy hệ thống vào chương trình cần thực hiện!!!!!!yehh. hết giờ xem thì ra về thôi và không vé tốt nhất bà con đừng mò vào nhé!kkkkksurprise

IV. Code và kết thúc

Mọi người tự xử phần chương trình con nhá, các phần sau chúng ta sẽ tìm hiểu về bảo vệ nhiều lớp tức phối hợp nhiều "chìa" để tăng tính bảo vệ như thẻ từ ...và nâng cao là thêm bớt các chìa tự do chứ không phải nạp lại chương trình...Các bài viết tới mình sẽ quay lại về kĩ thuật sử dụng Sim900A dùng cuôc gọi điều khiển "NHIỀU" thiết bị và các bí kiếp tận dụng các chân Ardunio khi gặp dự án cần nhiều chân chức năng nhưng bị trùng nhau và chiếm hết chỗ...Mong mọi người ủng hộ để có động lực để viết lách trong hè. Cảm ơn mọi người!heart

À cái này nữa, mong mọi người thông cảm đừng sao y chang dự án của em để đề tài hay gì nha tuy nó có thể không pro và hay (hiển nhiên là điều không cần đối với các cao thủ của chúng ta) vì em đang muốn hiện thực-kinh tế hóa nó và đang hoàn thành giấy tờ về bản quyền thiết kế devil(tất cả vì chí hướng phát triển KHCN nước nhà thôi)!

Nếu chỉ để code như vậy thì chắc chắn khi mất điện hoặc reset mật khẩu sẽ trờ về mặc định (chính là mật khẩu ta đã đặt trong phần void setup) vì vậy muốn dù có mất điện hay reset mà mật khẩu ta đã đổi không bị mất thì sao khi nạp chương trình lần 1, nạp lại lần 2 nhưng xóa code từ dòng 81-88 đi, chúc mọi người thành công!angel

#include <LiquidCrystal.h>
#include <EEPROM.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);//khai báo chân cho LCD co thể thay đổi.
int k;//biến gán cho phím.
int i;//biến đếm.
//mật khẩu có 8 kí tự.
int datpass1 ;
int datpass2 ;
int datpass3 ;
int datpass4 ;
int datpass5 ;
int datpass6 ;
int datpass7 ;
int datpass8 = 0;//các biến để đặt mật khẩu.
int key = 0;//trạng thái của khóa.
int sai=0;//dùng báo động.
int u=0;//biến đếm thời gian.
//biến mật khẩu nhập vào.
int pass1 ;
int pass2 ;
int pass3 ;
int pass4 ;
int pass5 ;
int pass6 ;
int pass7 ;
int pass8 ;
//các biến mật khẩu nhập vào khi muốn đổi.
int  passd1 = 0;
int  passd2 = 0;
int  passd3 = 0;
int  passd4 = 0;
int  passd5 = 0;
int  passd6 = 0;
int  passd7 = 0;
int  passd8 = 0;
//các biến mk xác nhận khi muốn đổi.
int  passx1 = 0;
int  passx2 = 0;
int  passx3 = 0;
int  passx4 = 0;
int  passx5 = 0;
int  passx6 = 0;
int  passx7 = 0;
int  passx8 = 0;
int vong=0;//mỗi vòng lặp phím có chức năng khác nhau tiện cho bổ sung các
//khả năng của khóa.
//các chân nối bàn phím với MEGA thích thì đổi.
const int row1 = 22;
const int row2 = 24;
const int row3 = 26;
const int row4 = 28;
const int col1 = 30;
const int col2 = 32;
const int col3 = 34;
const int col4 = 36;

void setup()
{
  lcd.begin(16, 2);//khai báo loại 16x2.
  pinMode(13, OUTPUT);//chân 13 thay cho cơ chế khóa(động cơ hay gì đó.
  digitalWrite(13, LOW);
  pinMode(row1, OUTPUT);
  pinMode(row2, OUTPUT);
  pinMode(row3, OUTPUT); 
  pinMode(row4, OUTPUT);
  pinMode(col1, INPUT_PULLUP);
  pinMode(col2, INPUT_PULLUP);
  pinMode(col3, INPUT_PULLUP);
  pinMode(col4, INPUT_PULLUP);
  digitalWrite(row1, HIGH);
  digitalWrite(row2, HIGH);
  digitalWrite(row3, HIGH);
  digitalWrite(row4, HIGH);
  lcd.begin(16, 2);
  lcd.setCursor(4,0);
  lcd.print("XIN CHAO");
  lcd.setCursor(2,1);
  lcd.print("KHOA DA DONG");
  //đặt mật khẩu này là mặt định khi reset khi quay về mk.mật khẩu là tham số sau dấu phẩy,tùy chỉnh.
  EEPROM.write(0, 1);
  EEPROM.write(1, 2);
  EEPROM.write(2, 3);
  EEPROM.write(3, 4);
  EEPROM.write(4, 5);
  EEPROM.write(5, 6);
  EEPROM.write(6, 7);
  EEPROM.write(7, 8);
  //lấy mật khẩu đã đặt trong bộ nhớ.
  datpass1 = EEPROM.read(0);
  datpass2 = EEPROM.read(1);  
  datpass3 = EEPROM.read(2); 
  datpass4 = EEPROM.read(3);  
  datpass5 = EEPROM.read(4);  
  datpass6 = EEPROM.read(5);  
  datpass7 = EEPROM.read(6);  
  datpass8 = EEPROM.read(7);
  Serial.println(datpass1);
  Serial.println(datpass2);
  Serial.println(datpass3);
  Serial.println(datpass4);
  Serial.println(datpass5);
  Serial.println(datpass6);
  Serial.println(datpass7);
  Serial.println(datpass8);
}

void loop()
{
  keypad_4x4();//gọi chương trình giải mã bàn phím.
  if(k==10)//nếu nhấn phím A bắt đầu nhập mật khẩu.
  {
    vong=1;
  }
  if(vong==1)
  { 
    if(i!=0)//bắt đầu hiển thị những phím nhập vào rồi chuyển thành kí tự đặt biệt để bảo mật.
    {
      switch (i) 
      {
        case 1:
        lcd.setCursor(4,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(4,1);
        lcd.print("*");//in ra kí tự đặc biệt thay cho số
        //mọi người có thể tạo các kí tự sinh động khác bằng 
        //tạo một biến hiển thị,hãy tra cứu google hay trên cộng đồng!
        pass1=k;
        i++;
        break;
        case 3:
        lcd.setCursor(5,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(5,1);
        lcd.print("*");
        pass2=k;
        i++;
        break;
        case 5:
        lcd.setCursor(6,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(6,1);
        lcd.print("*");
        pass3=k;
        i++;
        break;
        case 7:
        lcd.setCursor(7,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(7,1);
        lcd.print("*");
        pass4=k;
        i++;
        break;
        case 9:
        lcd.setCursor(8,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(8,1);
        lcd.print("*");
        pass5=k;
        i++;
        break;
        case 11:
        lcd.setCursor(9,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(9,1);
        lcd.print("*");
        pass6=k;
        i++;
        break;
        case 13:
        lcd.setCursor(10,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(10,1);
        lcd.print("*");
        pass7=k;
        i++;
        break;
        case 15:
        lcd.setCursor(11,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(11,1);
        lcd.print("*");
        pass8=k;
        i++;
        break;
        }
    }
  }   
    if((k==100)and(vong==1))//nhấn phím * thì sẽ xóa hết nhập lại nếu lỡ bấm sai.
    {
      i=0;
      k=0;
      lcd.clear();                
      lcd.setCursor(0, 0);
      lcd.print("NHAP MAT KHAU :");
    }
    if((k==200)and(vong==1))//nhấn phím # thì xác nhận mật khẩu đã nhập đưa vô so sánh với mật khẩu đã lưu.
    {
      if((pass1==datpass1)&(pass2==datpass2)&(pass3==datpass3)&(pass4==datpass4)&(pass5==datpass5)&(pass6==datpass6)&(pass7==datpass7)&(pass8==datpass8))
      {
        lcd.clear();                
        lcd.setCursor(1, 0);
        lcd.print("MAT KHAU DUNG");
        key=1;
        k=0;
        delay(300);
      }
      else
      {
        lcd.clear();                
        lcd.setCursor(2, 0);
        lcd.print("MAT KHAU SAI");
        k=0;
        delay(1000);
        i=0;
        k=0;
        sai++;//tăng số lần sai lên 1.
        lcd.clear();                
        lcd.setCursor(0, 0);
        lcd.print("NHAP MAT KHAU :");
      }
    }
    if(sai==3)//chỉ có 3 lần sai.tới lần 3 vô hiệu hóa khóa.
    {
      lcd.clear();
      lcd.setCursor(3, 0);
      lcd.print("VO HIEU HOA");
      lcd.setCursor(3, 1);
      lcd.print("20s -> 2'");
      //bổ sung vào đây là còi báo động hay gì đó tùy mọi người.
      delay(20000);
      for(u=0;u<=120;u++)
      {
        lcd.clear();
        lcd.setCursor(2, 0);
        lcd.print("VO HIEU HOA");
        lcd.setCursor(7, 1);
        lcd.print(u);
        delay(1000);
      }
      lcd.clear();                
      lcd.setCursor(4,0);
      lcd.print("XIN CHAO");
      lcd.setCursor(2,1);
      lcd.print("KHOA DA DONG");
      //đặt lại các biến.
      key=0;
      k=0;
      i=0;
      sai=0;
      vong=0;//thoát khỏi chương trình nhập đến khi nhấn phím A.
      pass1 = 0;
      pass2 = 0;
      pass3 = 0;
      pass4 = 0;
      pass5 = 0;
      pass6 = 0;
      pass7 = 0;
      pass8 = 0;
    }
    if((k==13)and(vong==1)and(key==1))//nhấn phím D khi khóa mở thì sẽ đóng lại.
    {
      digitalWrite(13, LOW);
      key=0;
      k=0;
      i=0;
      sai=0;
      vong=0;//thoát khỏi chương trình nhập đến khi nhấn phím A.
      lcd.clear();                
      lcd.setCursor(4,0);
      lcd.print("XIN CHAO");
      lcd.setCursor(2,1);
      lcd.print("KHOA DA DONG");
      pass1 = 0;
      pass2 = 0;
      pass3 = 0;
      pass4 = 0;
      pass5 = 0;
      pass6 = 0;
      pass7 = 0;
      pass8 = 0;
    }
    if((k==11)and(vong==1)and(key==1))//nếu nhấn nút B khi đã nhập đúng mk.
    {
      lcd.clear();                
      lcd.setCursor(2, 0);
      lcd.print("DOI MAT KHAU");
      vong=2;//đẩy vào chương trình đổi mk.
      i=0;
      delay(1800);
      lcd.clear();                
      lcd.setCursor(0, 0);
      lcd.print("NHAP MAT KHAU :");
    }
    if(vong==2)//bắt đầu chương trình đổi mk.
    {
      switch (i) 
      {
        case 1:
        lcd.setCursor(4,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(4,1);
        lcd.print("*");
        passd1=k;
        i++;
        break;
        case 3:
        lcd.setCursor(5,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(5,1);
        lcd.print("*");
        passd2=k;
        i++;
        break;
        case 5:
        lcd.setCursor(6,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(6,1);
        lcd.print("*");
        passd3=k;
        i++;
        break;
        case 7:
        lcd.setCursor(7,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(7,1);
        lcd.print("*");
        passd4=k;
        i++;
        break;
        case 9:
        lcd.setCursor(8,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(8,1);
        lcd.print("*");
        passd5=k;
        i++;
        break;
        case 11:
        lcd.setCursor(9,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(9,1);
        lcd.print("*");
        passd6=k;
        i++;
        break;
        case 13:
        lcd.setCursor(10,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(10,1);
        lcd.print("*");
        passd7=k;
        i++;
        break;
        case 15:
        lcd.setCursor(11,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(11,1);
        lcd.print("*");
        passd8=k;
        i=0;
        k=0;
        vong=3;//đẩy vào chương trình nhập để xác nhận lại.
        break;
      }
    }
    if(vong==3)//vào chương trình nhập để xác nhận lại.
    {  
       delay(200);
       lcd.clear();                
       lcd.setCursor(4, 0);
       lcd.print("NHAP LAI");
       delay(500);
       switch (i) 
      {
        case 1:
        lcd.setCursor(4,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(4,1);
        lcd.print("*");
        passx1=k;
        i++;
        break;
        case 3:
        lcd.setCursor(5,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(5,1);
        lcd.print("*");
        passx2=k;
        i++;
        break;
        case 5:
        lcd.setCursor(6,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(6,1);
        lcd.print("*");
        passx3=k;
        i++;
        break;
        case 7:
        lcd.setCursor(7,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(7,1);
        lcd.print("*");
        passx4=k;
        i++;
        break;
        case 9:
        lcd.setCursor(8,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(8,1);
        lcd.print("*");
        passx5=k;
        i++;
        break;
        case 11:
        lcd.setCursor(9,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(9,1);
        lcd.print("*");
        passx6=k;
        i++;
        break;
        case 13:
        lcd.setCursor(10,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(10,1);
        lcd.print("*");
        passx7=k;
        i++;
        break;
        case 15:
        lcd.setCursor(11,1);
        lcd.print(k);
        delay(150);
        lcd.setCursor(11,1);
        lcd.print("*");
        passx8=k;
        i=0;
        vong=4;
        break;
      }
    }
    if(vong==4)//vào chương trình xác nhận lại.
    {
      if(k==200)//khi nhấn #.
      {//so sánh mật khẩu nhập khi đổi lần 1 với nhập khi xác nhận.
        if((passd1==passx1)&(passd2==passx2)&(passd3==passx3)&(passd4==passx4)&(passd5==passx5)&(passd6==passx6)&(passd7==passx7)&(passd8==passx8))
        {
            lcd.clear();                
            lcd.setCursor(3, 0);
            lcd.print("THANH CONG");
            datpass1=passd1;
            datpass2=passd2;
            datpass3=passd3;
            datpass4=passd4;
            datpass5=passd5;
            datpass6=passd6;
            datpass7=passd7;
            datpass8=passd8;
            //ghi vào bộ nhớ.
            EEPROM.write(0,datpass1);
            EEPROM.write(1,datpass2);
            EEPROM.write(2,datpass3);
            EEPROM.write(3,datpass4);
            EEPROM.write(4,datpass5);
            EEPROM.write(5,datpass6);
            EEPROM.write(6,datpass7);
            EEPROM.write(7,datpass8);
            delay(500);
            lcd.clear();                
            lcd.setCursor(4,0);
            lcd.print("XIN CHAO");
            lcd.setCursor(2,1);
            lcd.print("KHOA DA DONG");
            k=0;
            i=0;
            sai=0;
            vong=0;
            pass1 = 0;
            pass2 = 0;
            pass3 = 0;
            pass4 = 0;
            pass5 = 0;
            pass6 = 0;
            pass7 = 0;
            pass8 = 0;
        }
        else
        {
          lcd.clear();                
          lcd.setCursor(4, 0);
          lcd.print("THAT BAI");
          vong=2;
          i=0;
          k=0;
          delay(500);
        } 
      }
    }
}

int keypad_4x4(void)//đọc bàn phím bằng nguyên lí quét các chân Digital.
//chắc mọi người tự hiểu được.
{
   digitalWrite(row1, LOW);
   digitalWrite(row2, HIGH);
   digitalWrite(row3, HIGH);
   digitalWrite(row4, HIGH);
   
   if(digitalRead(col1) == LOW)
   {
    while(digitalRead(col1) == LOW)
    {}
    i++;
     k = 1;//phím 1.
   }
   else if(digitalRead(col2) == LOW)
   {
     while(digitalRead(col2) == LOW)
     {}
     i++;
     k = 2;//phím 2.
   }
   else if(digitalRead(col3) == LOW)
   {
    while(digitalRead(col3) == LOW)
    {}
    i++;
     k = 3; //phím 3.
   }
   else if(digitalRead(col4) == LOW)
   {
    while(digitalRead(col4) == LOW)
    {}
     k = 10;   //phím A.
   }
   delay(1);

   digitalWrite(row1, HIGH);
   digitalWrite(row2, LOW);
   digitalWrite(row3, HIGH);
   digitalWrite(row4, HIGH);
   
   if(digitalRead(col1) == LOW)
   {
    while(digitalRead(col1) == LOW)
    {}
    i++;
     k = 4;//phím 4.
   }
   else if(digitalRead(col2) == LOW)
   {
    while(digitalRead(col2) == LOW)
    {}
    i++;
     k = 5;//phím 5.
   }
   else if(digitalRead(col3) == LOW)
   {
    while(digitalRead(col3) == LOW)
    {}
    i++;
     k = 6; //phím 6.
   }
   else if(digitalRead(col4) == LOW)
   {
    while(digitalRead(col4) == LOW)
    {}
     k = 11;   //phím B.
   }
   delay(1);

   digitalWrite(row1, HIGH);
   digitalWrite(row2, HIGH);
   digitalWrite(row3, LOW);
   digitalWrite(row4, HIGH);
   
   if(digitalRead(col1) == LOW)
   {
    while(digitalRead(col1) == LOW)
    {}
    i++;
     k = 7;//phím 7.
   }
   else if(digitalRead(col2) == LOW)
   {
    while(digitalRead(col2) == LOW)
    {}
    i++;
     k = 8;//phím 8.
   }
   else if(digitalRead(col3) == LOW)
   {
    while(digitalRead(col3) == LOW)
    {}
    i++;
     k = 9; //phím 9.
   }
   else if(digitalRead(col4) == LOW)
   {
    while(digitalRead(col4) == LOW)
    {}
     k = 12;   //phím C.
   }
   delay(1);

   digitalWrite(row1, HIGH);
   digitalWrite(row2, HIGH);
   digitalWrite(row3, HIGH);
   digitalWrite(row4, LOW);
   
   if(digitalRead(col1) == LOW)
   {
    while(digitalRead(col1) == LOW)
    {}
     k = 100;//phím *.
   }
   else if(digitalRead(col2) == LOW)
   {
    while(digitalRead(col2) == LOW)
    {}
    i++;
     k = 0;//phím 0.
   }
   else if(digitalRead(col3) == LOW)
   {
    while(digitalRead(col3) == LOW)
    {}
     k = 200; //phím #.
   }
   else if(digitalRead(col4) == LOW)
   {
    while(digitalRead(col4) == LOW)
    {}
     k = 13;   //phím D.
   }
   delay(1);  
   
}
Youtube: 
lên
18 thành viên đã đánh giá bài viết này hữu ích.
Chuyên mục: 
Các dự án được truyền cảm hứng

Bộ điều khiển PID - ứng dụng phần 2 - xe dò line dùng thuật toán PID

Tiép nối bài viết về xe dò line cảm ơn Đỗ Hữu Toàn đã viết hộ mình phần 4. hôm nay mình sẽ làm cho chiếc xe dò line đi mượt và có hồn hơn 

lên
34 thành viên đã đánh giá bài viết này hữu ích.
Các bài viết cùng tác giả

Arduino - Processing Basic 1

Xin chào mọi người, lâu nay trên cộng đồng của chúng ta đã có nhiều bài viết về arduino-processing, một phương thức điều khiển arduino bằng máy tính sử dụng ngôn ngữ Java tuy đã xuất hiện từ lâu nhưng nó rất hữu ích cho các dự án cần về giao diện điều khiên hay giúp chúng ta luyện tập về ngôn ngữ Java. Những bài đã có trên cộng đồng đa số là về những dự án mẫu ứng dụng processing nên gây khó khăn cho các bạn newbie muốn tìm hiểu và ứng dụng nên mình xin có một vài bài viết hướng dẫn cơ bản về Processing.

lên
14 thành viên đã đánh giá bài viết này hữu ích.
Từ khóa: 

SIM900(A)-KIỂM TRA TÀI KHOẢN TRÊN MÔ ĐUN SIM BẰNG PHƯƠNG TIỆN KHÁC

Hôm nay chúng ta sẽ tiến thêm một bước mới về kiểm soát Sim900A từ xa, một ứng dụng rất cần thiết trong các dự án sử dụng mô đun GSM lâu dài và mở rộng ra sẽ là nạp tài khoản, lấy thông số thời gian, điều khiển nhiều thiết bị bằng DTMF..v.v..

lên
20 thành viên đã đánh giá bài viết này hữu ích.