BASIC4MCU | 질문게시판 | 아두이노 NFC카드 질문
페이지 정보
작성자 master 작성일2018-09-23 18:19 조회8,349회 댓글0건본문
아두이노 프로그램이 두가지가있습니다.
1번째
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Servo.h>Servo locker;
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line displaychar secretCode[4] = {'1', '2', '5', '4'};
char door;
char input[4];
char key;
char light;
int wrong = 0;
int i = 0;
int j = 0;
int a=0;
const byte rows = 4;
const byte cols = 4;
boolean c=false;char keys[rows][cols] =
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};byte rowPins[rows] = {8, 7, 6, 5};
byte colPins[cols] = {4, 3, 2, 1};Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2);
locker.attach(A3);
locker.write(90);
lcd.init(); // initialize the lcd
}
void loop()
{
while(a==0)
{
light=keypad.waitForKey();
if(light == '*')
{
// Print a message to the LCD.
lcd.backlight();
}
input_key(); // Password Input Mode
password(); // Confirm Password
password_check(); // Display current state
}
while(a==1)
{
lcd.print("if you wanna clo");
lcd.setCursor(0,1);
lcd.print("se,press '*'key");
door = keypad.waitForKey();
if(door == '*')
{ locker.write(90);
lcd.clear();
lcd.noBacklight();
a=0;
}
}
}void input_key()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Password");
for (i = 0; i < 4; i++)
{
key = keypad.waitForKey();
input[i] = key;
lcd.setCursor(i + 6, 1);
lcd.print("*");
}
}void password()
{
wrong = 0;
for (j = 0; j < 4; j++)
{
if (secretCode[j] == input[j])
{
}
else if (secretCode[j] != input[j])
{
wrong += 1;
}
}
}void password_check()
{
if (wrong == 0)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" PASS");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
locker.write(180); // OPENING
a=1;
}
else if (wrong != 0)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" wrong");
delay(2000);
a=0;
lcd.clear();
wrong = 0;
}
}두번째로
#include <Servo.h> // 서보 라이브러리
#include <SPI.h> // RFID를 위한 SPI 라이브러
#include <MFRC522.h>// RFID 라이브러#define SERVO_PIN 6 //서보 PIN
Servo myservo; //서보 라이브러리#define SS_PIN 10 //RFID SS(SDA:ChipSelect) PIN
#define RST_PIN 9 //RFID Reset PIN
MFRC522 rfid(SS_PIN, RST_PIN); //RFID 라이브러리
/* 등록된 RF CARD ID */
#define PICC_0 0xE9
#define PICC_1 0x5D
#define PICC_2 0x3D
#define PICC_3 0x2B
void setup() {
//시리얼 모니터 시작
Serial.begin(9600);
SPI.begin(); // SPI 시작
rfid.PCD_Init(); // RF 모듈 시작myservo.attach(SERVO_PIN); //서보 시작
myservo.write(0); //초기 서보 모터를 0도로 위치 시킴
}
void loop() {
//카드가 인식 안되었다면 더이상 진행하지 말고 빠져나감
if ( ! rfid.PICC_IsNewCardPresent())
return;//RF카드의 ID가 인식 안되었다면 더이상 진행하지 말고 빠져나감
if ( ! rfid.PICC_ReadCardSerial())
return;
Serial.print(F("PICC type: "));
//PICC 타입 읽어오기
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
Serial.println(rfid.PICC_GetTypeName(piccType));
//MIFARE 방식이 아니라면 더이상 진행하지 말고 빠져나감
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println(F("Your tag is not of type MIFARE Classic."));
return;
}
//ID가 등록된 ID와 동일하다면
if (rfid.uid.uidByte[0] != PICC_0 ||
rfid.uid.uidByte[1] != PICC_1 ||
rfid.uid.uidByte[2] != PICC_2 ||
rfid.uid.uidByte[3] != PICC_3 ) {//등록된 카드가 아니라면 시리얼 모니터로 ID 표시
Serial.println(F("This is an unconfirmed Card."));
Serial.print(F("In hex: "));
printHex(rfid.uid.uidByte, rfid.uid.size);
}else{
Serial.println(F("This is a confirmed Card."));
Serial.println(F("Motor On!!"));//서보 90도로 이동
myservo.write(90);
//1초 대기
delay(1000);
//서보 0도로 되돌림
myservo.write(0);
}
//종료
rfid.PICC_HaltA();
rfid.PCD_StopCrypto1();//다시 시작!
}//16진수 표시
void printHex(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}위에 이 2가지의 프로그램을 합쳐서 NFC카드를 대도 문이열리고 비밀번호를 쳐서도 문을열리게 해야합니다. 각각의 동작은 되지만 합치는것을 OR IF문을 써서 하라는데 잘모르겠습니다.
//
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-09-14 오후 8:45:23// by Ok-Hyun Park//#include <Wire.h>#include <LiquidCrystal_I2C.h>#include <Keypad.h>#include <Servo.h>#include <SPI.h>#include <MFRC522.h>Servo locker;LiquidCrystal_I2C lcd(0x27,16,2);char secretCode[4]={'1','2','5','4'};char input[4];char key,door,light;int wrong=0,i=0,j=0,a=0;const byte rows=4,cols=4;boolean c=false;char keys[rows][cols]={{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'},{'*','0','#','D'}};byte rowPins[rows]={8,7,6,5};byte colPins[cols]={4,3,2,1};Keypad keypad=Keypad(makeKeymap(keys),rowPins,colPins,rows,cols);//#define SS_PIN 10 //RFID SS(SDA: ChipSelect)PIN#define RST_PIN 9 //RFID Reset PINMFRC522 rfid(SS_PIN,RST_PIN); //RFID 라이브러리/*등록된 RF CARD ID*/#define PICC_0 0xE9#define PICC_1 0x5D#define PICC_2 0x3D#define PICC_3 0x2B//void setup(){locker.attach(A3); locker.write(0);lcd.begin(16,2); lcd.init();Serial.begin(9600);SPI.begin();rfid.PCD_Init();}//void loop(){while(a==0){light=keypad.waitForKey();if(light=='*'){ lcd.backlight(); }input_key();password();password_check();}while(a==1){lcd.print("if you wanna clo");lcd.setCursor(0,1); lcd.print("se,press '*'key");door=keypad.waitForKey();if(door=='*'){ locker.write(90); lcd.clear(); lcd.noBacklight(); a=0; }}//if(!rfid.PICC_IsNewCardPresent())return; //카드가 인식 안되었다면if(!rfid.PICC_ReadCardSerial())return;//Serial.print(F("PICC type: ")); //PICC 타입 읽어오기MFRC522::PICC_Type piccType=rfid.PICC_GetType(rfid.uid.sak);Serial.println(rfid.PICC_GetTypeName(piccType));//MIFARE 방식이 아니라면 더이상 진행하지 말고 빠져나감if(piccType!=MFRC522::PICC_TYPE_MIFARE_MINI&&piccType!=MFRC522::PICC_TYPE_MIFARE_1K&&piccType!=MFRC522::PICC_TYPE_MIFARE_4K){Serial.println(F("Your tag is not of type MIFARE Classic."));return;}//if(rfid.uid.uidByte[0]!=PICC_0||rfid.uid.uidByte[1]!=PICC_1||rfid.uid.uidByte[2]!=PICC_2||rfid.uid.uidByte[3]!=PICC_3){ // 등록된 ID 아니면Serial.println(F("This is an unconfirmed Card.")); Serial.print(F("In hex: "));printHex(rfid.uid.uidByte,rfid.uid.size);}else{ // 등록된 IDSerial.println(F("This is a confirmed Card.")); Serial.println(F("Motor On!!"));locker.write(90); delay(1000); locker.write(0);}rfid.PICC_HaltA(); rfid.PCD_StopCrypto1();}//16진수 표시void printHex(byte*buffer,byte bufferSize){for(byte i=0; i<bufferSize; i++){Serial.print(buffer[i]<0x10?" 0": " ");Serial.print(buffer[i],HEX);}}//void input_key(){lcd.clear(); lcd.setCursor(0,0); lcd.print(" Password");for(i=0;i<4;i++){key=keypad.waitForKey();input[i]=key;lcd.setCursor(i+6,1); lcd.print("*");}}//void password(){wrong=0;for(j=0;j<4;j++){if(secretCode[j]==input[j]){}else if(secretCode[j]!=input[j]){ wrong+=1; }}}//void password_check(){if(wrong==0){lcd.clear(); lcd.setCursor(0,0); lcd.print(" PASS"); delay(2000);lcd.clear(); lcd.setCursor(0,0); locker.write(180); // OPENINGa=1;}else if(wrong!=0){lcd.clear(); lcd.setCursor(0,0); lcd.print(" wrong"); delay(2000); lcd.clear();a=0; wrong=0;}}
합치는 것은 어렵지 않지만 매끄럽게 돌아가도록 디버깅은 직접 하셔야합니다.
댓글 0
조회수 8,349등록된 댓글이 없습니다.