Khóa điện tự bấm số sử dụng Keypad 4x3

16/07/2019
khoa-dien-tu-bam-so-su-dung-keypad-4x3

Xin chào mọi người!

Mục đích nhằm chia sẻ kiến thức và học hỏi thêm kinh nghiệm từ các Pro. Bài viết này mình xin giới thiệu một sản phẩm liên quan đến khóa (khóa cửa, khóa két sắt...).

Mong rằng có được nhiều ủng hộ và đóng góp nhé. Xin cảm ơn!

1. Phần cứng

  • Keypad 4x3 (Cũng có thể sử dụng 4x4)
  • Arduino Uno, Mega, Nano (tùy chọn)
  • Động cơ Servo Sg90
  • LCD1602 
  • I2C LCD. Kết nối với LCD để giảm bớt số chân cắm vào Arduino

2. Code

 
  1. #include <Servo.h> // Khai báo thư viện sử dụng cho động cơ
  2. #include <LiquidCrystal_I2C.h> // Khai báo thư viện LCD sử dụng I2C
  3. LiquidCrystal_I2C lcd(0x27, 16, 2); // 0x27 địa chỉ LCD, 16 cột và 2 hàng
  4. #include <Keypad.h> // Khai báo thư viện Keypad
  5.  
  6. const byte ROWS = 4; // Bốn hàng
  7. const byte COLS = 3; // Ba cột
  8. char keys[ROWS][COLS] = {
  9. {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, {'*', '0', '#'}};
  10. byte rowPins[ROWS] = {5, 4, 3, 2};
  11. byte colPins[COLS] = {8, 7, 6};
  12. Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
  13. Servo myServo;
  14.  
  15. char STR[4] = {'2', '0', '1', '8'}; // Cài đặt mật khẩu tùy ý
  16. char str[4] = {' ', ' ', ' ', ' '};
  17. int i, j, count = 0;
  18.  
  19. void setup() {
  20. myServo.attach(9); // Khai báo chân điều khiển động cơ
  21. lcd.init(); // Khai báo sử dụng LCD
  22. lcd.begin(16, 2);
  23. lcd.backlight();
  24. lcd.clear();
  25. lcd.print(" Enter Password");
  26. }
  27.  
  28. void loop() {
  29. char key = keypad.getKey(); // Ký tự nhập vào sẽ gán cho biến Key
  30.  
  31. if (key) // Nhập mật khẩu
  32. {
  33. if (i == 0) {
  34. str[0] = key;
  35. lcd.setCursor(6, 1);
  36. lcd.print(str[0]);
  37. delay(1000); // Ký tự hiển thị trên màn hình LCD trong 1s
  38. lcd.setCursor(6, 1);
  39. lcd.print("*"); // Ký tự được che bởi dấu *
  40. }
  41. if (i == 1) {
  42. str[1] = key;
  43. lcd.setCursor(7, 1);
  44. lcd.print(str[1]);
  45. delay(1000);
  46. lcd.setCursor(7, 1);
  47. lcd.print("*");
  48. }
  49. if (i == 2) {
  50. str[2] = key;
  51. lcd.setCursor(8, 1);
  52. lcd.print(str[2]);
  53. delay(1000);
  54. lcd.setCursor(8, 1);
  55. lcd.print("*");
  56. }
  57. if (i == 3) {
  58. str[3] = key;
  59. lcd.setCursor(9, 1);
  60. lcd.print(str[3]);
  61. delay(1000);
  62. lcd.setCursor(9, 1);
  63. lcd.print("*");
  64. count = 1;
  65. }
  66. i = i + 1;
  67. }
  68.  
  69. if (count == 1) {
  70. if (str[0] == STR[0] && str[1] == STR[1] && str[2] == STR[2] &&
  71. str[3] == STR[3]) {
  72. lcd.clear();
  73. lcd.print(" Correct!");
  74. delay(3000);
  75. myServo.write(180); // Mở cửa
  76. lcd.clear();
  77. lcd.print(" Opened!");
  78. i = 0;
  79. count = 0;
  80. } else {
  81. lcd.clear();
  82. lcd.print(" Incorrect!");
  83. delay(3000);
  84. lcd.clear();
  85. lcd.print(" Try Again!");
  86. delay(3000);
  87. lcd.clear();
  88. lcd.print(" Enter Password");
  89. i = 0;
  90. count = 0;
  91. }
  92. }
  93.  
  94. switch (key) {
  95. case '#':
  96. lcd.clear();
  97. myServo.write(90);
  98. Đóng cửa lcd.print(" Closed!");
  99. delay(10000);
  100. lcd.clear();
  101. lcd.print(" Enter Password");
  102. i = 0;
  103. break;
  104. }
  105. }
Bình luận
Nội dung này chưa có bình luận, hãy gửi bình luận đầu tiên của bạn.
VIẾT BÌNH LUẬN CỦA BẠN