Αξιολόγηση Χρήστη: 5 / 5

Αστέρια ΕνεργάΑστέρια ΕνεργάΑστέρια ΕνεργάΑστέρια ΕνεργάΑστέρια Ενεργά
 

επικοινωνία του arduino με κάρτες τύπου RFID για μελλοντική πρόσβαση σε οικίες και συστήματα ασφαλείας

 Περιγραφή

Ως RFID νοείται η αναγνώριση ραδιοσυχνοτήτων. Η RFID χρησιμοποιεί ηλεκτρομαγνητικά πεδία για τη μεταφορά δεδομένων σε μικρές αποστάσεις. Η RFID είναι χρήσιμη για τον εντοπισμό ανθρώπων, την πραγματοποίηση συναλλαγών κλπ ...

Μπορείτε να χρησιμοποιήσετε ένα σύστημα RFID για να ανοίξετε μια πόρτα. Για παράδειγμα, μόνο το άτομο με τις σωστές πληροφορίες στην κάρτα του επιτρέπεται να εισέλθει. Ένα σύστημα RFID χρησιμοποιεί:

     ετικέτες που συνδέονται με το προς αναγνώριση αντικείμενο, σε αυτό το παράδειγμα έχουμε ένα μπρελόκ και μια ηλεκτρομαγνητική κάρτα. Κάθε ετικέτα έχει τη δική της ταυτότητα (UID).
tags
ετικέτες σε ομπρελόκ και κάρτα

   και στην επόμενη εικόνα βλέπουμε έναν αμφίδρομο ραδιοπομπό-δέκτη, τον αναγνώστη, που στέλνουν ένα σήμα στην ετικέτα και διαβάζουν την απόκριση.

tag reader

Παθητικά RFID

Σε ένα παθητικό σύστημα RFID, οι ετικέτες δεν χρησιμοποιούν μπαταρία. Αντίθετα, λαμβάνουν την ενέργειά τους για να τρέχουν το πρόγραμμά τους από τον αναγνώστη. Ο αναγνώστης εκπέμπει ένα ενεργειακό πεδίο σε μερικά εκατοστά, παρέχοντας έτσι την ενέργεια για οποιαδήποτε ετικέτα στην περιοχή. Η ετικέτα συγκεντρώνει την ηλεκτρομαγνητική ενέργεια από την συσκευή ανάγνωσης καρτών, την μετατρέπει σε ενέργεια ενεργοποιεί και ανταποκρίνεται με το "hello world" και τις πληροφορίες αναγνώρισης.

Οι παθητικές ετικέτες έχουν το πλεονέκτημα ότι μπορούν να διαβαστούν με γρήγορο ρυθμό (10 ή περισσότερες φορές το δευτερόλεπτο). Είναι εξαιρετικά λεπτές (επιτρέποντάς τους να τοποθετηθούν ανάμεσα σε στρώματα χαρτιού) και είναι εξαιρετικά φθηνές.

 

 

Ενεργά RFID

Τα ενεργά συστήματα RFID περιλαμβάνουν ετικέτες που διαθέτουν τη δική τους εσωτερική τροφοδοσία για μεγαλύτερη εμβέλεια. Οι ενεργές ετικέτες διαθέτουν μπαταρία και συνήθως έχουν μεγαλύτερα εξαρτήματα SMD. Μετά από ένα προκαθορισμένο χρονικό διάστημα, η ετικέτα εκπέμπει ένα ραδιοφωνικό σήμα. Ένας αναγνώστης στην περιοχή μπορεί να ακούσει και να ακούσει γι 'αυτό το σήμα. Επειδή μια ενεργή ετικέτα είναι ότι μπορούν να διαβαστούν σε πολύ μεγαλύτερες αποστάσεις από τις παθητικές ετικέτες (δεκάδες πόδια).

Τα μειονεκτήματα των ενεργών ετικετών περιλαμβάνουν μεγαλύτερο όγκο (λόγω της μπαταρίας), περιορισμένη διάρκεια ζωής (η ετικέτα είναι νεκρή όταν εξαντληθεί η μπαταρία), αυξημένο κόστος ανά ετικέτα και ποικίλες τιμές αναφοράς.

 

 

Συχνότητες RFID

Εκτός από τα ενεργητικά και παθητικά συστήματα, τα συστήματα RFID μπορούν επίσης να διαχωριστούν σε διαφορετικές συχνότητες.
Ορισμένες συχνότητες και συστήματα σχεδιάζονται για να διαβάζουν μόνο μία ετικέτα κάθε φορά, ενώ άλλα μπορούν να διαβάσουν πολλαπλά. Το κόστος των αναγνωστών μπορεί επίσης να ποικίλει άγρια με βάση τη βαθμολογία συχνότητας των μονάδων.
Εδώ η συχνότητα λειτουργίας είναι 10.56 MHZ

 

 

Pin wiring του αναγνώστη

Pin RFID  Arduino Uno ethernet HC-SR04 relays
  Digital 3     relay_in
  Digital 4 sd card    
  Digital 6   Echo  
  Digital 7   Triger  
SDA Digital 8      
RST Digital 9      
  Digital 10 10    
SCK Digital 13 13    
MOSI Digital 11 11    
MISO Digital 12 12    
IRQ unconnected      
GND GND GND GND GND
3.3V 3.3V 3.3v    
  5V   VCC VCC

 

 

rfidpinout

Προσοχή θέλει όπως δείχνει και ο πίνακας 3.3 βολτ στην τροφοδοσία του

Τα υλικά μας

Arduino UNO

ethernet shield

Relay Module

RFID Sensor RC522

LED x2

Buzzer 5 volt

Breadboard

Jumpers dupont cables

 

Το σχέδιο μας σε fritzing

 RFID RC522 bb

 

Ανάγνωση δεδομένων από μια ετικέτα RFID
 Φορτώνουμε πρώτα την βιβλιοθήκη RFID στο οριζόντιο μενού πατάμε tools -> Manage Libraries στην αναζήτηση δίνουμε mfrc522 και στα αποτελέσματα κάνουμε εγκατάσταση την βιβλιοθήκη. Η βιβλιοθήκη κατεβάζει και πολλά παραδείγματα.

Μετά την συναρμολόγηση του κυκλώματος, μεταβείτε στο Αρχείο-> Παραδείγματα-> MFRC522-> DumpInfo και μεταφορτώστε τον κώδικα. Αυτός ο κώδικας θα είναι διαθέσιμος στο ID του Arduino.
Εννοείται οτι στα tools έχει επιλεγεί το board και το σωστό port για να γίνει το uploading.
Στη συνέχεια, ανοίξτε τη σειριακή οθόνη. Θα πρέπει να δείτε κάτι σαν το παρακάτω σχήμα:

 

 

 

 

 

 

 

 

Κάντε προσέγγιση της κάρτας RFID ή του μπρελόκ στον αναγνώστη. Αφήστε τον αναγνώστη και την ετικέτα πιο κοντά μέχρι να εμφανιστούν όλες οι πληροφορίες.

 

 

 

 

 

Αυτές είναι οι πληροφορίες που μπορείτε να διαβάσετε από την κάρτα, συμπεριλαμβανομένου του UID της κάρτας που επισημαίνεται με κίτρινο χρώμα.Το UUID είναι σειριακός αριθμός που έχει κάθε ετικέτα από την εταιρεία κατασκευής. Οι πληροφορίες αποθηκεύονται στη μνήμη που χωρίζεται σε τμήματα(16 sectors) και μπλοκ(4 blocks ανά τομέα σύνολο 64 μπλοκ) όπως μπορείτε να δείτε στην προηγούμενη εικόνα, και κάθε μπλοκ έχει 16 bytes. To γινόμενό τους 16 Χ 4 Χ 16 μας κάνει 1024 bytes.

Έχετε 1024 bytes αποθήκευσης δεδομένων χωρισμένα σε 16 τομείς και κάθε τομέας προστατεύεται από δύο διαφορετικά κλειδιά, Α και Β.

Καταγράψτε το κωδικό UID, της δικιά σας κάρτας επειδή θα το χρειαστείτε αργότερα.


 

 

 

Καταχωρίστε τον ακόλουθο κώδικα Στη μνήμη του arduino.

 

/*
  * All the resources for this project: https://randomnerdtutorials.com/
 * Modified by Rui Santos
 * 
 * Created by FILIPEFLOP
 */
 
#include <SPI.h>  // δύο απαραίτητες βιβλιοθήκες
#include <MFRC522.h>
 
#define SS_PIN 8   // η κάρτα χρειάζεται ένα slave select στοπ πιν 8 
#define RST_PIN 9   // και επανεκκίνηση στο πιν 9
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.
 
//------------------------------------------------------------------------------ void setup() { Serial.begin(9600); // ορίζεται η σειριακή επικοινωνία με την οθόνη μας SPI.begin(); // ορισμός του διαδρόμου SPI mfrc522.PCD_Init(); // αρχικοποίηση του MFRC522 Serial.println("κάντε προσέγγιση της κάρτας σας στον αναγνώστη..."); Serial.println(); }
//--------------------------------------------------------------------------------
void loop() { // περιμένουμε προσέγγιση καινούργιας κάρτας if ( ! mfrc522.PICC_IsNewCardPresent()) // !=(logical not) { return; //επέστρεψε στην αρχή αν δεν υπάρχει κάρτα } // επιλογή ετικέτας if ( ! mfrc522.PICC_ReadCardSerial()) // πρσπάθησε να την διαβάσεις { return; // αν δεν τα καταφέρεις να την διαβάσεις επέστρεψε στην αρχή } //ενδειξη του UID στο σειριακό μόνιτορ στην οθόνη μας Serial.print("UID tag :"); String content= ""; byte letter; for (byte i = 0; i < mfrc522.uid.size; i++) // κάνε επαναλήψεις όσο το μέγεθος του UID
{
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println(); //άλλαξε γραμμή
Serial.print("Message : ");
content.toUpperCase();
if (content.substring(1) == "χχ χχ χχ χχ") //άλλαξε τον κωδικό UID της κάρτας για να εχεις πρόσβαση
{
Serial.println("Authorized access"); //εμφάνισε επιτυχής πρόσβαση
Serial.println(); // άλλαξε γραμμή
delay(3000); //καθυστέρησε 3 δευτ
} else {
Serial.println(" Access denied"); //αλλιώς εμφάνισε αποτυχία
delay(3000); //καθυστέρησε 3 δευτ
}
} // and void loop

 κατεβάστε το αρχείο rfid-access.ino

Στο κομμάτι του παραπάνω κώδικα πρέπει να αλλάξετε εκεί που γράφει if (content.substring (1) == xx xx xx xx "ΑΝΤΙΚΑΤΑΣΤΙΣΤΕ ΜΕ ΤΟ δικό σας UID") και πληκτρολογήστε την κάρτα δηλαδή τον κωδικό UID που έχετε γράψει προηγουμένως.

 

Προσέγγιση της κάρτας που έχετε επιλέξει για να δώσετε πρόσβαση και θα δείτε:

 

 

Εάν προσεγγίσετε μια άλλη ετικέτα με άλλο UID, το μήνυμα άρνησης θα εμφανιστεί:

 

 

 

 

 

 

 

Τώρα φορτώστε αυτόν τον κώδικα για να εκμεταλευτούμε τον ρελέ το βομβητή και τα led

 

#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN 8 // o αναγνώστης χρειάζεται ένα slave select στοπ πιν 8
#define RST_PIN 9 // επανεκκίνηση στο πιν 9
#define LED_G 5 //ορισμός πράσινου LED στον ακροδέκτη 5
#define LED_R 1 //ορισμός κόκκινου LED στον ακροδέκτη 1
#define RELAY 3 // ακροδέκτης ρελέ στον ακροδέκτη 3
#define BUZZER 2 //buzzer ακροδέκτης 2
#define ACCESS_DELAY 2000
#define DENIED_DELAY 1000
MFRC522 mfrc522(SS_PIN, RST_PIN);   // δημιουργία MFRC522 instance.

//---------------------------------------------------------------------------------------------------------------------------------------
void setup()
{
 Serial.begin(9600);   // ορισμός σειριακής επικοινωνίας με το μόνιτορ
SPI.begin();           // Initiate  SPI bus
mfrc522.PCD_Init();   // Initiate MFRC522
pinMode(LED_G, OUTPUT); // ορισμός ακροδέκτη 5 = LED_G ως έξοδο
pinMode(LED_R, OUTPUT); // ορισμός ακροδέκτη 1 ως έξοδο
pinMode(RELAY, OUTPUT); // ορισμός ακροδέκτη 3 ως έξοδο
pinMode(BUZZER, OUTPUT); // ορισμός ακροδέκτη 2 ως έξοδο
noTone(BUZZER); // σίγαση του buzzer
digitalWrite(RELAY, LOW); //αφόπλισε το ρελέ
Serial.println("Τοποθέτησε την κάρτα σου στον αναγνώστη...");
Serial.println();
  }

//---------------------------------------------------------------------------------------------------------------------------------------------
void loop()
{
   if ( ! mfrc522.PICC_IsNewCardPresent()) // Ψάχνει για νέα κάρτα ή ετικέτα στον αναγνώστη
  {
 
return; // εάν δεν υπάρχει επέστρεψε
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) // αφού υπάρχει κάρτα προσπάθησε να την διαβάσεις
  {
return; // επέστρεψε αν αποτύχεις να την διαβάσεις
  }
  Serial.print("UID tag :"); //Δείξε μας το UID στο σειριακό μόνιτορ
  String content= ""; //άδειασε το περιεχόμενο της μεταβλητής content που είναι τύπου string
  byte letter;
  for (byte i = 0; i < mfrc522.uid.size; i++) // κάνε επαναλήψεις όσο το μέγεθος του UID
  {
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
content.concat(String(mfrc522.uid.uidByte[i], HEX));
}

 Serial.println(); //αλλαγή γραμμής
Serial.print("Message : ");
 content.toUpperCase(); // μετατροπή δεδομένων μέσα στο content σε κεφαλαίoυς χαρακτήρες

 if (content.substring(1) == "xx xx xx xx") //βάλτε το UID της κάρτας για να έχεις επιτυχία στην πρόσβαση
 {
Serial.println("Authorized access"); // έχουμε επιτυχία στην πρόσβαση σωστό UID
Serial.println(); // αλλαγή γραμμής
delay(500);  // καθυστέρηση
digitalWrite(RELAY, HIGH); //ενεργοποίησε το ρελέ
digitalWrite(LED_G, HIGH); // άναψε το πράσινο led
delay(ACCESS_DELAY);
digitalWrite(RELAY, LOW);    // απενεργοποίησε το ρελέ
digitalWrite(LED_G, LOW); //σβήσε το πράσινο LED
}
else   {
  Serial.println(" Access denied"); //αποτυχία πρόσβασης διαφορετικό UID
 
digitalWrite(LED_R, HIGH); //άναψε το κόκκινο led
  tone(BUZZER, 300); // δώσε τόνο στο βομβητή
  delay(DENIED_DELAY);
digitalWrite(LED_R, LOW);
// σβήσε το κόκκινο led
  noTone(BUZZER); //σταμάτα τον ήχο του βομβητή
  }
}

 κατεβάστε το αρχείο uno-rfid-led-buzzer.ino

 

Επειδή υπάρχουν διάφοροι τύποι καρτών και μεγέθους μνήμης φορτώστε το παρακάτω κώδικα για να διαβάσετε και τον τύπο της κάρτας εκτός του σειριακού αριθμού της

 

 

/*
* ----------------------------------------------------------------------
* Example program showing how to read new NUID from a PICC to serial.
* ----------------------------------------------------------------------
* https://circuits4you.com
*
* RC522 Interfacing with NodeMCU
*
Typical pin layout used:
* -----------------------------------------------------------
*             MFRC522      Arduino       Arduino   Arduino  
*             Reader/PCD   Uno/101       Mega      Nano v3  
* Signal      Pin          Pin           Pin       Pin      
* -----------------------------------------------------------
* RST/Reset   RST          9             9         D9       
* SPI SS      SDA(SS)      8            8         D10      
* SPI MOSI    MOSI         11 / ICSP-4   51        D11      
* SPI MISO    MISO         12 / ICSP-1   50        D12      
* SPI SCK     SCK          13 / ICSP-3   52        D13      
*/
#include SPI.h
#include MFRC522.h
constexpr uint8_t SS_PIN = 8;     // ορισμός ακίδας 8 για slave select
constexpr
uint8_t RST_PIN = 9;    // ορισμός ακίδας 9 για reset του αναγνώστη
MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class
MFRC522::MIFARE_Key key;
// Init array that will store new NUID
byte nuidPICC[4];


//------------------------------------------------------------------------------
void
setup() {
 
Serial.begin(9600);
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }
  Serial.println(F("This code scan the MIFARE Classsic NUID."));
  Serial.print(F("Using the following key:"));
  printHex(key.keyByte, MFRC522::MF_KEY_SIZE);
}

//-----------------------------------------------------------------------------
void
loop() {
  // Look for new cards // Ψάχνει για νέα κάρτα ή ετικέτα στον αναγνώστη
  if ( ! rfid.PICC_IsNewCardPresent())
{   
return; // εάν δεν υπάρχει επέστρεψε στην αρχή
}
  // Verify if the NUID has been readed
  if ( ! rfid.PICC_ReadCardSerial())
{  
return; // επέστρεψε αν αποτύχεις να την διαβάσεις
}
  Serial.print(F("PICC type: "));
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  Serial.println(rfid.PICC_GetTypeName(piccType)); //δείξε μας τον τύπο της κάρτας
  // Check is the PICC of Classic MIFARE type
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
   
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K)
{
    Serial.println(F("Your tag is not of type MIFARE Classic."));
    return;
  }

  if (rfid.uid.uidByte[0] != nuidPICC[0] ||
    rfid.uid.uidByte[1] != nuidPICC[1] ||
   
rfid.uid.uidByte[2] != nuidPICC[2] ||
   
rfid.uid.uidByte[3] != nuidPICC[3] ) {
    Serial.println(F("A new card has been detected."));
    // Store NUID into nuidPICC array
    for (byte i = 0; i < 4; i++) {
      nuidPICC[i] = rfid.uid.uidByte[i];
    }
    Serial.println(F("The NUID tag is:"));
    Serial.print(F("In hex: "));
    printHex(rfid.uid.uidByte, rfid.uid.size);
    Serial.println();
    Serial.print(F("In dec: "));
    printDec(rfid.uid.uidByte, rfid.uid.size);
    Serial.println();
  }
  else Serial.println(F("Card read previously."));
 
  rfid.PICC_HaltA(); // Halt PICC
  rfid.PCD_StopCrypto1(); // Stop encryption on PCD
}
//-----------------------------------------------------------------------------------
/**
* Helper routine to dump a byte array as hex values to Serial.
*/
void printHex(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}

//-----------------------------------------------------------------------------------
/**
* Helper routine to dump a byte array as dec values to Serial.
*/
void printDec(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], DEC);
  }
}

 

 

 Γράφοντας δεδομένα σε ετικέτες

Για να γράψετε πληροφορίες στην κάρτα, πρέπει πρώτα να βεβαιωθείτε ότι η κάρτα σας είναι εγγράψιμη. Η κάρτα UHF είναι ένα είδος κάρτας RFID που λειτουργεί με υψηλή συχνότητα και έχει τη δυνατότητα να αποθηκεύει πληροφορίες, ώστε να χρειάζεστε αυτές τις κάρτες RFID για να γράψετε τις πληροφορίες που θέλετε στην κάρτα.
Χρησιμοποιήστε το ίδιο κύκλωμα όπως και πριν και φορτώστε τον ακόλουθο κώδικα στον arduino σας.

 

 Αυτός ο κώδικας που ακολουθεί σας ζητά τις πληροφορίες που θέλετε να αποθηκεύσετε στην κάρτα μετά την ανίχνευση της κάρτας και την εμφάνιση της κάρτας το  UID. Αυτές οι πληροφορίες μπορούν να αποτελούνται από γράμματα, αριθμούς ή άλλα σύμβολα.
Αυτές οι πληροφορίες στη συνέχεια αποθηκεύονται στο μπλοκ 1 και μπλοκ 2 της κάρτας. Μπορείτε να γράψετε σε ένα διαφορετικό μπλοκ κάθε φορά αλλάζοντας τη μεταβλητή μπλοκ στον κώδικα.

 

/* 
* RFID , εγγεραφή πάνω σε ετικέτες
* by Hanie kiani and Giannaras K
* https://electropeak.com/learn/
*/
#include SPI.h //απαραίτητες βιβλιοθήκες
#include MFRC522.h

#define RST_PIN 9 //ακιδα 9 για reset του αναγνώστη
#define SS_PIN 8 // ορισμός ακίδας 8 για slave select
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.

//-----------------------------------------------------------------------------
void setup() {
Serial.begin(9600); // Initialize σειριακή επικοινωνία με το μόνιτορ μας
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
}

//---------------------------------------------------------------------------------
void loop() {

MFRC522::MIFARE_Key key;
for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;

if ( ! mfrc522.PICC_IsNewCardPresent()) {
return; //αν δεν υπάρχει κάρτα επέστρεψε στην αρχή
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
return; // επέστρεψε αν αποτύχεις να την διαβάσεις
}
Serial.print(F("Card UID:")); //Dump UID εμφάνιση του UID στο monitor
for (byte i = 0; i < mfrc522.uid.size; i++){
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
{
Serial.print(F(" PICC type: ")); // Dump PICC type εμφάνιση του τύπου της κάρτας
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));

MFRC522::StatusCode status;
byte buffer[34]; //μεταβλητή πίνακας 34 θεσεων σε bytes
byte block;
byte data ;

Serial.setTimeout(30000L) ; // wait until 30 seconds for input from serial
//κάντε εισαγωγή δεδομένων μέχρι 30 χαρακτήρες τελευταίος χαρακτήρας η δίεση #
Serial.println(F("Type your desired data, ending with #"));
data = Serial.readBytesUntil('#', (char *) buffer, 30) ; //συνολο χαρακτήρων = data
for (byte i = data; i < 30; i++) buffer[i] = ' ';

block = 1;
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("PCD_Authenticate() success: "));
// Write block εγγραφη στο μπλοκ 1 τους 16 χαρακτηρες του buffer
status = mfrc522.MIFARE_Write(block, buffer, 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
{
else Serial.println(F("MIFARE_Write() success: "));
block = 2;
//Serial.println(F("Authenticating using key A..."));
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
{
// Write block εγγραφή στο μπλοκ 2
status = mfrc522.MIFARE_Write(block, &buffer[16], 16);
if (status != MFRC522::STATUS_OK) }
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
{
else Serial.println(F("MIFARE_Write() success: "));
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
}

επειδή χρησιμοποιεί το αρχείο #include MFRC522.h πρέπει να κατεβάσουμε και την βιβλιοθήκη αυτή
κατεβάστε το αρχείο write-uno-rfid.ino 

 

 

 Άλλο ένα παράδειγμα κώδικα που γράφει και διαβάζει πάνω σε κάρτες RFID

#include SPI.h
#include MFRC522.h
#define RST_PIN 9 //ακιδα 9 για reset του αναγνώστη
#define SS_PIN 8 // Configurable, see typical pin layout above
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
MFRC522::MIFARE_Key key;

//=================================================================================================
void setup() {
Serial.begin(9600); // Initialize serial communications with the PC
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
// Prepare the key (used both as key A and as key B)
// using FFFFFFFFFFFFh which is the default at chip delivery from the factory
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
Serial.println(F("Scan a MIFARE Classic PICC to demonstrate read and write."));
Serial.print(F("Using key (for A and B):"));
dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE);
Serial.println();
Serial.println(F("BEWARE: Data will be written to the PICC, in sector #1"));
} //end void setup


//=================================================================================================
void loop() {
// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return; //αν δεν υπάρχει κάρτα επέστρεψε στην αρχή
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
return; // επέστρεψε αν αποτύχεις να την διαβάσεις
}
// Show some details of the PICC (that is: the tag/card)
Serial.print(F("Card UID:"));
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
Serial.println();
Serial.print(F("PICC type: "));
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));
// Check for compatibility
if ( piccType != MFRC522::PICC_TYPE_MIFARE_MINI
&& piccType != MFRC522::PICC_TYPE_MIFARE_1K
&& piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println(F("This sample only works with MIFARE Classic cards."));
return;
}
// Σε αυτό το παράδειγμα χρησιμοποιούμε τον δεύτερο sector,
// o δεύτερος sector #1, καλύπτει το block #4 μέχρι το block #7
byte sector = 1;
byte blockAddr = 4;
// φτιαχνουμε ένα μπλοκ με 16 bytes
byte dataBlock[] = {
0x01, 0x02, 0x03, 0x04, // 1, 2, 3, 4, στο δεκαδικό σύστημα
0x05, 0x06, 0x07, 0x08, // 5, 6, 7, 8, στο δεκαδικό σύστημα
0x09, 0x0a, 0xff, 0x0b, // 9, 10, 255, 11, στο δεκαδικό σύστημα
0x0c, 0x0d, 0x0e, 0x0f // 12, 13, 14, 15 στο δεκαδικό σύστημα
};
byte trailerBlock = 7; //το μπλοκ 7 είναι το trailer block του δεύτερου sector
MFRC522::StatusCode status;
byte buffer[18];
byte size = sizeof(buffer);
// Authenticate using key A
Serial.println(F("Authenticating using key A..."));
status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
// Show the whole sector as it currently is
Serial.println(F("Current data in sector:"));
mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
Serial.println();


// Read data from the block
Serial.print(F("Reading data from block ")); Serial.print(blockAddr);
Serial.println(F(" ..."));
status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Read() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
}
Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":"));
dump_byte_array(buffer, 16); Serial.println();
Serial.println();
// Authenticate using key B
Serial.println(F("Authenticating again using key B..."));
status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}

// Write data to the block
Serial.print(F("Writing data into block ")); Serial.print(blockAddr);
Serial.println(F(" ..."));
dump_byte_array(dataBlock, 16); Serial.println();
status = (MFRC522::StatusCode) mfrc522.MIFARE_Write(blockAddr, dataBlock, 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
}
Serial.println();

// Read data from the block (again, should now be what we have written)
Serial.print(F("Reading data from block ")); Serial.print(blockAddr);
Serial.println(F(" ..."));
status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Read() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
}
Serial.print(F("Data in block ")); Serial.print(blockAddr); Serial.println(F(":"));
dump_byte_array(buffer, 16); Serial.println();
// Check that data in block is what we have written
// by counting the number of bytes that are equal
Serial.println(F("Checking result..."));


// Compare buffer (= what we've read) with dataBlock (= what we've written)
 
byte count = 0;
for (byte i = 0; i < 16; i++) {
if (buffer[i] == dataBlock[i])
count++;
}
Serial.print(F("Number of bytes that match = ")); Serial.println(count);
if (count == 16) {
Serial.println(F("Success :-)"));
} else {
Serial.println(F("Failure, no match :-("));
Serial.println(F(" perhaps the write didn't work properly..."));
}
Serial.println();

// Dump the sector data
Serial.println(F("Current data in sector:"));
mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
Serial.println();

mfrc522.PICC_HaltA(); // Halt PICC
mfrc522.PCD_StopCrypto1(); // Stop encryption on PCD
} // end void loop



//-----------------------------------------------------------------------------------------------
/**
* Helper routine to dump a byte array as hex values to Serial.
*/
void dump_byte_array(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}

 κατεβάστε το αρχείο write-name.ino

 

 

 

 

 

 

 

 

 

 Πρόκειται για ένα έργο που βασίζεται σε βάση δεδομένων, οπότε θα χρειαστείτε ένα διακομιστή ιστού όπου να φορτώσετε ένα αρχείο .php. αυτό είναι το τμήμα κώδικα που επεξεργάζεται τα αιτήματα του arduino και διαχειρίζεται τη βάση δεδομένων.

Επίσης, χρειάζεστε μια βάση δεδομένων mysql, όπου θα αποθηκεύονται όλες οι προσπελάσεις.

Μπορείτε να δημιουργήσετε τα πάντα σε ένα τοπικό "διακομιστή" στο γραφείο σας (ίσως το xampp είναι μια καλή και εύκολη επιλογή) ή αν έχετε έναν ιστοχώρο + mysql db θα μπορούσε να είναι το ίδιο.

 

 πρέπει να δημιουργήσουμε 2 πίνακες tables. Ο πρώτος πίνακας θα λέγεται users και θα έχει τα εξής πεδία

user-id   tag   lastname     firstname      point

ο δευτερος πίνακας checkin με τα εξής πεδία

check-id     date    point     checktag   operation


//<body>
//<html>
//<?php
$servername = "xxx.xxx.xxx.xxx";
$username = "your_username";
$password = "pwd";
$dbname = "db_name";
//if (isset($_GET["action"]) && $_GET["action"]=="insert")
$pwd = $_POST['pwd'];
$checktag = trim($_POST['checktag']); //trim importante altrimenti viene aggiunto un \n all'id
$point = trim($_POST['point']);
$operation = trim($_POST['operation']);
$ip = $_SERVER['REMOTE_ADDR'];

if ($pwd != 'xxxxxx') // small check to be sure to accept only authorized requests
{
die('Wrong password ');
}

$conn = mysql_connect($servername, $username, $password);
mysql_select_db($dbname);// Check connection
if (!$conn)
{
die('Could not connect: ' . mysql_error());
}
// check if the tag exists into the users table
$sql = "select count(*) as conta from users where tag ='$checktag' and point = '$point'";
$result = mysql_query($sql) ;
$row = mysql_fetch_assoc($result);
$count = $row['conta'];
if (!$result) {
$esito = "Λάθος timbratura 1";
}
if (isset($result))
{
if ($count==0)
$esito = "μη αναγνωρισμένος χρήστης";
if ($count >=1)
{
$sql = "INSERT INTO checkin(date, point, checktag, operation, ip) VALUES (now(), '$point', '$checktag', '$operation', '$ip')";
$result = mysql_query($sql) ;
if (!$result)
{
//die("Υπάρχει λάθος μέσα στην query της $sql: " . mysql_error());
$esito = "Λάθος timbratura 2";
}
else
$esito = "checkin kataxorithike";
}

mysql_close($conn);
echo $esito;
}

?>
//</body>
//</html>

 κατεβάστε από εδώ το write-uid.php

 

 

 

 

 

 

 i

 

 

 

 

 

Προσθήκη νέου σχολίου


Κωδικός ασφαλείας
Ανανέωση