Läsa RFID-taggar med en Arduino (5 / 5 steg)
Steg 5: Sista skiss
Okej, minns när vi ansluten ID-12 stift 9 till Arduno RX. Vi kommer att frigöra RX stift och flytta den anslutningen till digitala stift 4. Det är det!
Nu, ta din unika identifierare, skär bort de två sista tecknen så du är kvar med 10 tecken. Jag läste till exempel 2900940E9526 som min identifierare. Så, jag kommer att använda 2900940E95. 26 är det ID kontrollsumma. Oroa dig inte om detta. Sätt in ditt ID i koden nedan där det står [infoga IDENTIFIERARE här]. Du kan också lägga till ditt namn i den [Lägg till ditt namn här].
--------------------------------------------------------------------------------------------------------------------------------
/**
* RFID-Access Control
*
* Del av denna kod inspirerades av Tom Igoe RFID tutorial
* Från ID-12 exempelkod på Arduino Playground
* Och mycket bygger på Jonathan Oxer projektet på:
* http://www.practicalarduino.com/projects/medium/rfid-access-control
*/
Ställ in seriell anslutning till modulen RFID-läsare. För att
hålla de Arduino TX och RX stift gratis för kommunikation med en värd,
skissen använder SoftwareSerial biblioteket för att genomföra följetong
kommunikation på andra stift.
#include
RFID-modulens TX pin måste anslutas till Arduino.
#define rxPin 4
#define txPin 5
Skapa en programvara seriella objekt för anslutning till RFID-modulen
SoftwareSerial rfid = SoftwareSerial (rxPin, txPin);
Ställ in utgångar
#define futureOutput 12
#define ledPin 13
Ange hur länge produktionen bör hållas.
#define unlockSeconds 2
Tag databasen består av två delar. Den första delen är en matris av
tag värden med varje tagg tar upp 5 byte. Andra är en lista över
namn med ett namn för varje tagg (dvs: grupp av 5 byte). Du kan expandera
eller krympa det som du tycker passar. Taggar 2 och 3 är till exempel bara där.
char * allowedTags [] = {
"[Infoga IDENTIFIERARE här]", / / Tag 1
"2900940E95", / / Tag 2
"ABC123DE45", / / Tag 3
};
Namnlista att associera med matchande taggen ID.
char * tagName [] = {
"[Lägg till ditt namn här]", / / Tag 1
"Mark Trussell", / / Tag 2
"Namn 3", / / Tag 3
};
Kontrollera antalet Taggar definieras
int numberOfTags = sizeof(allowedTags)/sizeof(allowedTags[0]);
int incomingByte = 0; Att lagra inkommande seriella data
/**
* Setup
*/
void setup() {
pinMode (ledPin, produktionen);
digitalWrite (ledPin, låg);
pinMode (futureOutput, produktionen);
digitalWrite (futureOutput, låg);
Serial.BEGIN(9600); Seriell port för anslutning till värd
RFID.BEGIN(9600); Seriell port för anslutning till RFID modul
Serial.println ("RFID-läsare initieras");
}
/**
* Loop
*/
void loop() {
byte jag = 0;
byte val = 0;
byte checksum = 0;
byte bytesRead = 0;
byte tempByte = 0;
byte tagBytes [6]. "Unik" taggar är endast 5 byte men vi behöver en extra byte för kontrollsumman
char tagValue [10].
Läsa från RFID-modulen. Eftersom denna anslutning använder SoftwareSerial
Det finns ingen motsvarighet till Serial.available() funktionen, så i detta
Peka på programblock fördriva tiden väntan för ett värde från modulen
om ((val = rfid.read()) == 2) {/ / kolla för huvud
bytesRead = 0;
samtidigt (bytesRead < 12) {/ / Läs 10-siffriga koden + 2 siffrigt kontrollsumma
Val = rfid.read();
Lägg första 10 byte (0 till 9) till raw taggvärde
om (bytesRead < 10)
{
tagValue [bytesRead] = val;
}
Kontrollera om detta är en header eller stoppa byte innan den 10-siffriga läsning är klar
om ((val == 0x0D) || (val == 0x0A) || (val == 0x03) || (val == 0x02)) {
bryta; Sluta läsa
}
ASCII/Hex omvandling:
om ((val > = "0") & & (val < = '9')) {
Val = val - '0';
}
annars om ((val > = "A") & & (val < = "F")) {
Val = 10 + val - 'A',
}
Varje två hex-siffror, lägga till en byte i koden:
om (bytesRead & 1 == 1) {
Skapa utrymme för detta hex-siffror genom att flytta den tidigare siffran 4 bitar till vänster
tagBytes [bytesRead >> 1] = (val | (tempByte << 4));
om (bytesRead >> 1! = 5) {/ / om vi på kontrollsumma byte,
kontrollsumma ^ = tagBytes [bytesRead >> 1]; Beräkna kontrollsumman... (XOR)
};
} annat {
tempByte = val; Lagra den första hex siffran först
};
bytesRead ++; Redo att läsa nästa siffra
}
Skicka resultatet till ansluten via USB-värd
om (bytesRead == 12) {/ / 12 tal läsa är komplett
tagValue [10] = '\0'; Null-avsluta strängen
Serial.Print ("Tag läste:");
för (jag = 0; jag < 5; i ++) {
Lägga till en ledande 0 pad ut värden under 16
om (tagBytes [i] < 16) {
Serial.Print("0");
}
Serial.Print (tagBytes [i], HEX);
}
Serial.println();
Serial.Print ("kontrollsumma:");
Serial.Print (tagBytes [5], HEX);
Serial.println (tagBytes [5] == kontrollsumma? "--gått.": "--fel.");
Visa raw taggvärde
Serial.Print ("värde:");
Serial.println(tagValue);
Söka i taggen databasen för den här särskilda taggen
int tagId = findTag (tagValue);
Bara brand strike plattan om denna tagg hittades i databasen
om (tagId > 0)
{
Serial.Print ("auktoriserade tagg-ID");
Serial.Print(tagId);
Serial.Print (": upplåsning för");
Serial.println (tagName [tagId - 1]); Få namnet för den här taggen från databasen
Unlock(); Brand på strike plattan att öppna låset
} annat {
Serial.println ("Tag inte rätt");
}
Serial.println(); Tom avgränsningslinjen i utdata
}
bytesRead = 0;
}
}
/**
* Eld reläet att aktivera strike plattan för den konfigurerade
* antal sekunder.
*/
void unlock() {
digitalWrite (ledPin, hög);
digitalWrite (futureOutput, hög);
Delay(unlockSeconds * 1000);
digitalWrite (futureOutput, låg);
digitalWrite (ledPin, låg);
}
/**
* Söka efter en specifik tagg i databasen
*/
int findTag (char tagValue [10]) {
för (int thisCard = 0; thisCard < numberOfTags; thisCard ++) {
Kontrollera om taggvärde överensstämmer med denna rad i databasen tag
om (strcmp (tagValue, allowedTags[thisCard]) == 0)
{
Raden i databasen börjar på 0, så Lägg 1 till resultatet så
att kort-ID startar från 1 istället (0 representerar "ingen match")
Return (thisCard + 1);
}
}
Om vi inte hittar etiketten avkastning en tagg-ID 0 Visa fanns ingen match
Return(0);
}
--------------------------------------------------------------------------------------------------------------------------------