Étape 5: Croquis Final
Bon, n’oubliez pas lorsque nous avons connecté ID-12 broche 9 à la RX Arduno. Nous allons libérer la broche RX et déplacer cette connexion à la borne numérique 4. C’est tout !
Maintenant, prenez votre identificateur unique, couper les deux derniers caractères, donc vous vous retrouvez avec 10 caractères. Par exemple, j’ai lu 2900940E9526 comme mon identifiant. Donc, je vais utiliser 2900940E95. 26 est l’ID checksum. Ne vous inquiétez pas à ce sujet. Insérez votre identifiant dans le code ci-dessous où il est dit [insérer l’identifiant ici]. Vous pouvez également ajouter votre nom à la [ADD YOUR NAME HERE].
--------------------------------------------------------------------------------------------------------------------------------
/**
* Contrôle d’accès RFID
*
* Certains de ce code a été inspiré par tutoriel RFID de Tom Igoe
* À partir de l’exemple de code ID-12 sur l’aire de jeu pour Arduino
* Et fortement basé sur le projet de Jonathan Oxer à :
* http://www.practicalarduino.com/projects/medium/rfid-access-control
*/
Configurer la connexion en série au module lecteur RFID. Afin de
garder les broches Arduino TX et RX libres pour communiquer avec un hôte,
l’esquisse utilise la bibliothèque SoftwareSerial pour implémenter serial
communications sur les autres broches.
#include
Broche TX du module RFID doit être connecté à l’Arduino.
#define rxPin 4
#define txPin 5
Créer un objet de série de logiciels pour la connexion au module RFID
Rfid SoftwareSerial = SoftwareSerial (rxPin, txPin) ;
Mettre en place des sorties
#define futureOutput 12
#define ledPin 13
Spécifier combien de temps la sortie se tiendrait.
#define unlockSeconds 2
La base de données de la balise est constitué de deux parties. La première partie est un tableau de
valeurs de balise avec chaque étiquette reprenant 5 octets. La seconde est une liste de
les noms avec un seul nom pour chaque balise (c’est à dire: groupe de 5 octets). Vous pouvez étendre votre
ou rétrécir cela comme bon vous semble. Tags 2 et 3 ne sont là que par exemple.
char * allowedTags [] = {}
« [Insérer identificateur ici] », / / Tag 1
« 2900940E95 », / / Tag 2
« ABC123DE45 », / / Tag 3
};
Liste de noms à associer à l’ID de la balise correspondante
char * tagName [] = {}
« [Ajoutez votre nom ici] », / / Tag 1
« Mark Trussell », / / Tag 2
"Nom 3", / / Tag 3
};
Vérifier le nombre de balises définies
int numberOfTags = sizeof(allowedTags)/sizeof(allowedTags[0]) ;
int incomingByte = 0 ; Pour stocker les données entrantes en série
/**
* Le programme d’installation
*/
void setup() {}
pinMode (ledPin, sortie) ;
digitalWrite (ledPin, basse) ;
pinMode (futureOutput, sortie) ;
digitalWrite (futureOutput, basse) ;
Serial.Begin(9600) ; Port série pour la connexion à l’hôte
RFID.Begin(9600) ; Port série pour la connexion au module RFID
Serial.println ("RFID Reader initialisée") ;
}
/**
* Boucle
*/
void loop() {}
octet i = 0 ;
octet val = 0 ;
somme de contrôle octet = 0 ;
bytesRead octets = 0 ;
tempByte octets = 0 ;
tagBytes Byte [6] ; Tags « Uniques » sont seulement 5 octets, mais il nous faut un octet supplémentaire pour la somme de contrôle
char tagValue [10] ;
Lire à partir du module RFID. Parce que cette connexion utilise SoftwareSerial
Il n’y a pas d’équivalent à la fonction Serial.available(), tant en ce
Pointez les blocs de programme pendant que vous attendez d’une valeur à partir du module
Si ((val = rfid.read()) == 2) {/ / Check pour en-tête
bytesRead = 0 ;
tandis que (bytesRead < 12) {/ / lecture de 10 chiffres + somme de contrôle à 2 chiffres
Val = rfid.read() ;
Ajoutez les 10 premiers octets (0 à 9) à la valeur de la balise brut
Si (bytesRead < 10)
{
tagValue [bytesRead] = val ;
}
Vérifier si il s’agit d’un octet d’en-tête ou stop avant les 10 chiffres de lecture sont terminée
Si ((val == 0x0D) || (val == 0x0A) || (val == 0 x 03) || (Val == 0x02)) {
rupture ; Arrêtez de lire
}
Conversion ASCII/Hex :
Si ((val > = « 0 ») & & (val < = « 9 »)) {}
Val = val - « 0 » ;
}
ElseIf ((val > = « A ») & & (val < = « F »)) {}
Val = 10 + val - « A » ;
}
Tous deux chiffres hex, ajoutez un octet dans le code :
Si (bytesRead & 1 == 1) {}
Faire de la place pour ce chiffres hexadécimaux en déplaçant le chiffre précédent 4 bits vers la gauche
tagBytes [bytesRead >> 1] = (val | (tempByte << 4)) ;
Si (bytesRead >> 1! = 5) {/ / si nous sommes à l’octet de somme de contrôle,
somme de contrôle ^ = tagBytes [bytesRead >> 1] ; Calculer la somme de contrôle... (XOR)
};
} else {}
tempByte = val ; Stocker le premier chiffre hexadécimal tout d’abord
};
bytesRead ++ ; Prêt à lire le chiffre suivant
}
Envoyer le résultat à l’hôte connecté via USB
Si (bytesRead == 12) {/ / à 12 chiffres lire est terminée
tagValue [10] = « \0 » ; Terminez la chaîne
Serial.Print ("Tag lire:") ;
pour (i = 0; i < 5; i ++) {}
Ajouter un 0 pour remplir des valeurs inférieures à 16
Si (tagBytes [i] < 16) {}
Serial.Print("0") ;
}
Serial.Print (tagBytes [i], HEX) ;
}
Serial.println() ;
Serial.Print ("somme de contrôle:") ;
Serial.Print (tagBytes [5], HEX) ;
Serial.println (tagBytes [5] == checksum ? «--passé. ":"--erreur. ") ;
Indiquer la valeur de la balise brut
Serial.Print ("valeur:") ;
Serial.println(tagValue) ;
Recherchez la base de données balise cette balise particulière
tagId int = findTag (tagValue) ;
Tirer que la gâche ce tag a été trouvé dans la base de données
Si (tagId > 0)
{
Serial.Print ("Authorized tag ID") ;
Serial.Print(tagId) ;
Serial.Print (": Debloquer pour") ;
Serial.println (tagName [tagId - 1]) ; Obtenir le nom pour ce mot-clé de la base de données
Unlock() ; Feu la gâche pour ouvrir la serrure
} else {}
Serial.println ("Tag non autorisé ») ;
}
Serial.println() ; Ligne de séparation blanc en sortie
}
bytesRead = 0 ;
}
}
/**
* Feu le relais pour activer la gâche pour le configuré
* nombre de secondes.
*/
void unlock() {}
digitalWrite (ledPin, HIGH) ;
digitalWrite (futureOutput, HIGH) ;
Delay(unlockSeconds * 1000) ;
digitalWrite (futureOutput, basse) ;
digitalWrite (ledPin, basse) ;
}
/**
* Rechercher une balise spécifique dans la base de données
*/
int findTag (char tagValue [10]) {}
pour (int thisCard = 0; thisCard < numberOfTags ; thisCard ++) {}
Vérifier si la valeur de la balise correspond à cette ligne dans la base de données de la balise
Si (strcmp (tagValue, allowedTags[thisCard]) == 0)
{
La ligne dans les base de données dès 0, donc ajouter 1 au résultat donc
que l’ID de la carte commence à partir de 1 place (0 représente « aucune correspondance »)
Return (thisCard + 1) ;
}
}
Si nous ne trouvons pas la balise retour un ID de la balise de 0 pour montrer il y a pas de match
Return(0) ;
}
--------------------------------------------------------------------------------------------------------------------------------