#include <SoftwareSerial.h>
// kde bude připojeno relé k otevření dveří
#define ElRele 9 // na pin 9
// vytvoříme nový seriový port s názvem RFID
SoftwareSerial RFID(2, 3); // RX and TX
// zde se bude ukládat data z přiloženého čipu
String idTest = "";
// zde budou uloženy povolené čipy
// můžete libovolně rozšířit
String idOK[5] = {"00006588BF",
"0000XXXXXX",
"0000000002",
"0000000003",
"0000664966"};
// do tohoto pole si budeme ukládat přijatá data
int data[14];
// budeme ukládat čas poslední kontroly čipu
long lastTagReading = 0;
void setup()
{
// nastaví pin 9 ElRele jako výstup
pinMode(ElRele, OUTPUT);
// nastaví ElRele na HIGH, protože spíná v LOW
digitalWrite(ElRele, HIGH);
// Nastartujeme seriový port RDIF s rychlostí 9600
RFID.begin(9600);
}
void loop()
{
delay(200);
// když sou nějaká data z RDIF prijata
if (RFID.available() > 0)
{
// pro každých 14 částí dat
for (int i = 0; i<14;i++)
{
// přečti data a ulož do pole data
data[i] = RFID.read();
}
// vybereme si z pole pouze 2 - 11 část
// dat, kde je uloženo číslo tagu
for (int i = 1; i<11; i++)
{
// protože jsou data odesílána v ASCI
// převedeme je na čísla
char d = data[i];
// a každý znak připojíme do proměnné idTest
idTest = idTest + d;
}
// pomocí funkce Kontrola() - deklarovaná dole
// porovnáme zda je čip mezi povolenými
// ale jen v případě, že poslední snímání bylo
// maximálně před 4 sekundami
if (((lastTagReading + 4000) < millis()))
{
// ulož čas posledního snímání čipu
lastTagReading = millis();
if (Kontrola() ==1)
// když ano vykonej funkci DobreID()
DobreID();
// když ne tak funkci SpatneID
else SpatneID();
}
}
// a nakonec vymaž id testovaného čipu
idTest = "";
}
//////////////////////////////////////////////
// funkce porovnává testovaný čip s uloženými
// když ho najde vrátí číslo 1, když ne tak 0
int Kontrola() {
int i;
for (i = 0; i < sizeof(idOK); ++i) {
if (idOK[i] == idTest)
{
return 1;
}
}
return 0;
}
void DobreID()
{
// sepne relé pro elektrozámek
digitalWrite(ElRele, LOW);
// zahraje tón
tone(8, 2200, 600);
// počká 2,5 sekundy a vypne relé
delay(2500);
digitalWrite(ElRele, HIGH);
}
void SpatneID()
{
// zahraje 3 tóny pro nepovolení přístupu
tone(8, 1200, 150);
delay(300);
tone(8, 1200, 150);
delay(300);
tone(8, 1200, 150);
}