-
아두이노 프로젝트 | 디지털 도어락Technology/Arduino 2024. 6. 28. 18:00
1. 디지털 도어락
일상에서 쉽게 발견할 수 있는 디지털 도어락을 아두이노 플랫폼으로 구현해보자. 구현하고자 하는 디지털 도어락은 키패드와 수동 피에조 부저, LCD I2C 모듈로 구성되어 있다. 키패드 버튼을 누를 때마다 피에조 부저에서 소리가 나며, 키패드에서 누른 숫자나 기호는 LCD I2C 모듈에서 확인할 수 있다. 키패드에서 연속으로 누른 아홉 자리 버튼이 프로그램에 내장된 암호와 동일하지 않다면, 오답 알림음과 함께 LCD I2C 모듈에 'Incorrect' 문자열이 출력되고 초기 상태로 돌아간다. 만약 프로그램에 내장된 암호와 동일하다면, 정답 알림음과 함께 LCD I2C 모듈에 'Correct' 문자열이 출력되고 초기 상태로 돌아가도록 프로그램을 작성해보자.
2. 프로젝트
2.1. 회로 구성
2.2. 프로그램 작성
#include <LiquidCrystal_I2C.h> // LCD I2C 라이브러리 추가 #include <Keypad.h> // 키패드 라이브러리 추가 // LCD라는 이름의 LCD I2C 객체 생성 LiquidCrystal_I2C LCD(0x20, 16, 2); // I2C 주소, 열과 행의 개수 입력 const byte Rows = 4; // 바이트 변수 선언 후 키패드 행의 개수로 초기화 const byte Cols = 4; // 바이트 변수 선언 후 키패드 열의 개수로 초기화 // 문자형 2차원 배열 선언 후 키패드 값으로 초기화 char KeyValues[Rows][Cols] = { '1','2','3','A', '4','5','6','B', '7','8','9','C', '*','0','#','D' }; // 바이트 배열 선언 후 키패드 행 단자와 연결된 디지털 입출력 핀으로 초기화 byte RowPins[Rows] = {12, 11, 10, 9}; // 바이트 배열 선언 후 키패드 열 단자와 연결된 디지털 입출력 핀으로 초기화 byte ColPins[Cols] = {8, 7, 6, 5}; // UserKeypad라는 이름의 키패드 객체를 생성 Keypad UserKeypad = Keypad(makeKeymap(KeyValues), RowPins, ColPins, Rows, Cols); String Password = "20231106*"; // 문자열 변수 선언 후 암호로 초기화 String Entered = ""; char CustomKey; int Count = 0; int Buzzer = 2; // 정수형 변수 선언 후 디지털 핀 번호 2로 초기화 void setup() { LCD.init(); // LCD 사용 시작 LCD.backlight(); // LCD 백라이트 켜기 pinMode(Buzzer, OUTPUT); // 디지털 2번 핀을 출력(OUTPUT) 모드로 설정 } void loop() { LCD.setCursor(0, 0); // LCD 커서를 0열 0행으로 이동 LCD.print("Enter Password:"); // LCD에 문자열 출력 CustomKey = UserKeypad.getKey(); // 키패드에서 눌린 스위치에 해당하는 키패드 값 저장 if (CustomKey != NO_KEY) // 변수에 저장된 값이 NO_KEY가 아닐 경우 실행 { tone(Buzzer, 392); // 디지털 2번 핀에 주파수 392 Hz인 디지털 신호 출력 Entered += CustomKey; // 키패드 값을 문자열 변수에 누적하여 저장 LCD.setCursor(Count, 1); // LCD 커서를 Count열 0행으로 이동 LCD.print(CustomKey); Count += 1; // 변수에 저장된 값을 1 더한 후 저장 noTone(Buzzer); // 디지털 2번 핀에 디지털 신호 미출력 } if (Count == 9) // 변수에 저장된 값이 9일 경우 실행 { delay(500); // 500 ms 대기 LCD.clear(); // LCD에 출력된 문자열을 모두 삭제 LCD.setCursor(0, 0); if (Entered == Password) // 변수에 저장된 문자열이 암호와 동일할 경우 실행 { Correct_Sound(Buzzer); // Correct_Sound 함수 실행 LCD.print("Correct"); } else { Wrong_Sound(Buzzer); // Wrong_Sound 함수 실행 LCD.print("Incorrect"); } delay(1000); LCD.clear(); Count = 0; } } // 정답 알림음 void Correct_Sound(int Buzzer) { int Note[5] = {262, 294, 330, 349, 1397}; // 정수형 배열 선언 후 음계 정보를 저장 delay(100); noTone(Buzzer); delay(500); for (int i = 0; i < 6; i++) { tone(Buzzer, Note[i]); delay(100); } noTone(Buzzer); delay(500); } // 오답 알림음 void Wrong_Sound(int Buzzer) { noTone(Buzzer); delay(500); tone(Buzzer, 349); delay(100); noTone(Buzzer); delay(100); tone(Buzzer, 349); delay(1000); noTone(Buzzer); delay(500); }
[함께 읽으면 좋은 페이지]
참고문헌
- DroneBot Workshop. (2020). Using Keypads with Arduino - Build and Electronic Lock. YouTube. https://www.youtube.com/watch?v=vl1-R6NsejM. 2023.11.06.
반응형'Technology > Arduino' 카테고리의 다른 글
아두이노 | 온도센서 LM35 (0) 2024.07.12 아두이노 | 온도센서 TMP36 (1) 2024.07.05 아두이노 라이브러리 | 키패드 (0) 2024.06.21 아두이노 I2C 통신 | LCD I2C 모듈 (1) 2024.06.14 아두이노 라이브러리 | LCD 모듈 (0) 2024.04.12