BASIC4MCU | 질문게시판 | 답변 : 아두이노 도어락 질문드립니다 ㅜㅜ
페이지 정보
작성자 master 작성일2022-11-16 14:48 조회2,324회 댓글0건본문
#include <Servo.h>
Servo myservo;
//
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9
#define SS_PIN 10
MFRC522 rfid(SS_PIN,RST_PIN);
//
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
//
const char keymap[4][4]={{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'*','0','#','D'}};
//
const int rpin[]={5,4,3,2};
const int cpin[]={A3,A2,A1,A0};
//
char newKey=0,oldKey=0;
char pass0='0',pass1='9',pass2='1',pass3='9';
int lockNunlock=0;
//
byte rfidPass0=0x63;
byte rfidPass1=0xDD;
byte rfidPass2=0x51;
byte rfidPass3=0x16;
//
char passInBuff[4];
int passCnt=0;
//
#define BUZZER_PIN 8
#define SERVO_PIN 7
//
void setup(){
Serial.begin(9600);
for(int i=0;i<4;i++){ pinMode(rpin[i],OUTPUT); pinMode(cpin[i],INPUT_PULLUP); }
myservo.attach(SERVO_PIN);
myservo.write(90);
pinMode(BUZZER_PIN,OUTPUT);
digitalWrite(BUZZER_PIN,LOW);
SPI.begin();
rfid.PCD_Init();
lcd.init(); lcd.backlight(); lcd.clear(); lcd.setCursor(0,0); lcd.print("PASS:");
}
//
void loop(){
newKey=getkey();
if(newKey!=oldKey){ oldKey=newKey;
if(newKey){
Serial.println(newKey);
passInBuff[passCnt++]=newKey;
lcd.print("*");
if(passCnt>=4){
lcd.clear(); lcd.print("PASS:");
passCnt=0;
if(passInBuff[0]==pass0 && passInBuff[1]==pass1 && passInBuff[2]==pass2 && passInBuff[3]==pass3){
Serial.println("ok");
lockNunlock=1;
}
}
}
delay(50);
}
//
if(rfid.PICC_IsNewCardPresent()){
if(rfid.PICC_ReadCardSerial()){
Serial.print("value=");
Serial.print(rfid.uid.uidByte[0],HEX); Serial.print(rfid.uid.uidByte[1],HEX);
Serial.print(rfid.uid.uidByte[2],HEX); Serial.println(rfid.uid.uidByte[3],HEX);
//
if(rfid.uid.uidByte[0]==rfidPass0 && rfid.uid.uidByte[1]==rfidPass1 && rfid.uid.uidByte[2]==rfidPass2 && rfid.uid.uidByte[3]==rfidPass3){
Serial.println("rfid ok");
lockNunlock=1;
}
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();
}
}
//
if(lockNunlock==1){ lockNunlock=0;
myservo.write(180);
digitalWrite(BUZZER_PIN,HIGH); delay(200); digitalWrite(BUZZER_PIN,LOW); delay(200);
digitalWrite(BUZZER_PIN,HIGH); delay(200); digitalWrite(BUZZER_PIN,LOW); delay(5000);
}
else{ myservo.write(90); }
}
//
char getkey(){
char key=0;
for(int i=0;i<4;i++){
digitalWrite(rpin[i],LOW);
for(int j=0;j<4;j++){ if(digitalRead(cpin[j])==LOW)key=keymap[i][j]; }
digitalWrite(rpin[i],HIGH);
}
return key;
}
어떤 방법으로 비밀번호를 입력 할 것인지 정해서 코드를 추가하세요
시리얼통신으로 비밀번호를 변경 할 수도 있을테고
키패드로 비밀번호를 변경 할 수도 있겠죠
'*' 키를 누른채로 전원을 키면 비밀번호 입력모드 <-- 이런식인거죠
셋업함수 마지막에서 getkey() 함수를 호출해서 '*' 키라면 비밀번호 변경시키면 되겠습니다.
코드를 잘 분석해서 완전히 이해 한다면 어렵지 않을겁니다.
이해하지 못한다면...남의 도움을 받아야 할텐데
어차피 발표 할 때는 설명해야 할테니 좀 더 노력해서 스스로 만들어보세요
말로밖에 도움을 드리지 못하고, 코드만 제 스타일로 정리 해드립니다.
댓글 0
조회수 2,324등록된 댓글이 없습니다.