안녕하세요~ 기본적인 RFID 모듈을 이용한 도어락 입니다.
준비물 : 아두이노우노,RFID모듈,버저,스위치,서브모터,LCD
스케치 구성
1. LiquidCrystal_I2C를 이용 lcd에 내용 출력
2.#include <SPI.h> SPI (Serial Peripheral Interface)는 짧은 거리에서 하나 이상의 주변 장치와 신속하게 통신하기 위해 마이크로 컨트롤러가 사용하는 동기 직렬 데이터 프로토콜입니다. 또한 두 개의 마이크로 컨트롤러 간의 통신에도 사용할 수 있습니다.
#include <MFRC522.h>
3.라이브러리에서 RFID를 연결해서 쓰기위해 SPI 및 지정된 경로에 따라 다운로드 후 추가한다.
4. #include <Servo.h>. 서브 모터를 연결해서 쓰기위해 라이브러리를 추가한다.
5.switchPin을 추가하여 사용한다.
6buzzer핀을 추가하여 도어락이 작동할떄 소리가 나도록한다.
--코드--
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
//SS 핀을 10번 핀으로 설정한다.
#define SS_Pin 10 //Arduino Uno
//Reset 핀을 9번 핀으로 설정한다.
#define RST_Pin 9
#define buzzerPin 5
#define servoMoterPin 3
#define switchPin 2
#define OPEN 1
#define CLOSE 0
#define doorCloseAngle 0;
#define doorOpenAngle 90;
//mfrc522란 이름의 RFID 판독기를 설정한다.
MFRC522 mfrc522(SS_Pin,RST_Pin);
Servo doorMotor;
LiquidCrystal_I2C lcd(0x27,16,2);
int doorOpenTimer=0;
byte rfidDoorBuff[8]={0,0,0,0,0,0,0,0};
byte rfidDoor[8]={0,0,0,0,0,0,0,0};
boolean doorState = OPEN;
boolean rfidIsOK=0;
void setup(){
//시리얼 통신을 설정한다.
Serial.begin(9600);
lcd.init();
lcd.begin(16,2) ;
lcd.backlight();
//SPI통신을 시작한다.
SPI.begin();
//앞서 설정한 mrfc522란 이름의 RFID 판독기를 시작한다.
mfrc522.PCD_Init(); //Init MFRC522 card
doorMotor.attach(servoMoterPin,600,2400);
pinMode(switchPin,INPUT_PULLUP);
pinMode(buzzerPin,OUTPUT);
Serial.println("*********************************");
Serial.println("RFID DOOR LOCK");
Serial.println("*********************************");
lcd.setCursor(0,0);
lcd.print("RFID DOOR LOCK");
delay(1000);
doorClose();
lcd.clear();
}
void loop(){
//새로운 카드를 기다린다.
if(mfrc522.PICC_IsNewCardPresent()){
rfidCardRead();
};
//카드를 읽는다.
if(doorState == OPEN){
delay(100);
++doorOpenTimer;
if(doorOpenTimer >= 50) doorClose();
}
else doorOpenTimer = 0;
}
void rfidCardRead(){
if(!mfrc522.PICC_ReadCardSerial())return;
for(byte i = 0;i<mfrc522.uid.size;i++){
rfidDoorBuff[i]=mfrc522.uid.uidByte[i];
}
for(byte i=mfrc522.uid.size; i<8;i++){
rfidDoorBuff[i]=0;
}
Serial.println();
Serial.print("CARD UID :");
lcd.setCursor(0,0);
lcd.print("CARD UID:");
for(byte i =0; i<8; i++){
Serial.print(rfidDoorBuff[i],HEX);
lcd.setCursor(9,0);
lcd.print(rfidDoorBuff[i],HEX);
}
Serial.println();
Serial.print("Door Lock UID :");
lcd.setCursor(0,0);
lcd.print("Door Lock UID:");
for(byte i =0; i<8; i++){
Serial.print(rfidDoor[i],HEX);
lcd.setCursor(9,0);
lcd.print(rfidDoor[i],HEX);
}
Se
if(digitalRead(switchPin)){
Serial.println("SW OFF");
lcd.setCursor(10,1);
lcd.print("SW OFF");
for(byte i=0;i<8; i++){
if(rfidDoor[i] == rfidDoorBuff[i]){
++rfidIsOK;
};
}
if(rfidIsOK = 8){
doorOpen();
rfidIsOK=0;
}
else rfidIsOK = 0;
}
else{
Serial.println("SW ON");
lcd.setCursor(10,1);
lcd.print("SW OFF");
for(byte i =0; i<8; i++){
rfidDoor[i]=rfidDoorBuff[i];
}
rfidSaveBuzzer();
}
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
}rial.println();
void doorOpen(){
if(doorState == CLOSE){
Serial.println("Door is OPENED");
lcd.setCursor(10,1);
lcd.print("SW OFF");
doorMotor.write(90);
openBuzzer();
doorState=OPEN;
};
}
void doorClose(){
if(doorState == OPEN){
Serial.println("Door is CLOSED");
lcd.setCursor(10,1);
lcd.print("SW OFF");
doorMotor.write(0);
closeBuzzer();
doorState=CLOSE;
};
}
void openBuzzer(){
tone(buzzerPin,262,200);
delay(200);
tone(buzzerPin,294,200);
delay(200);
tone(buzzerPin,330,200);
delay(200);
noTone(buzzerPin);
}
void closeBuzzer(){
tone(buzzerPin,330,200);
delay(200);
tone(buzzerPin,294,200);
delay(200);
tone(buzzerPin,262,200);
delay(200);
noTone(buzzerPin);
}
void rfidSaveBuzzer(){
tone(buzzerPin,523,200);
delay(200);
tone(buzzerPin,523,200);
delay(200);
noTone(buzzerPin);
}
'아두이노' 카테고리의 다른 글
아두이노 프로젝트(스마트카트) (0) | 2021.08.15 |
---|---|
아두이노 초음파센서를 이용한 거리측정 (0) | 2021.08.15 |
아두이노 우노를 이용한 멀티탭 제어 (0) | 2021.08.15 |
아두이노 _ 블루투스 응용 (0) | 2021.08.15 |