RFID - це технологія взаємодії з радіо мітками, які можуть бути вбудовані в пластикові карти, брелоки і багато інших варіації. Наш звмок-пристрій зчитує так званий UID - номер карти і порівнює з тими номерами, що внесені в програму, далі в скетчі біля кожного номера присутня "прапорець-мітка", яка може приймати значення "1", або "0", що в першому випадку означає - доступ по даним номером дозволений, у другому заборонений.
Коли мітка з "дозволеним" ідентифікатором піднесена до зчитувального пристрою - на пін D4 подається логічна 1, і якщо на цей пін підключено реле або інше виконавчий пристрій, воно спрацює тільки при піднесенні "правильної" мітки. Так само при спрацьовуванні пристрою, відбувається подача коротких імпульсів на пін D5 і це зроблено для підключення до нього активного зумера, що сигналізує про спрацьовування пристрою. Піни D4 для виконавчого пристрою і D5 для зумера можна змінити на інші на початку скетчу, модуль RFID-RC522 підключений через SPI інтерфейс. Для внесення в число дозволених новий тег потрібно дізнатися її UID, просто простеживши за монітором порту, в момент піднесення цієї карти до зчитувача, gпотім внести отриманий UID в масив, в якому за замовчуванням є мітки з нульовими UID.
Компоненти для RFID замка в Інтернет магазині http://arduinka.biz.ua/modul-rfId-rc522 ... 22c74.html
Код програми:
#include <SPI.h>
#include <MFRC522.h>
#define NEW_UID {0xDE, 0xAD, 0xBE, 0xEF}
#define SS_PIN 10
#define RST_PIN 9
#define DD 4 // Pin D4 --> вихід на реле
#define ZZ 5 // Pin D4 --> вихід на активний зумер
#define REL DD // REL - відкриває двері
MFRC522 mfrc522(SS_PIN, RST_PIN); // MFRC522
MFRC522::MIFARE_Key key;
// готуємо масив карт з мітками доступу 0-нема доступу, 1-є доступ (спец пропуски)
struct Cards {
String id;
int flag;
};
struct Cards cards[8] ={{"0000000000",1},{"0000000000",1},{"0000000000",1},{"0000000000",1},{"0000000000",0},{"0000000000",0},{"0000000000",0},{"0000000000",0}};
boolean work=false;
unsigned int CUR_TIME;
unsigned int ALL_TIME;
void setup(void)
{
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
pinMode(4,OUTPUT);
digitalWrite(4,HIGH);
pinMode(5,OUTPUT);
digitalWrite(5,LOW);
Serial.begin(115200);
Serial.print("setup begin\r\n");
}
void loop(void)
{
ALL_TIME=(millis()/1000);
if ((ALL_TIME - CUR_TIME)>=5){
work=true;
work=false;
CUR_TIME=ALL_TIME;
}
if (work==false){
work=true;
//------------------------ зчитування карт ----------------------------
// Look for new cards, and select one if present
if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) {
delay(50);
work=false;
return;
}
String UID = dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
// mfrc522.PICC_HaltA();
Serial.print(F("Card UID: "));
Serial.print(UID);
Serial.println();
//----------------------------------відкриття дверей за перепустками--------------------------------
if (UID!=""){
for (int i = 0; i <= 7; i++) {
if (cards.id==UID && cards.flag==1) {
DoorOpen(UID);
work=false;
return;
}
}
}
}
work=false;
} //це кінець циклу - LOOPа
//------------------------ детектування UID з карти як числове значення ----------------------------
String dump_byte_array(byte *buffer, byte bufferSize) {
// String s;
unsigned long uiddec = 0;
// unsigned long temp;
char uid[8];
for (byte m = (bufferSize > 4 ? (bufferSize - 4) : 0); m < bufferSize; m++) { //беремо тільки останні 4 байти та переводимо в десяткову систему
unsigned long p = 1;
for(int k = 0; k < bufferSize-m-1; k++) {
p = p*256;
}
uiddec += p*buffer[m];
// s = s + (buffer[m] < 0x10 ? "0" : "");
// s = s + String(buffer[m], HEX);
}
// s.toCharArray(uid, 8);
return String(uiddec);
}
//----------- відкриття дверей
void DoorOpen(String uid){
Serial.print(F("DOOR-OPEN!"));
Serial.println();
digitalWrite( REL, LOW );
for (int i = 0; i <= 6; i++) {
digitalWrite( ZZ, HIGH ); delay(250);digitalWrite( ZZ, LOW );delay(250);
digitalWrite( ZZ, HIGH ); delay(250);digitalWrite( ZZ, LOW );delay(250);
}
digitalWrite( REL, HIGH );
}