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?
А накидайте мне вариантов, плз - для чего всё это, кроме баловства?
Использовать в качестве концевика?
Использовать в качестве концевика?
Интересное применение :)