TTL Phòng gửi vào
- 23519 lượt xem
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ếng. 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ó!
2. Phần cứng
- Bàn phím 4x4 hay mọi người tự tạo cho mình một cái bàn phím!
- Arduino UNO, NANO, MEGA. Tùy vào số lượng thiết bị. Ở dưới code mình viết cho Ardunio MEGA!
- LCD 1602.
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!
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. 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); }