아두이노 나노 - 키패드 도어락 | Arduino Nano - Keypad Door Lock

이 튜토리얼은 Arduino Nano, 키패드, 솔레노이드 잠금장치 또는 전자기 잠금장치, 그리고 LCD 디스플레이를 사용하여 비밀번호로 보호된 문 잠금 시스템을 구축하는 방법을 안내합니다. 아래는 문 잠금 시스템이 작동하는 방법입니다:

쉽게 하기 위해, 이 튜토리얼은 여러 단계로 나뉘어져 있으며, 쉬운 것부터 어려운 것까지 있습니다:

준비물

1×Arduino Nano Amazon
1×USB A to Mini-B USB cable 쿠팡 | Amazon
1×Keypad 3x4 and 4x4 Kit 쿠팡 | Amazon
1×Relay Amazon
1×Solenoid Lock Amazon
1×12V Power Adapter Amazon
1×DC Power Jack 쿠팡 | Amazon
1×Jumper Wires Amazon
1×(Optional) Electromagnetic Lock Amazon
1×(Optional) LCD I2C 쿠팡 | Amazon
1×(Optional) 9V Power Adapter for Arduino Nano Amazon
1×(Recommended) Screw Terminal Expansion Board for Arduino Nano 쿠팡 | Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

키패드, 솔레노이드 잠금장치, 전자기 잠금장치, 및 LCD 디스플레이에 대하여

솔레노이드 잠금장치와 전자기 잠금장치 모두 문을 잠그거나 열기 위해 사용됩니다. 그들은 주로 기계적 설계 측면에서 서로 다릅니다. 아두이노 나노에 연결하는 배선은 비슷합니다. 그것들을 제어하기 위한 아두이노 나노 코드는 같습니다.

키패드, 솔레노이드 잠금장치, 전자기 잠금장치, LCD 디스플레이(핀아웃, 작동 방식, 프로그래밍 방법 등)에 익숙하지 않은 경우, 다음 튜토리얼이 학습에 도움이 될 수 있습니다:

선연결

아두이노 나노, 키패드 및 솔레노이드 잠금장치를 사용한 배선도

Arduino Nano, keypad, solenoid lock wiring diagram

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

아두이노 나노, 키패드 및 전자기 잠금장치가 있는 배선도

Arduino Nano, keypad, electromagnetic lock wiring diagram

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

아두이노 나노 코드 - 키패드 도어락

/* * 이 Arduino Nano 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano/arduino-nano-keypad-door-lock */ #include <Keypad.h> const int ROW_NUM = 4; //네 줄 const int COLUMN_NUM = 3; //네 열 const int RELAY_PIN = 2; // 리레이 모듈의 IN핀에 연결된 아두이노 나노 핀 const byte pin_rows[ROW_NUM] = {10, 9, 8, 7}; // 키패드의 행 핀에 연결된 아두이노 나노 핀 const byte pin_column[COLUMN_NUM] = {6, 5, 4}; // 키패드의 열 핀에 연결된 아두이노 나노 핀 char key_layout[ROW_NUM][COLUMN_NUM] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, {'*', '0', '#'} }; Keypad keypad = Keypad( makeKeymap(key_layout), pin_rows, pin_column, ROW_NUM, COLUMN_NUM); const String password = "1234"; // 여기에 비밀번호를 변경하세요 String input_password; void setup() { Serial.begin(9600); input_password.reserve(32); // 필요한 경우 변경할 최대 입력 문자는 32입니다 pinMode(RELAY_PIN, OUTPUT); // 핀을 출력으로 초기화합니다. digitalWrite(RELAY_PIN, HIGH); // 문을 잠급니다 } void loop() { char key = keypad.getKey(); if (key) { Serial.println(key); if (key == '*') { input_password = ""; // 입력 비밀번호를 재설정합니다 } else if (key == '#') { if (input_password == password) { Serial.println("The correct password! Unlocking the door in 20 seconds"); digitalWrite(RELAY_PIN, LOW); // 20초 동안 문을 엽니다 delay(20000); digitalWrite(RELAY_PIN, HIGH); // 문을 잠급니다 } else { Serial.println("The incorrect password! try again"); } input_password = ""; // 입력 비밀번호를 재설정합니다 } else { input_password += key; // 입력 비밀번호 문자열에 새로운 문자를 추가합니다 } } }

※ NOTE THAT:

LCD의 주소는 제조업체에 따라 다를 수 있습니다. 우리 코드에서는 DIYables에서 지정한대로 0x27을 사용했습니다.

사용 방법

  • 아두이노 나노와 PC에 USB 케이블을 연결하십시오.
  • 아두이노 IDE를 열고 적절한 보드와 포트를 선택하십시오.
  • 아두이노 IDE의 왼쪽 바에 있는 Libraries 아이콘을 클릭하십시오.
  • “keypad”를 검색한 다음, Mark Stanley와 Alexander Brevig이 만든 keypad 라이브러리를 찾으십시오.
  • Install 버튼을 눌러 keypad 라이브러리를 설치하십시오.
Arduino Nano keypad library

위의 코드를 복사한 뒤, 아두이노 IDE로 열어주세요.

Upload 버튼을 클릭하여 코드를 아두이노 나노에 업로드하세요.

시리얼 모니터를 엽니다.

12345 키를 누른 뒤, # 기호를 누르세요.

그 다음, 1234 키를 누른 뒤, # 기호를 누르세요.

20초 동안 자물쇠 혀의 상태를 확인하세요.

시리얼 모니터에서 결과를 확인하세요.

COM6
Send
The incorrect password! try again The correct password! Unlocking the door in 20 seconds
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

코드 설명

유효한 비밀번호는 아두이노 나노 코드에 미리 정의되어 있습니다. 사용자가 입력한 비밀번호를 저장하기 위해 문자열이 사용되며, 이는 입력 문자열로 언급됩니다. 키패드에서 두 개의 키(*#)는 특별한 목적을 위해 사용됩니다: 비밀번호를 지우고 비밀번호 입력을 종료하기 위해서입니다. 시스템은 다음과 같이 작동합니다:

  • 두 개의 특별한 키를 제외하고, 다른 키가 눌리면 입력 문자열에 추가됩니다.
  • *가 눌리면, 입력 문자열이 지워집니다. 이는 비밀번호의 입력을 시작하거나 재시작하는 데 사용할 수 있습니다.
  • #가 눌렸을 때:
    • Arduino Nano는 입력 문자열을 미리 정의된 비밀번호와 비교합니다. 만약 일치하는 비밀번호가 있다면, Arduino Nano는 릴레이를 제어하여 문을 엽니다.
    • 비밀번호가 정확하든 아니든, Arduino Nano는 다음 입력을 위해 입력 문자열을 지웁니다.

아두이노 나노 코드 - 여러 키

/* * 이 Arduino Nano 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano/arduino-nano-keypad-door-lock */ #include <Keypad.h> const int ROW_NUM = 4; //네 개의 행 const int COLUMN_NUM = 3; //네 개의 열 const int RELAY_PIN = 2; // 릴레이 모듈의 IN 핀에 연결된 아두이노 나노 핀 const byte pin_rows[ROW_NUM] = {10, 9, 8, 7}; // 키패드의 행 핀에 연결된 아두이노 나노 핀 const byte pin_column[COLUMN_NUM] = {6, 5, 4}; // 키패드의 열 핀에 연결된 아두이노 나노 핀 char key_layout[ROW_NUM][COLUMN_NUM] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, {'*', '0', '#'} }; Keypad keypad = Keypad( makeKeymap(key_layout), pin_rows, pin_column, ROW_NUM, COLUMN_NUM); const String password_1 = "1234"; // 여기에 비밀번호 변경 const String password_2 = "5642"; // 여기에 비밀번호 변경 const String password_3 = "12345"; // 여기에 비밀번호 변경 String input_password; void setup() { Serial.begin(9600); input_password.reserve(32); // 최대 입력 문자는 33개, 필요에 따라 변경 pinMode(RELAY_PIN, OUTPUT); // 핀을 출력으로 초기화. digitalWrite(RELAY_PIN, LOW); // 문을 잠근다 } void loop() { char key = keypad.getKey(); if (key) { Serial.println(key); if (key == '*') { input_password = ""; // 입력 비밀번호를 리셋 } else if (key == '#') { if (input_password == password_1 || input_password == password_2 || input_password == password_3) { Serial.println("The correct password! Unlocking the door in 20 seconds"); digitalWrite(RELAY_PIN, HIGH); // 문을 20초 동안 열기 delay(20000); digitalWrite(RELAY_PIN, LOW); // 문을 잠그기 } else { Serial.println("The incorrect password! try again"); } input_password = ""; // 입력 비밀번호를 리셋 } else { input_password += key; // 입력 비밀번호 문자열에 새 문자 추가 } } }

RFID 도어록에 LCD 디스플레이 추가하기

사용자에게 상태(예: 허용/거부)를 표시하기 위해 선택적으로 LCD 디스플레이를 추가할 수 있습니다.

배선도 - 키패드, 솔레노이드 잠금장치 또는 전자기 잠금장치, 그리고 LCD 디스플레이를 사용하는 문 잠금 시스템

Arduino Nano door lock system lcd wiring diagram

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

위의 배선도에서, 릴레이와 LCD가 전력 부족으로 인해 작동하지 않거나 불안정하게 작동할 수 있음을 알려드립니다. 릴레이와 LCD 모두에 외부 전원을 사용하시기를 강력히 권장합니다. 다음 배선도를 참조하시기 바랍니다:

Arduino Nano door lock system lcd external power supply wiring diagram

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

아두이노 나노 코드 - 키패드 도어락

/* * 이 Arduino Nano 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano/arduino-nano-keypad-door-lock */ #include <Keypad.h> #include <LiquidCrystal_I2C.h> const int ROW_NUM = 4; //네 개의 행 const int COLUMN_NUM = 3; //네 개의 열 const int RELAY_PIN = 2; // 릴레이 모듈의 IN 핀에 연결된 아두이노 나노 핀 const byte pin_rows[ROW_NUM] = {10, 9, 8, 7}; // 키패드의 행 핀에 연결된 아두이노 나노 핀 const byte pin_column[COLUMN_NUM] = {6, 5, 4}; // 키패드의 열 핀에 연결된 아두이노 나노 핀 char key_layout[ROW_NUM][COLUMN_NUM] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, {'*', '0', '#'} }; Keypad keypad = Keypad(makeKeymap(key_layout), pin_rows, pin_column, ROW_NUM, COLUMN_NUM); LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C 주소 0x27 (DIYables LCD에서), 16 칼럼 및 2 줄 const String password_1 = "1234"; // 여기에서 비밀번호를 변경하세요 const String password_2 = "5642"; // 여기에서 비밀번호를 변경하세요 const String password_3 = "12345"; // 여기에서 비밀번호를 변경하세요 String input_password; void setup() { Serial.begin(9600); input_password.reserve(32); // 최대 입력 문자는 33입니다. 필요에 따라 변경하세요 pinMode(RELAY_PIN, OUTPUT); // 핀을 출력으로 초기화합니다. digitalWrite(RELAY_PIN, HIGH); // 문을 잠급니다 lcd.init(); // LCD I2C 디스플레이 초기화 lcd.backlight(); } void loop() { char key = keypad.getKey(); if (key) { Serial.println(key); if (key == '*') { input_password = ""; // 입력된 비밀번호를 리셋합니다 lcd.clear(); } else if (key == '#') { lcd.clear(); if (input_password == password_1 || input_password == password_2 || input_password == password_3) { Serial.println("password is correct"); lcd.setCursor(0, 0); lcd.print("CORRECT!"); lcd.setCursor(0, 1); lcd.print("DOOR UNLOCKED!"); digitalWrite(RELAY_PIN, LOW); // 문을 20초 동안 엽니다 delay(20000); digitalWrite(RELAY_PIN, HIGH); // 문을 잠급니다 } else { Serial.println("password is incorrect, try again"); lcd.setCursor(0, 0); lcd.print("INCORRECT!"); lcd.setCursor(0, 1); lcd.print("ACCESS DENIED!"); } input_password = ""; // 입력된 비밀번호를 리셋합니다 } else { if (input_password.length() == 0) { lcd.clear(); } input_password += key; // 비밀번호 문자열에 새 문자를 추가합니다 lcd.setCursor(input_password.length(), 0); // 커서를 새 위치로 이동합니다 lcd.print('*'); // 숨겨진 문자로 * 키를 인쇄합니다 } } }

※ NOTE THAT:

LCD의 주소는 제조업체에 따라 다를 수 있습니다. 우리는 DIYables에서 명시한 대로 코드에서 0x27을 사용하였습니다.

키패드를 누를 때 비프 소리 추가하기.

키패드의 키를 누를 때마다 짧은 비프음을 생성하기 위해 압전 부저를 추가함으로써 도어 락이 반응하는 것처럼 보이게 할 수 있습니다.

추가하는 것은 매우 간단합니다. 그래서, 이 부분은 여러분의 창의력에 맡기겠습니다. 더 많은 안내가 필요하다면 아두이노 나노 - 키패드 비프 튜토리얼을 확인해 보세요.

키패드 도어락에 도어 센서 추가하기

앞서 언급한 코드에서, Arduino Nano는 잠금을 해제한 후 일정 시간이 지나면 문을 잠근다. 하지만 실제 응용에서는 보통 문 센서가 시스템에 추가된다. Arduino Nano가 문이 닫혔다고 감지하면, 타임아웃을 기다리는 대신 바로 문을 잠근다.

당신을 압도하지 않기 위해, 우리는 배선도와 코드에 문 센서를 포함시키지 않았습니다. 대신, 이 부분은 여러분의 창의력에 맡깁니다. 더 많은 지침을 위해 Arduino Nano - Door SensorArduino Nano - Door Sensor control Relay 튜토리얼을 확인해보세요.

EEPROM에 유효한 비밀번호 관리 및 저장하기

위의 코드는 아두이노 나노 코드에 하드코딩된 유효한 비밀번호(UID)를 가지고 있습니다. 이는 비밀번호를 추가하거나 제거하고 싶다면 코드를 변경한 후 다시 아두이노 나노에 업로드해야 한다는 것을 의미합니다. 이는 불편합니다.

실제 응용 프로그램에서는 코드를 매번 수정하고 업로드하지 않고도 비밀번호를 관리할 필요가 있습니다. 이를 달성하기 위해, 비밀번호를 하드코딩하는 대신 EEPROM에 저장할 수 있습니다. 그 결과, EEPROM에서 비밀번호를 쉽게 관리할 수 있는 방법이 필요합니다.

EEPROM에서 비밀번호를 관리하는 두 가지 방법이 있습니다:

마스터 비밀번호 사용

  • 비밀번호를 ADD 마스터 비밀번호로 사용함으로써, 새로운 비밀번호를 시스템에 추가할 수 있습니다. Arduino Nano가 ADD 마스터 비밀번호를 감지하면, ADD 모드와 OPERATION 모드 사이를 전환합니다.
  • ADD 모드에서 Arduino Nano는 감지한 새로운 비밀번호를 EEPROM에 추가합니다.
  • DELETE 마스터 비밀번호와 DELETE 모드에 대해서도 유사한 접근법이 사용됩니다.
  • 시리얼/블루투스/IR을 통한 ADD/DELETE 명령 사용
  • 명령어는 시리얼 모니터, 블루투스 앱 또는 IR 컨트롤러와 같은 도구를 사용하여 시리얼/블루투스/IR을 통해 전송됩니다.
  • 명령어는 지시문(ADD/DELETE)과 비밀번호로 구성됩니다.

위의 두 가지 방법 중 하나를 사용하려면 상당한 양의 아두이노 나노 코드를 추가해야 합니다. 프로그래밍이 처음인 사람들에게 이것은 어려운 작업이 될 수 있습니다. 따라서 이 튜토리얼은 복잡한 코드로 초보자를 압도하지 않고 도어락 시스템에 대한 기본적인 이해를 제공하려고 합니다. 이 시스템을 실제로 구현하고 싶으시다면, 저희 유료 프로그래밍 서비스를 통해 문의해 주십시오.

SD 카드에 접근 이력 저장하기

접근 이력을 추적하기 위해, 접근 상태(GRANTED/DENIED)와 날짜 및 시간을 저장하는 것이 필요할 수 있습니다. EEPROM은 전체 이력을 저장하기에 용량이 부족하기 때문에, 대신 SD 카드를 사용할 수 있습니다. 이에 대한 안내는 Arduino Nano - SD 카드에 타임스탬프와 함께 데이터 로그하기 튜토리얼에서 찾을 수 있습니다.

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!