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 I: Dùng mật khẩu (Sử dụng EEPROM)

I. Mở đầu

Xin chào tất cả mọi người, hôm nay mình xin giới thiệu với mọi người cách làm làm và tư duy tiếp cận các sản phẩm tương tự (mường tượng về hoạt động của các thiết bị) về KHÓA hiện đại. Một thiết bị vô cùng "quen thuộc" và nhiều pha làm chúng ta tức tưởi khi nó "CÓ cũng như KHÔNG" khi ta được các tay "đạo chích- KID version Việt Nam" thăm viếngwink. Như mọi người đã thấy trên thị trường có rất nhiều loại khóa (toàn nước ngoài sản xuất) như dùng mật khẩu, vân tay, sinh trắc học, thẻ từ...mỗi phương thức có các ưu nhược điểm khác nhau. Với bài viết này, chúng ta sẽ bắt đầu bằng khóa mật khẩu! Hãy cùng tôi, chế tạo thương hiệu khóa Việt, bạn nhé.

Mọi người cứ từ từ đừng vội, chúng ta cứ bắt đầu từ từ, với các bài tiếp theo chúng ta sẽ tiếp cận với các phương thức khác và nâng cấp cao hơn là bảo vệ nhiều tầng nhằm phát huy và khắc phục các nhược điểm của các phương thức khác (chìa khóa ý)! Một dự án mình đã từng làm mọi người có thể xem video ở dưới!

TTL Phong

Lưu ý: Mọi người có thể sáng tạo thành các sản phẩm thật hữu ích nhưng đừng làm giống để đem tham gia các cuộc thi gì nhé vì sản phẩm của mình đã tham gia nhiều cuộc thi rồi. Ai làm giống nữa thì không được gì đâu và còn rối cho mình! Mong mọi người thông cảm! Mình cũng bắt đầu ardunio từ những dòng code của người ta thôi, quan trọng là ta sáng tạo-kiểm soát nó với đam mê nhá!

II. Chuẩn bị

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!).

Mọi số bạn chỉ quen dùng thư viện hay copy code  mà không quan tâm lắm đến nó nên mình muốn tạo ít động lực cho mọi người tự tư duy để có những thuật toán dòng code thật hay!angel

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!

 Bàn phím Ardunio MEGA
R1 22
R2 24
R3 26
R4 28
C1 30
C2 32
C3 34
C4 36

Đố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. Code và kết thúc

Code này mọi người nên bỏ một số phần giống nhau vào chương trình con, mình hơi lười copy past.wink Mật khẩu sẽ lưu trữ và đặt lại khi reset. Đó là một bất tiện đúng không! Bài viết tới mình sẽ hướng dẫn về chương trình đổi mật khẩu, nó cũng đơn giản thôi biết đâu mình chưa làm mà mọi người đã viết xong! ĐỪNG QUÊN CHO MÌNH 1 ĐIỂM HỮU ÍCH NẾU THẤY HAY NHÉ! CHÚC MỌI NGƯỜI THÀNH CÔNG! CẢM ƠN MỌI NGƯỜI!

TTL Phong

#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 = 0;
int datpass2 = 0;
int datpass3 = 0;
int datpass4 = 0;
int datpass5 = 0;
int datpass6 = 0;
int datpass7 = 0;
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 = 0;
int pass2 = 0;
int pass3 = 0;
int pass4 = 0;
int pass5 = 0;
int pass6 = 0;
int pass7 = 0;
int pass8 = 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.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(key==1)
    {
      digitalWrite(13, HIGH);
    }
    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;
    }
}
 
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);  
   
}
lên
35 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ả

CÁCH HỒI SINH MÔ ĐUN SIM900A MINI BỊ HƯ TỤ - NHÌN NHẬN VỀ KHẮC PHỤC CÁC HƯ HỎNG CỦA CÁC THIẾT BỊ ĐIỆN TỬ

Chào tất cả mọi người, bài viết này xin hướng dẫn những ai đã từng ngậm ngùi khi vô tình sơ suất làm hỏng tụ mô đun Sim900A và giúp những bạn trẻ mới vọc vạch về điện tử như mình đã từng phương hướng hồi sinh các mô đun điện tử bị hỏng hóc cái gì đó ại một vị trí nào đó.

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

SIM900A-NẠP TIỀN TỪ XA VÀO SIM TRÊN MÔ ĐUN

Đây là vấn đề mình đã nghiên cứu ra từ lâu rồi nhưng bận quá, gần cả tháng chưa viết bài lại. Và bây giờ làm một phát vào năm học mới cho nó xôm. Không dài dòng lôi thôi, vấn đề nạp tài khoản từ xa cũng rất là hữu ích cho nhiều dự án có GSM và khai thác rất nhiều về chúng nên việc hao tổn tài khoản là tất nhiên, có thể các bạn có các mẹo tận dụng tài nguyên như dùng sim khuyến mãi, học sinh sinh viên hay các gói các loại thuê bao gì đấy.. để tiết kiệm nhưng về mặt tiện lợi và lâu dài thì đây là giải pháp tối ưu nhất!hehe,vào bài thôi!winkVà trước khi đọc tiếp đề nghị quá vị, quáy bà con cô bác nội ngoại "n" họ xem lại các bài viết khác về Sim900A của mình với từ khóa Sim900 trên thanh tìm kiếm!devil

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