Stap 5: Laatste schets
Oke, niet vergeten wanneer we ID-12 pin 9 aangesloten op de RX Arduno. We gonna vrijmaken van de RX-pin en daarvoor verhuizen naar digitale pin 4. That's it!
Nu, neem uw unieke identifier, snijd uit de laatste twee tekens, zodat u nog 10 tekens. Bijvoorbeeld, lees ik 2900940E9526 als mijn id. Dus, ik zal het gebruiken van 2900940E95. 26 is de id's controlesom. Maak je geen zorgen hierover. Plaats uw id in de code hieronder waar het zegt [hier ID invoegen]. U kunt ook uw naam in de [toevoegen uw naam hier].
--------------------------------------------------------------------------------------------------------------------------------
/**
* RFID-toegangscontrole
*
* Sommige van deze code werd geïnspireerd door Tom Igoe van RFID tutorial
* Uit de code voorbeeld ID-12 op de speelplaats van de Arduino
* En zeer gebaseerd op Jonathan Oxer van project op:
* http://www.practicalarduino.com/projects/medium/rfid-access-control
*/
De seriële verbinding met de RFID reader module instellen. Met het oog op
houden van de Arduino TX en RX pinnen gratis voor communicatie met een host,
de schets de SoftwareSerial-bibliotheek gebruikt om seriële
mededelingen over andere pinnen.
#include
Van de RFID-module TX pin moet worden aangesloten op de Arduino.
#define rxPin 4
#define txPin 5
Een seriële software-object voor de verbinding met de RFID-module maken
SoftwareSerial rfid = SoftwareSerial (rxPin, txPin);
Instellen van de uitgangen
#define futureOutput 12
#define ledPin 13
Opgeven hoe lang de uitvoer moet plaatsvinden.
#define unlockSeconds 2
De tag-database bestaat uit twee delen. Het eerste deel is een array van
labelwaarden met elke tag toegang tot 5 bytes. De tweede is een lijst van
namen met één naam voor elk label (dwz: groep 5 bytes). U kunt uitbreiden
of dit krimpen als u pasvorm ziet. Tags 2 en 3 zijn alleen daar bijvoorbeeld.
char * allowedTags [] {} =
"[Id hier invoegen]", / / label 1
"2900940E95", / / Label 2
"ABC123DE45", / / Label 3
};
Lijst met namen te koppelen aan de overeenkomende label-id
char * tagName [] {} =
"[Voeg uw naam hier]", / / label 1
"Mark Trussell", / / Label 2
"Naam 3" genoemd, / / Label 3
};
Controleer het nummer van tags gedefinieerd
int numberOfTags = sizeof(allowedTags)/sizeof(allowedTags[0]);
int incomingByte = 0; Voor het opslaan van binnenkomende seriële gegevens
/**
* Setup
*/
VOID Setup {}
pinMode (ledPin, OUTPUT);
digitalWrite (ledPin, laag);
pinMode (futureOutput, OUTPUT);
digitalWrite (futureOutput, laag);
Serial.begin(9600); Seriële poort voor aansluiting op de host
RFID.begin(9600); Seriële poort voor de verbinding met RFID-module
Serial.println ("RFID-lezer geïnitialiseerd");
}
/**
* Loop
*/
void loop {}
byte ik = 0;
byte val = 0;
checksum van de bytes = 0;
byte bytesRead = 0;
byte tempByte = 0;
byte tagBytes [6]; "Unieke" tags zijn slechts 5 bytes, maar we moeten een extra byte voor de checksum
char tagValue [10];
Lees uit de RFID-module. Omdat deze verbinding SoftwareSerial gebruikt
Er is geen equivalent voor de Serial.available()-functie, dus op dit
Wijs de blokken programma tijdens het wachten voor een waarde uit de module
Als ((val = rfid.read()) == 2) {/ / Check voor header
bytesRead = 0;
terwijl (bytesRead < 12) {/ / lees 10 cijferige code + 2 cijfers controlesom
Val = rfid.read();
De eerste 10 bytes (0 tot en met 9) aan de waarde van de ruwe tag toevoegen
Als (bytesRead < 10)
{
tagValue [bytesRead] = val;
}
Controleren of dit een kop- of stop-byte is, voordat de 10 cijfers lezen voltooid is
Als ((val == 0x0D) || (val == 0x0A) || (val == 0x03) || (Val == 0x02)) {
breken; Stoppen met lezen
}
ASCII/Hex conversie:
Als ((val > = '0') & & (val < = '9')) {}
Val = val - '0';
}
anders als ((val > = 'A') & & (val < = "F")) {}
Val = 10 + val - "A";
}
Elke twee hex-cijfers, voeg een byte toe aan de code:
Als (bytesRead & 1 == 1) {}
Maken van ruimte voor deze hex cijfers door het verschuiven van het vorige cijfer 4 bits naar links
tagBytes [bytesRead >> 1] = (val | (tempByte << 4));
Als (bytesRead >> 1! = 5) {/ / als we bij de controlesom byte,
checksum ^ = tagBytes [bytesRead >> 1]; Berekenen van de checksum... (XOR)
};
} else {}
tempByte = val; Het eerste hexadecimale cijfer eerst opslaan
};
bytesRead ++; Klaar om te lezen de volgende cijfer
}
Verzenden van het resultaat naar de host die is aangesloten via USB
Als (bytesRead == 12) {/ / 12 cijfers lezen is voltooid
tagValue [10] = '\0'; De tekenreeks Null-beëindigen
Serial.Print ("Tag lezen:");
voor (ik = 0; ik < 5; i ++) {}
Toevoegen van een leidende 0 voor het opvullen van waarden onder 16
Als (tagBytes [i] < 16) {}
Serial.Print("0");
}
Serial.Print (tagBytes [i], HEX);
}
Serial.println();
Serial.Print ("Checksum:");
Serial.Print (tagBytes [5], HEX);
Serial.println (tagBytes [5] == controlesom? "--doorgegeven.": "--fout.");
Toon de waarde van de ruwe tag
Serial.Print ("waarde:");
Serial.println(tagValue);
Zoeken in de database van de tag voor deze bepaalde tag
int tagId = findTag (tagValue);
De strike plaat alleen brand als deze tag werd gevonden in de database
Als (tagId > 0)
{
Serial.Print ("Authorized label-ID");
Serial.Print(tagId);
Serial.Print (": ontsluiten voor");
Serial.println (tagName [tagId - 1]); De naam voor dit label krijgen uit de database
Unlock(); Brand de staking plaat te openen van de sluis
} else {}
Serial.println ("Tag niet toegestaan");
}
Serial.println(); Lege scheidingslijn in uitvoer
}
bytesRead = 0;
}
}
/**
* Fire het Relais te activeren van de staking plaat voor de geconfigureerde
* aantal seconden.
*/
ongeldig unlock() {}
digitalWrite (ledPin, hoge);
digitalWrite (futureOutput, hoge);
delay(unlockSeconds * 1000);
digitalWrite (futureOutput, laag);
digitalWrite (ledPin, laag);
}
/**
* Zoeken naar een specifieke tag in de database
*/
int findTag (char tagValue [10]) {}
voor (int thisCard = 0; thisCard < numberOfTags; thisCard ++) {}
Controleren of de waarde van de tag overeenkomt met deze rij in de tag-database
Als (killerid (tagValue, allowedTags[thisCard]) == 0)
{
De rij in de database begint bij 0, dus er 1 bij optellen om het resultaat zo
dat de kaart-ID begint vanaf 1 in plaats daarvan (0 vertegenwoordigt "geen match")
keren (thisCard + 1);
}
}
Als we niet de tag terug een label-ID van 0 vinden zodat was er geen wedstrijd
Return(0);
}
--------------------------------------------------------------------------------------------------------------------------------