RFID rdm6300
- Войдите на сайт для отправки комментариев
Пнд, 27/06/2016 - 01:00
Балуюсь тут с сабжем - забавная штукенция, секса никакого, всё по двум проводкам, работает с SoftwareSerial, ляпота, да и только. Набросал быстренько скетчик, который лочит/разлочит "систему" при поднесении известных ключей:
#include <SoftwareSerial.h>
// на каких пинах подключен RFID-считыватель
SoftwareSerial sSerial(8,9);
// тестовый пин, на котором будем включать светодиод, говорящий о том, что система закрыта/открыта
const int ledPin = 13;
// флаг, что юзер залогинен
bool isUserLoggedIn = false;
// длина ключа RFID-метки
const byte RFID_TAG_LENGTH = 14;
// сюда будем читать ключ
byte enteredKey[RFID_TAG_LENGTH] = {0};
// здесь будем хранить информацию о последнем сравненном ключе, чтобы избежать повторного выполнения кода
byte lastKey[RFID_TAG_LENGTH] = {0};
// массив ключей, которые нам известны
byte knownKeys[][RFID_TAG_LENGTH]=
{
{ 0x02, 0x30, 0x39, 0x30, 0x30, 0x34, 0x46, 0x35, 0x33, 0x46, 0x33, 0x45, 0x36, 0x03 }
, { 0x02, 0x30, 0x46, 0x30, 0x30, 0x36, 0x31, 0x42, 0x46, 0x39, 0x32, 0x34, 0x33, 0x03 }
// сюда дописывать ключи
, {0,0,0,0,0,0,0,0,0,0,0,0,0,0} // заглушка, признак окончания массива ключей
};
byte writePos = 0; // позиция записи
unsigned long eraseKeyTimer = 0; // таймер присутствия ключа в считывателе
const unsigned int waitEraseInterval = 1000; // через сколько миллисекунд можно повторно приложить ключ
void setup()
{
Serial.begin(57600);
sSerial.begin(9600);
pinMode(ledPin,OUTPUT);
digitalWrite(ledPin,LOW);
Serial.println(F("System ready, locked."));
}
// сравниваем ключи на совпадение
bool sameKey(byte* k1, byte* k2)
{
return !memcmp(k1,k2,RFID_TAG_LENGTH);
}
// проверяем - известен ли нам ключ
bool isKnownKey(byte* key)
{
byte pos = 0;
while(1)
{
if(!memcmp(knownKeys[pos],key,RFID_TAG_LENGTH)) // ключ совпал
{
return true;
}
if(knownKeys[pos][0] == 0) // дошли до конца массива известных ключей
break;
pos++;
}
return false;
}
void loop()
{
if(sSerial.available())
{
// есть данные от ключа, считываем их
while(sSerial.available())
{
enteredKey[writePos++] = sSerial.read();
if(writePos >= RFID_TAG_LENGTH)
{
// прочитали весь ключ, проверяем его
writePos = 0;
if(isKnownKey(enteredKey)) // ключ известен
{
if(!sameKey(enteredKey,lastKey)) // если только его не продолжают держать у считывателя
{
// пишем, что мы узнали ключ
Serial.println(F("Key known :)))"));
// меняем статус системы
isUserLoggedIn = !isUserLoggedIn;
digitalWrite(ledPin,isUserLoggedIn ? HIGH: LOW);
Serial.println(isUserLoggedIn ? F("System unlocked.") : F("System locked."));
}
}
else // ключ неизвестен
{
// если только ключ не тот же, т.е. если его не держат на считывателе
if(!sameKey(enteredKey,lastKey))
Serial.println(F("Key unknown :("));
}
// запоминаем, какой ключ на считывателе
memcpy(lastKey,enteredKey,RFID_TAG_LENGTH);
// обновляем таймер присутствия ключа в считывателе
eraseKeyTimer = millis();
} // if(writePos >= RFID_TAG_LENGTH)
} // while
} // if
// если ключ отсутствует больше N секунд - стираем информацию о последнем введённом ключе
if(millis() - eraseKeyTimer > waitEraseInterval)
{
memset(lastKey,0,RFID_TAG_LENGTH);
}
/*
// тестовый код для считывания поднесённых ключей
if(sSerial.available())
{
while(sSerial.available())
{
char ch = sSerial.read();
Serial.print("0x");
if(ch < 16)
Serial.print('0');
Serial.print(ch, 16);
Serial.print(' ');
}
Serial.println();
}
*/
}
Но вот возник, собственно, вопрос: а какие практические применения у подобных игрушек (RFID, я имею в виду) в DIY-сегменте? Открыть/закрыть замок какой - это понятно. Ну а дальше - что? Не будешь же делать систему допусков, как на предприятии? Зачем оно в DIY?
А накидайте мне вариантов, плз - для чего всё это, кроме баловства?
Использовать в качестве концевика?
Использовать в качестве концевика?
Интересное применение :)