반응형
#include <Keypad.h>
const byte rows = 4;
const byte cols = 3;
int wrong =0; // 비밀번호 관련 변수
int turnin = 0;
int speakerPin = 3; //부저 관련 변수들
int numTones = 8;
int tones[] = {261, 277, 294, 311, 330, 349, 370, 392};
byte rowPins[rows] = { 8, 7, 6, 5 }; //키패드 관련
byte colPins[cols] = { 9, 10, 11 };
char password[4] = {'0','0','0','0'};
char changepass[4];
int inputPin = 2; // pir 센서 신호핀
char keys[rows][cols] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
int ledInput = 13;
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);
// 키패드 설정
void setup() {
Serial.begin(9600);
pinMode(ledInput, OUTPUT);
setLocked(1);
}
int setLocked(int locked){ // 잠금상태와 해제상태를 설정하고 그에 맞는 LED를 세팅해 주는 함수
if(locked) {
digitalWrite(ledInput,HIGH);
return 1;
}
else digitalWrite(ledInput,LOW);
return 0;
}
void blink(int a){ // LED가 틀린횟수에 맞게 깜빡이는 함수
for(int i=0; i<a; i++){
digitalWrite(ledInput,HIGH);
delay(500);
digitalWrite(ledInput,LOW);
delay(500);
}
}
void loop() {
char key = keypad.getKey();
int val = digitalRead(inputPin);
int a = setLocked(1);
if(key){
Serial.println(key);
}
if(val && a){
blink(wrong);
for(int i = 0; i < numTones; i++){
tone(speakerPin, tones[i]);
delay(500);
}
noTone(speakerPin);
delay(1000);
}
if ((key>='0' && key <='9')|| (key == '*' )){ //키값이 눌렀는지 확인문
if(key == "*"){
tone(speakerPin, tones[0]);
noTone(speakerPin);
turnin =0;
wrong = 0;
setLocked(1);
}
else if(key == password[turnin]){
tone(speakerPin, tones[0]);
noTone(speakerPin);
turnin++;
wrong =0;
}
else if(key != password[turnin]){ // 비밀번호가 틀렸을시 몇번 틀렸는지 확인 후 틀린 횟수 LED 로 알려주기
tone(speakerPin, tones[0]);
noTone(speakerPin);
turnin = 0;
setLocked(1);
wrong++;
blink(wrong);
}
}
if(turnin ==4){ // 비밀번호를 맞췄을시 잠금장치를 푸는 조건문
setLocked(0);
digitalWrite(ledInput,LOW);
if(key == '#'){ // 비밀번호 변경
tone(speakerPin, tones[0]);
noTone(speakerPin);
keypad.setHoldTime(2000); // 키패드 2초동안 기다림
for(int i=0; i<4; i++){
changepass[i]=key;
password[i] = changepass[i];
}
}}
if(wrong == 4){ // 4번 틀리면 LED 깜빡인 후 8번 부저 울리기
for(int i = 0; i < numTones; i++){
tone(speakerPin, tones[i]);
blink(wrong);
delay(500);
}
noTone(speakerPin);
delay(1000);
wrong = 0;
}
}
이번에 소수전공 수업으로 아두이노를 배우면서 결과 프로젝트로 노드로 웹 서버를 만들고 통신하는 장치를 만들어보고 싶었지만 시간의 문제도 있고 실력의 문제도 있어서 방향을 바꾸어 자물쇠를 만들어 보았습니다. 위의 코드는 이번 프로젝트 결과물인데 몇몇 부분만 따로 뜯어내서 보고 나머지는 주석을 봐주세요.
byte rowPins[rows] = { 8, 7, 6, 5 }; //키패드 관련
byte colPins[cols] = { 9, 10, 11 };
이 부분은 제가 처음에 상당히 헷갈렸던 부분인데 그냥 키패드를 받아오는 핀 번호입니다.
char key = keypad.getKey();
int val = digitalRead(inputPin);
int a = setLocked(1);
if(key){
Serial.println(key);
}
if(val && a){
blink(wrong);
for(int i = 0; i < numTones; i++){
tone(speakerPin, tones[i]);
delay(500);
}
noTone(speakerPin);
delay(1000);
}
if ((key>='0' && key <='9')|| (key == '*' )){ //키값이 눌렀는지 확인문
if(key == "*"){
tone(speakerPin, tones[0]);
noTone(speakerPin);
turnin =0;
wrong = 0;
setLocked(1);
}
else if(key == password[turnin]){
tone(speakerPin, tones[0]);
noTone(speakerPin);
turnin++;
wrong =0;
}
else if(key != password[turnin]){ // 비밀번호가 틀렸을시 몇번 틀렸는지 확인 후 틀린 횟수 LED 로 알려주기
tone(speakerPin, tones[0]);
noTone(speakerPin);
turnin = 0;
setLocked(1);
wrong++;
blink(wrong);
}
메인 부분의 코드입니다. 키패드 헤더에 있는 getkey() 를 이용하면 키패드에 입력이 들어올때 1을 반환 없을때 0을 반환합니다. 따라서 키를 눌렀을때 반응하게끔 짰으며 turnin, wrong 을 이용하여 맞으면 turnin 의 값을 증가시켜 다음 순의 번호를 맞추게 하고 틀리면 wrong 의 수를 증가 후 turnin 을 초기화 시켜 틀린 횟수를 기록하고 다시 처음부터 비밀번호를 입력하게 만들었습니다.
if(val && a){
blink(wrong);
for(int i = 0; i < numTones; i++){
tone(speakerPin, tones[i]);
delay(500);
}
noTone(speakerPin);
delay(1000);
}
이 부분이 프로젝트의 특이한 점인데 바로 pir 센서를 이용한 부분입니다. 이 센서를 이용해 보안 장치가 풀리지 않은 상태에서 소위 말해서 들고 튀기? 를 방지하기 위해 특정 거리를 이동하면 pir 센서가 감지해 장치가 울리게 만들고 싶었습니다.
제작할때 참고한 사이트입니다.
하지만 실패했죠. pir 센서가 연결되고 실행이 되자마자 주변 사물을 감지해 계속해서 부저가 울리게 구현이 돼버렸습니다. 다음엔 더 노력해서 바꿔봐야겠습니다.
반응형
'C,C++' 카테고리의 다른 글
구조체 선언과 이용, 초기화 (0) | 2021.11.11 |
---|---|
2167번 2차원 배열의 합 (0) | 2021.07.21 |
11047번 동전0 (0) | 2021.06.19 |
10773번 제로 C (0) | 2021.06.15 |
풀어보려 시도 해본 문제들 (백준 : 1009번, 14647번, 2136번) (0) | 2021.06.09 |