RFID / NFC آردوینو آموزش آردوینو پروژه های آردوینو

آموزش RFID ورود به سیستم با مستر کارت و ماژول RC522 آردوینو Arduino

Arduino-RFID-RC522-door-digispark
نوشته شده توسط پریسا پوربلورچیان

در آموزش بخش اول RFID ، نحوه ی خواندن کدهای RFID را فرا گرفتید. با نزدیک کردن تگ به سنسور RFID، کد خوانده شده و سپس در سریال مانیتورنمایش داده می‌شود و تمام اطلاعات در حافظه EEPROM آردوینو ذخیره خواهند شد و  تا زمانی که تگ را غیرفعال نکنیم، اطلاعات پاک نمی‌شود. در این آموزش با تعریف master card یا به عبارتی (کارت تشخیص ارشد) می‌توانید کارت‌های زیر شاخه را تعریف و حتی حذف نمایید. در ادامه آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.

 

اتصالات RFID

اتصالات این آموزش کاملا مشابه آموزش خواندن کدهای تگ RFID با ماژول RC522  و آردوینو Arduino می‌باشد. روی لینک کلیک کرده و طبق آموزش و شماتیک اتصالات را برقرار کنید.

 

فراخوانی کتابخانه آردوینو

در این آموزش از کتابخانه MFRC522 استفاده می‌کنیم. لینک دانلود کتابخانه RC522 در صفحه محصول ماژول کارت خوان با قابلیت خواندن و نوشتن RFID – RC522 قسمت دانلود قرار دارد. چنانچه شیوه نصب کتابخانه در آردوینو را نمیدانید از پست نصب کنابخانه در نرم افزار آردوینو Arduino IDE استفاده کنید.

 

وسایل مورد نیاز مدار RFID:

ماژول کارت خوان RFID RC522

برد آردوینو Arduino UNO

کابل فلت ۴۰ رشته نری به مادگی Male to Female

 

 

کد برنامه RFID با آردوینو

 

محدودیت در دسترسی کامل به این مجموعه آموزش

 

دسترسی کامل به آموزش برای اعضای دیجی اسپارک امکان پذیر است. بخش اصلی آموزش شامل سورس کدهای توسعه داده شده توسط مهندس‌های دیجی اسپارک است. به همین دلیل این آموزش خاص و یکتاست. برای استفاده از آن بایستی عضویت تهیه کنید. تبادل نظر با کاربران و پرسش سوال رایگان است و میتوانید از بخش نظرات همین آموزش اقدام کنید.

 

 

 

اختصاص دسترسی RFID تگ – Added ID to EEPROM

تگ دیگری را برای تعریف دسترسی انتخاب می‌کنیم. با نزدیک کردن تگ جدید به RFID پیغامی مبنی بر Succesfully added ID record to EEPROM برای شما نمایش داده می‌شود. به این معنی که کارت دسترسی ورود داشته و شناسایی شده است. حال دوباره Master card را به RFID نزدیک کنید تا از حالت قبل خارج شود. سپس با نزدیک کردن تگ جدید به RFID پیغام اجازه به ورود – Welcome, You shall pass برای شما نمایش داده خواهد شد.

 

حذف دسترسی تگ – Removed ID to EEPROM

برای حذف دسترسی باید ابتدا تگ را شناسایی کنید. سپس master card را به RFID نزدیک کنید تا پیغام  Hello Master – Entered Program Mode برای شما نمایش داده شود. حال با نزدیک کردن تگ مورد نظر پیغام  I know this PICC, so removing,Succesfully removed ID record from EEPROM نمایش داده خواهد شد و به این معنی است که تگ حذف شده و اجازه ورود و دسترسی نخواهد داشت. حال master card را به RFID نزدیک کنید تا از حالت تنظیم خارج گردد، سپس تگ را به RFID نزدیک کنید همانطور که میبینید پیغام You shall not pass برای شما نمایش داده خواهد شد. کارت شما دیگر اجازه ورود نخواهد داشت.

چرخه LED

برای درک بهتر عملکرد RFID از سه ال ای دی – LED آبی، قرمز و سبز برای نمایش عملکرد تگ‌ها استفاده خواهیم کرد. در ادامه وضعیت ال ای دی – LED را بررسی می‌کنیم.

 

اتصالات LED

برای چرخه ال ای دی – LED نیاز به ۳  ال ای دی با رنگ های متفاوت داریم. برای اتصال ال ای دی ها نیاز به بردبورد خواهیم داشت:

  • ال ای دی – LED آبی را به پین ۵ دیجیتال آردوینو وصل می‌کنیم.
  • ال ای دی – LED قرمز را به پین ۷ دیجیتال آردوینو وصل می‌کنیم.
  • ال ای دی – LED سبز را به پین ۶ دیجیتال آردوینو وصل می‌کنیم.
  • پایه GND بردبورد را به پایه GND آردینو وصل می‌کنیم.

 

تنظیمات RFID

برای تشخیص مستر کارت-master card با نزدیک کردن کارت به RFID، ال ای دی آبی روشن شده و سپس به صورت چرخشی ۴ بار در حلقه به صورت چشمک زن تکرار می‌شود. سپس پیغام Master Card Defined نمایش داده می‌شود.

 

رایت آی دی در EEPROM RFID

پس از معرفی کارت در حافظه EEPROM آردوینو مدار RFID ، ال ای دی سبز سه مرتبه شروع به چشمک زدن خواهد کرد و سپس پیغام Succesfully added ID record to EEPROM نمایش داده می‌شود.

 

رایت ناموفق در EEPROM RFID

اگر کارت به درستی در حافظه EEPROM آردوینو مدار RFID رایت نشود، ال ای دی قرمز سه مرتبه چشمک میزند و سپس پیغام Failed! There is something wrong with ID or bad EEPROM نمایش داده می‌شود.

 

حذف آی دی از EEPROM RFID

ال ای دی آبی ۳ مرتبه به این معنی که آی دی از حافظه EEPROM آردوینو مدار RFID حذف شده است شروع به چشمک زدن خواهد کرد. سپس پیغام Succesfully removed ID record from EEPROM نمایش داده می‌شود.

 

حلقه ال ای دی مدار RFID

در حلقه ال ای دی پس از شناسایی کارت و تگ‌های RFID ال ای دی ها در چرخه تعریف شده شروع به چشمک زدن خواهند کرد و به ترتیب ال ای دی سبز ، سپس ال ای دی آبی و در نهایت ال ای دی قرمز روشن خواهد شد.

 

پروژه

حال با توجه به کدهای بالا پروژه ای برای فعال کردن رله جهت باز کردن در ورودی بنویسید. توجه داشته باشید اولین نفری که کد مربوط به پروژه تعریف شده را برای ما ارسال کند، علاوه بر انتشار آن در دیجی اسپارک، بن خرید ۳۰ هزار تومانی جهت خرید از فروشگاه اینترنتی دانشجوکیت تعلق خواهد گرفت.

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد.

 

درباره نویسنده

پریسا پوربلورچیان

تولید کننده محتوا / کارشناس IOT

زندگی یعنی پژوهش و فهمیدن چیزی جدید

تلاشم بر این است تجربیاتم در زمینه IOT‌ را به بهترین شکل با شما در میان بگذارم.

تبادل نظر و رفع عیب با ثبت دیدگاه

۲۴۹ دیدگاه

  • سلام،آموزش عالی بود
    ممکنه در ادامه این آموزش اضافه کردن LCD کاراکتری و Sd card برای ذخیره عبور افراد رو به این پروژه اضافه کنید
    ممنون از شما

    • سلام
      از توجه شما بسیار ممنونم.
      با توجه به اینکه سری آموزش های RFID مرحله به مرحله در دستور تولید است، درخواست شما حتما بررسی و در صورت امکان بر روی سایت منتشر خواهد شد.

  • وقت بخیر. آموزشتون عالی بود. کاش امکان ورود و خروج هم فراهم بشه طبق فرمایش دوست خوبمون آقا علیرضا

    • سلام
      از دقت نظر و توجه شما سپاسگزارم.
      با استفاده از رله و‌ قفل برقی و سرو موتور به راحتی اینکار قابل انجام است. بنده در انتهای آموزش پروژه ای تعریف کردم که در حال حاضر کاربران در حال تحلیل کدها و ارسال نمونه کد هستند. پس از یک زمان مشخصی که برای ارسال کدها در نظر گرفته ام، حتما در آموزش‌ بعدی RFID مفصل به اتصال ال سی دی و میکرو اس دی و همچنین باز و بسته کردن در خواهم پرداخت.

  • با سلام
    لطفا در مورد این ارور میشه راهنمایی کنید .موقع کپی کردن کدها میده
    Arduino: 1.8.2 (Windows 10), Board: “Arduino/Genuino Uno”

    C:\Users\LENOVO\Documents\Arduino\sketch_oct28f\sketch_oct28f.ino: In function ‘void setup()’:

    sketch_oct28f:58: error: ‘class MFRC522’ has no member named ‘PCD_Init’

    mfrc522.PCD_Init(); // مقدار دهی اولیه سخت اÙ?زار MFRC522

    ^

    sketch_oct28f:59: error: ‘class MFRC522’ has no member named ‘PCD_SetAntennaGain’

    mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max); //ست کردن آنتن برای ماژول RFID جهت اÙ?زایش برد گیرنده Ú©Ù‡ در این آموزش به این موضوع نمیپردازیم.

    ^

    sketch_oct28f:59: error: ‘class MFRC522’ has no member named ‘RxGain_max’

    mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max); //ست کردن آنتن برای ماژول RFID جهت اÙ?زایش برد گیرنده Ú©Ù‡ در این آموزش به این موضوع نمیپردازیم.

    ^

    C:\Users\LENOVO\Documents\Arduino\sketch_oct28f\sketch_oct28f.ino: In function ‘int getID()’:

    sketch_oct28f:152: error: ‘class MFRC522’ has no member named ‘PICC_IsNewCardPresent’

    if ( ! mfrc522.PICC_IsNewCardPresent()) { //اگر یک PICC جدید به RFID معرÙ?ÛŒ شد، ادامه میدهد.

    ^

    sketch_oct28f:155: error: ‘class MFRC522’ has no member named ‘PICC_ReadCardSerial’

    if ( ! mfrc522.PICC_ReadCardSerial()) {

    ^

    sketch_oct28f:163: error: ‘class MFRC522’ has no member named ‘uid’

    readCard[i] = mfrc522.uid.uidByte[i];

    ^

    sketch_oct28f:167: error: ‘class MFRC522’ has no member named ‘PICC_HaltA’

    mfrc522.PICC_HaltA(); // توقÙ? خواندن کارت

    ^

    Multiple libraries were found for “MFRC522.h”
    Used: C:\Users\LENOVO\Documents\Arduino\libraries\MFRC522-master
    Not used: C:\Users\LENOVO\Documents\Arduino\libraries\rfid-master
    exit status 1
    ‘class MFRC522’ has no member named ‘PCD_Init’

    This report would have more information with
    “Show verbose output during compilation”
    option enabled in File -> Preferences.

    • سلام
      بنده مجددا کدها را بررسی و کامپایل کردم و کدها سالم هستند. پس از کپی کدها ابتدا در قسمت tools، پورت خود را چک کنید تا به درستی انتخاب شده باشد. مسیر نصب کتابخانه را هم مجددا چک کنید. در صورت برطرف نشدن مشکل از همین طریق اعلام نمایید.

  • با سلام ، اینم کد پروژه برای فعال کردن رله جهت باز کردن در ورودی: امیدوارم سر قولتون باشید:
    #include // We are going to read and write PICC’s UIDs from/to EEPROM
    #include // RC522 Module uses SPI protocol
    #include // Library for Mifare RC522 Devices

    #define COMMON_ANODE

    #ifdef COMMON_ANODE
    #define LED_ON LOW
    #define LED_OFF HIGH
    #else
    #define LED_ON HIGH
    #define LED_OFF LOW
    #endif

    #define redLed 7 // Set Led Pins
    #define greenLed 6
    #define blueLed 5

    #define relay 4 // Set Relay Pin
    #define wipeB 3 // Button pin for WipeMode, HOLD it then reset arduino for wipe mode.

    boolean match = false; // initialize card match to false
    boolean programMode = false; // initialize programming mode to false

    int successRead; // Variable integer to keep if we have Successful Read from Reader

    byte storedCard[4]; // Stores an ID read from EEPROM
    byte readCard[4]; // Stores scanned ID read from RFID Module
    byte masterCard[4]; // Stores master card’s ID read from EEPROM

    /*
    We need to define MFRC522’s pins and create instance
    Pin layout should be as follows (on Arduino Uno):
    MOSI: Pin 11 / ICSP-4
    MISO: Pin 12 / ICSP-1
    SCK : Pin 13 / ICSP-3
    SS : Pin 10 (Configurable)
    RST : Pin 9 (Configurable)
    look MFRC522 Library for
    other Arduinos’ pin configuration
    */

    #define SS_PIN 10
    #define RST_PIN 9
    MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.

    ///////////////////////////////////////// Setup ///////////////////////////////////
    void setup() {
    //Arduino Pin Configuration
    pinMode(redLed, OUTPUT);
    pinMode(greenLed, OUTPUT);
    pinMode(blueLed, OUTPUT);
    pinMode(wipeB, INPUT_PULLUP); // Enable pin’s pull up resistor
    pinMode(relay, OUTPUT);
    //Be careful how relay circuit behave on while resetting or power-cycling your Arduino
    digitalWrite(relay, HIGH); // Make sure door is locked
    digitalWrite(redLed, LED_OFF); // Make sure led is off
    digitalWrite(greenLed, LED_OFF); // Make sure led is off
    digitalWrite(blueLed, LED_OFF); // Make sure led is off

    //Protocol Configuration
    Serial.begin(9600); // Initialize serial communications with PC
    SPI.begin(); // MFRC522 Hardware uses SPI protocol
    mfrc522.PCD_Init(); // Initialize MFRC522 Hardware

    //If you set Antenna Gain to Max it will increase reading distance
    //mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);

    Serial.println(F(“BlueCore Tech Acces Control”)); // For debugging purposes
    ShowReaderDetails(); // Show details of PCD – MFRC522 Card Reader details

    //Wipe Code if Button Pressed while setup run (powered on) it wipes EEPROM
    if (digitalRead(wipeB) == LOW) { // when button pressed pin should get low, button connected to ground
    digitalWrite(redLed, LED_ON); // Red Led stays on to inform user we are going to wipe
    Serial.println(F(“Wipe Button Pressed”));
    Serial.println(F(“You have 5 seconds to Cancel”));
    Serial.println(F(“All records will be removed. This cannot be undone!”));
    delay(5000); // Give user enough time to cancel operation
    if (digitalRead(wipeB) == LOW) { // If button still be pressed, wipe EEPROM
    Serial.println(F(“CLEARING DATABASE”));
    for (int x = 0; x < EEPROM.length(); x = x + 1) { //Loop end of EEPROM address
    if (EEPROM.read(x) == 0) { //If EEPROM address 0
    // do nothing, already clear, go to the next address in order to save time and reduce writes to EEPROM
    }
    else {
    EEPROM.write(x, 0); // if not write 0 to clear, it takes 3.3mS
    }
    }
    Serial.println(F("DATABASE Successfully Wiped"));
    digitalWrite(redLed, LED_OFF); // visualize successful wipe
    delay(200);
    digitalWrite(redLed, LED_ON);
    delay(200);
    digitalWrite(redLed, LED_OFF);
    delay(200);
    digitalWrite(redLed, LED_ON);
    delay(200);
    digitalWrite(redLed, LED_OFF);
    }
    else {
    Serial.println(F("Wiping Cancelled"));
    digitalWrite(redLed, LED_OFF);
    }
    }
    // Check if master card defined, if not let user choose a master card
    // This also useful to just redefine Master Card
    // You can keep other EEPROM records just write other than 143 to EEPROM address 1
    // EEPROM address 1 should hold magical number which is '143'
    if (EEPROM.read(1) != 143) {
    Serial.println(F("No Master Card Set"));
    Serial.println(F("Scan A RFID Card to Set as Master Card"));
    do {
    successRead = getID(); // sets successRead to 1 when we get read from reader otherwise 0
    digitalWrite(blueLed, LED_ON); // Visualize Master Card need to be defined
    delay(200);
    digitalWrite(blueLed, LED_OFF);
    delay(200);
    }
    while (!successRead); // Program will not go further while you not get a successful read
    for ( int j = 0; j < 4; j++ ) { // Loop 4 times
    EEPROM.write( 2 + j, readCard[j] ); // Write scanned PICC's UID to EEPROM, start from address 3
    }
    EEPROM.write(1, 143); // Write to EEPROM we defined Master Card.
    Serial.println(F("Master Card Set"));
    }
    Serial.println(F("——————-"));
    Serial.println(F("Master Card's UID = "));
    for ( int i = 0; i < 4; i++ ) { // Read Master Card's UID from EEPROM
    masterCard[i] = EEPROM.read(2 + i); // Write it to masterCard
    Serial.print(masterCard[i], HEX);
    }
    Serial.println("");
    Serial.println(F("——————-"));
    Serial.println(F("Everything Ready"));
    Serial.println(F("Waiting for Keys or cards to be scanned"));
    cycleLeds(); // Everything ready lets give user some feedback by cycling leds
    }

    ///////////////////////////////////////// Main Loop ///////////////////////////////////
    void loop () {
    do {
    successRead = getID(); // sets successRead to 1 when we get read from reader otherwise 0
    if (programMode) {
    cycleLeds(); // Program Mode cycles through RGB waiting to read a new card
    }
    else {
    normalModeOn(); // Normal mode, blue Power LED is on, all others are off
    }
    }
    while (!successRead); //the program will not go further while you not get a successful read
    if (programMode) {
    if ( isMaster(readCard) ) { //If master card scanned again exit program mode
    Serial.println(F("Master Card Scanned"));
    Serial.println(F("Exiting Programming Mode"));
    Serial.println(F("—————————–"));
    programMode = false;
    return;
    }
    else {
    if ( findID(readCard) ) { // If scanned card is known delete it
    Serial.println(F("I know this key, removing…"));
    deleteID(readCard);
    Serial.println("—————————–");
    }
    else { // If scanned card is not known add it
    Serial.println(F("I do not know this key, adding…"));
    writeID(readCard);
    Serial.println(F("—————————–"));
    }
    }
    }
    else {
    if ( isMaster(readCard) ) { // If scanned card's ID matches Master Card's ID enter program mode
    programMode = true;
    Serial.println(F("Hello Master – Entered Programming Mode"));
    int count = EEPROM.read(0); // Read the first Byte of EEPROM that
    Serial.print(F("I have ")); // stores the number of ID's in EEPROM
    Serial.print(count);
    Serial.print(F(" record(s) in DATABASE"));
    Serial.println("");
    Serial.println(F("Scan a Card or key to ADD or REMOVE"));
    Serial.println(F("—————————–"));
    }
    else {
    if ( findID(readCard) ) { // If not, see if the card is in the EEPROM
    Serial.println(F("Welcome, Acces Granted"));
    granted(300); // Open the door lock for 300 ms
    }
    else { // If not, show that the ID was not valid
    Serial.println(F("Acces Denied!"));
    denied();
    }
    }
    }
    }

    ///////////////////////////////////////// Access Granted ///////////////////////////////////
    void granted (int setDelay) {
    digitalWrite(blueLed, LED_OFF); // Turn off blue LED
    digitalWrite(redLed, LED_OFF); // Turn off red LED
    digitalWrite(greenLed, LED_ON); // Turn on green LED
    digitalWrite(relay, LOW); // Unlock door!
    delay(10000); // Hold door lock open for given seconds
    digitalWrite(relay, HIGH); // Relock door
    delay(1000); // Hold green LED on for a second
    }

    ///////////////////////////////////////// Access Denied ///////////////////////////////////
    void denied() {
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    digitalWrite(redLed, LED_ON); // Turn on red LED
    delay(1000);
    }

    ///////////////////////////////////////// Get PICC's UID ///////////////////////////////////
    int getID() {
    // Getting ready for Reading PICCs
    if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
    return 0;
    }
    if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
    return 0;
    }
    // There are Mifare PICCs which have 4 byte or 7 byte UID care if you use 7 byte PICC
    // I think we should assume every PICC as they have 4 byte UID
    // Until we support 7 byte PICCs
    Serial.println(F("Scanned KEY's UID:"));
    for (int i = 0; i < 4; i++) { //
    readCard[i] = mfrc522.uid.uidByte[i];
    Serial.print(readCard[i], HEX);
    }
    Serial.println("");
    mfrc522.PICC_HaltA(); // Stop reading
    return 1;
    }

    void ShowReaderDetails() {
    // Get the MFRC522 software version
    byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg);
    Serial.print(F("MFRC522 Version: 0x"));
    Serial.print(v, HEX);
    if (v == 0x91)
    Serial.print(F(" = v1.0"));
    else if (v == 0x11)
    Serial.print(F(" = BlueCore Tech. RFID Acces v2.0"));
    else
    Serial.print(F(" (unknown)"));
    Serial.println("");
    // When 0x00 or 0xFF is returned, communication probably failed
    if ((v == 0x00) || (v == 0xFF)) {
    Serial.println(F("WARNING: Communication failure, is the RFID-MFRC522 properly connected?"));
    while(true); // do not go further
    }
    }

    ///////////////////////////////////////// Cycle Leds (Program Mode) ///////////////////////////////////
    void cycleLeds() {
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_ON); // Make sure green LED is on
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    delay(200);
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
    delay(200);
    digitalWrite(redLed, LED_ON); // Make sure red LED is on
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    delay(200);
    }

    //////////////////////////////////////// Normal Mode Led ///////////////////////////////////
    void normalModeOn () {
    digitalWrite(blueLed, LED_ON); // Blue LED ON and ready to read card
    digitalWrite(redLed, LED_OFF); // Make sure Red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure Green LED is off
    digitalWrite(relay, HIGH); // Make sure Door is Locked
    }

    //////////////////////////////////////// Read an ID from EEPROM //////////////////////////////
    void readID( int number ) {
    int start = (number * 4 ) + 2; // Figure out starting position
    for ( int i = 0; i < 4; i++ ) { // Loop 4 times to get the 4 Bytes
    storedCard[i] = EEPROM.read(start + i); // Assign values read from EEPROM to array
    }
    }

    ///////////////////////////////////////// Add ID to EEPROM ///////////////////////////////////
    void writeID( byte a[] ) {
    if ( !findID( a ) ) { // Before we write to the EEPROM, check to see if we have seen this card before!
    int num = EEPROM.read(0); // Get the numer of used spaces, position 0 stores the number of ID cards
    int start = ( num * 4 ) + 6; // Figure out where the next slot starts
    num++; // Increment the counter by one
    EEPROM.write( 0, num ); // Write the new count to the counter
    for ( int j = 0; j < 4; j++ ) { // Loop 4 times
    EEPROM.write( start + j, a[j] ); // Write the array values to EEPROM in the right position
    }
    successWrite();
    Serial.println(F("Succesfully added ID record to DATABASE"));
    }
    else {
    failedWrite();
    Serial.println(F("Failed! There is something wrong with ID or bad DATABASE"));
    }
    }

    ///////////////////////////////////////// Remove ID from EEPROM ///////////////////////////////////
    void deleteID( byte a[] ) {
    if ( !findID( a ) ) { // Before we delete from the EEPROM, check to see if we have this card!
    failedWrite(); // If not
    Serial.println(F("Failed! There is something wrong with ID or bad DATABASE"));
    }
    else {
    int num = EEPROM.read(0); // Get the numer of used spaces, position 0 stores the number of ID cards
    int slot; // Figure out the slot number of the card
    int start; // = ( num * 4 ) + 6; // Figure out where the next slot starts
    int looping; // The number of times the loop repeats
    int j;
    int count = EEPROM.read(0); // Read the first Byte of EEPROM that stores number of cards
    slot = findIDSLOT( a ); // Figure out the slot number of the card to delete
    start = (slot * 4) + 2;
    looping = ((num – slot) * 4);
    num–; // Decrement the counter by one
    EEPROM.write( 0, num ); // Write the new count to the counter
    for ( j = 0; j < looping; j++ ) { // Loop the card shift times
    EEPROM.write( start + j, EEPROM.read(start + 4 + j)); // Shift the array values to 4 places earlier in the EEPROM
    }
    for ( int k = 0; k < 4; k++ ) { // Shifting loop
    EEPROM.write( start + j + k, 0);
    }
    successDelete();
    Serial.println(F("Succesfully removed ID record from DATABASE"));
    }
    }

    ///////////////////////////////////////// Check Bytes ///////////////////////////////////
    boolean checkTwo ( byte a[], byte b[] ) {
    if ( a[0] != NULL ) // Make sure there is something in the array first
    match = true; // Assume they match at first
    for ( int k = 0; k < 4; k++ ) { // Loop 4 times
    if ( a[k] != b[k] ) // IF a != b then set match = false, one fails, all fail
    match = false;
    }
    if ( match ) { // Check to see if if match is still true
    return true; // Return true
    }
    else {
    return false; // Return false
    }
    }

    ///////////////////////////////////////// Find Slot ///////////////////////////////////
    int findIDSLOT( byte find[] ) {
    int count = EEPROM.read(0); // Read the first Byte of EEPROM that
    for ( int i = 1; i <= count; i++ ) { // Loop once for each EEPROM entry
    readID(i); // Read an ID from EEPROM, it is stored in storedCard[4]
    if ( checkTwo( find, storedCard ) ) { // Check to see if the storedCard read from EEPROM
    // is the same as the find[] ID card passed
    return i; // The slot number of the card
    break; // Stop looking we found it
    }
    }
    }

    ///////////////////////////////////////// Find ID From EEPROM ///////////////////////////////////
    boolean findID( byte find[] ) {
    int count = EEPROM.read(0); // Read the first Byte of EEPROM that
    for ( int i = 1; i <= count; i++ ) { // Loop once for each EEPROM entry
    readID(i); // Read an ID from EEPROM, it is stored in storedCard[4]
    if ( checkTwo( find, storedCard ) ) { // Check to see if the storedCard read from EEPROM
    return true;
    break; // Stop looking we found it
    }
    else { // If not, return false
    }
    }
    return false;
    }

    ///////////////////////////////////////// Write Success to EEPROM ///////////////////////////////////
    // Flashes the green LED 3 times to indicate a successful write to EEPROM
    void successWrite() {
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is on
    delay(200);
    digitalWrite(greenLed, LED_ON); // Make sure green LED is on
    delay(200);
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    delay(200);
    digitalWrite(greenLed, LED_ON); // Make sure green LED is on
    delay(200);
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    delay(200);
    digitalWrite(greenLed, LED_ON); // Make sure green LED is on
    delay(200);
    }

    ///////////////////////////////////////// Write Failed to EEPROM ///////////////////////////////////
    // Flashes the red LED 3 times to indicate a failed write to EEPROM
    void failedWrite() {
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    delay(200);
    digitalWrite(redLed, LED_ON); // Make sure red LED is on
    delay(200);
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    delay(200);
    digitalWrite(redLed, LED_ON); // Make sure red LED is on
    delay(200);
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    delay(200);
    digitalWrite(redLed, LED_ON); // Make sure red LED is on
    delay(200);
    }

    ///////////////////////////////////////// Success Remove UID From EEPROM ///////////////////////////////////
    // Flashes the blue LED 3 times to indicate a success delete to EEPROM
    void successDelete() {
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    delay(200);
    digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
    delay(200);
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    delay(200);
    digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
    delay(200);
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    delay(200);
    digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
    delay(200);
    }

    ////////////////////// Check readCard IF is masterCard ///////////////////////////////////
    // Check to see if the ID passed is the master programing card
    boolean isMaster( byte test[] ) {
    if ( checkTwo( test, masterCard ) )
    return true;
    else
    return false;
    }
    ببینم سر قولتون(بن خرید) هستین یا نه؟ قبول کردین شماتیک رو هم تقدیم می کنم.
    با تشکر

    • سلام
      بسیار عالی، از توجه، همکاری و حمایت شما در این زمینه صمیمانه سپاسگزارم.
      حتما فایل متنی را برای بنده ارسال کنید. در مورد بن هم سر قولمان هستیم و بن در نظر گرفته شده از طریق ایمیل برای شما ارسال خواهد شد. پس از استفاده از بن تخفیف حتما نظر خود را‌ مجددا با کاربران دیگر در میان بگذارید.
      موفق باشید.

      • با عرض سلام مجدد و تشکر، شماتیک و کد رو در لینک زیر براتون آپلود نمودم:
        https://uploadfiles.io/x8l1x
        با اضافه کردن یک ماژول سوییچ ، کار راحتتره ، حدود شش ثانیه سوییچ رو گرفته، کل کارت ها پاک میشه و آماده وارد کردن مستر کارت و سایر کارت های جدید میشه.
        امیدوارم مفید بوده باشه و از سایت خوبتون هم تشکر میکنم.

        • سلام
          بابت ارسال فایل ممنونم.
          کدهای ارسالی بررسی شد. با توجه به اینکه کدهای شما با این آموزش کمی متفاوت است، هدف ما در طرح این پروژه ایجاد تغییر در کدهای آموزش و متفاوت بودن اجرای پروژه است. لطفا مجددا فایل را اصلاح و عینا همین کدهای آموزش را تغییر دهید. سپس از همین طریق ارسال نمایید.

      • لطفا آموزش را کامل مطالعه نمایید. در متن آموزش تیتر فراخوانی کتابخانه قرار دارد و کامل توضیح داده شده است. به کتابخانه rc522 نیاز دارید.

  • Arduino: 1.6.5 (Windows 7), Board: “Arduino Uno”

    C:\Users\Hr\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp: In constructor ‘MFRC522::MFRC522()’:
    C:\Users\Hr\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:16:33: error: ‘UINT8_MAX’ was not declared in this scope
    MFRC522::MFRC522(): MFRC522(SS, UINT8_MAX) { // SS is defined in pins_arduino.h, UINT8_MAX means there is no connection from Arduino to MFRC522’s reset and power down input
    ^
    C:\Users\Hr\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp: In member function ‘void MFRC522::PCD_Init()’:
    C:\Users\Hr\Documents\Arduino\libraries\MFRC522\src\MFRC522.cpp:201:28: error: ‘UINT8_MAX’ was not declared in this scope
    if (_resetPowerDownPin != UINT8_MAX) {
    ^
    Multiple libraries were found for “MFRC522.h”

    Used: C:\Users\Hr\Documents\Arduino\libraries\MFRC522

    Not used: C:\Program Files\Arduino\libraries\MFRC522-master

    Error compiling.

    This report would have more information with
    “Show verbose output during compilation”
    enabled in File > Preferences.

    • سلام
      همانطور که قبلا توضیح داده ام، ابتدا کتابخانه هر دو ماژول را در مسیر arduino /library کپی کنید. سپس کدها را به درستی و از طریق نوار سمت راست بالای کد در آردوینو کپی کنید.

  • سلام ممنون از اموزش خوبتون میخواستم بدونم آیا امکان استفاده از انگشتر های nfc که بر همین پایه تکنولوژی rfid کار میکنه قابلیت شناسایی توسط این ماژول داره؟

    • سلام
      از توجه شما ممنونم.
      این ماژول NFC نیست، ولی در کل با انواع تگ ها می‌توانید ارتباط برقرار کنید. انگشتر هم نوعی تگ می‌باشد.

  • با سلام
    خیلی ممنون از آموزش ها
    مشکلی داشتم..زمانی که برق اردوینو قطع شد و دوباره وصل شد در یک لحظه دستور به رله داده میشه و درب باز میشه و مشکل بعدی این که قفل از ۲۰ دقیقه rfidاز کار افتاده و نیازه یک باز برق اردوینو رو از اول وصل کنم تا دوباره بر گرده به روال اصلی

    • سلام
      در مورد سوال اول پیشنهاد این است، رله را برعکس به مدار اتصال دهید.
      در مورد سوال دوم هم اتصالات را کامل توضیح دهید.

  • سلام تشکر از سایت و آموزش های خوبتون
    می خواستم ببینم امکان راه اندازی ماژول rfid با نود رد رزبری پای هم هست
    اگه امکانش هست کمی توضیح بدهید .
    ممنون

    • سلام
      بله امکان پذیر است و باید از طریق سرویس IBM و ترکیب پایتون و نود رد میتوان طراحی و اجرا کرد. در خصوص توضیح این آموزش بسیار گسترده و مفصل است و امکان توضیح در کامنت ها وجود ندارد.

  • سلام این کد برای فعال کردن رله مناسب برای درب بازکن
    #include // We are going to read and write PICC’s UIDs from/to EEPROM
    #include // RC522 Module uses SPI protocol
    #include // Library for Mifare RC522 Devices

    #define COMMON_ANODE

    #ifdef COMMON_ANODE
    #define LED_ON LOW
    #define LED_OFF HIGH
    #else
    #define LED_ON HIGH
    #define LED_OFF LOW
    #endif

    #define redLed 7 // Set Led Pins
    #define greenLed 6
    #define blueLed 5

    #define relay 3 // Set Relay Pin
    #define wipeB 3 // Button pin for WipeMode, HOLD it then reset arduino for wipe mode.

    boolean match = false; // initialize card match to false
    boolean programMode = false; // initialize programming mode to false

    int successRead; // Variable integer to keep if we have Successful Read from Reader

    byte storedCard[4]; // Stores an ID read from EEPROM
    byte readCard[4]; // Stores scanned ID read from RFID Module
    byte masterCard[4]; // Stores master card’s ID read from EEPROM

    /*
    We need to define MFRC522’s pins and create instance
    Pin layout should be as follows (on Arduino Uno):
    MOSI: Pin 11 / ICSP-4
    MISO: Pin 12 / ICSP-1
    SCK : Pin 13 / ICSP-3
    SS : Pin 10 (Configurable)
    RST : Pin 9 (Configurable)
    look MFRC522 Library for
    other Arduinos’ pin configuration
    */

    #define SS_PIN 10
    #define RST_PIN 9
    MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.

    ///////////////////////////////////////// Setup ///////////////////////////////////
    void setup() {
    //Arduino Pin Configuration
    pinMode(redLed, OUTPUT);
    pinMode(greenLed, OUTPUT);
    pinMode(blueLed, OUTPUT);
    pinMode(wipeB, INPUT_PULLUP); // Enable pin’s pull up resistor
    pinMode(relay, OUTPUT);
    //Be careful how relay circuit behave on while resetting or power-cycling your Arduino
    digitalWrite(relay, HIGH); // Make sure door is locked
    digitalWrite(redLed, LED_OFF); // Make sure led is off
    digitalWrite(greenLed, LED_OFF); // Make sure led is off
    digitalWrite(blueLed, LED_OFF); // Make sure led is off

    //Protocol Configuration
    Serial.begin(9600); // Initialize serial communications with PC
    SPI.begin(); // MFRC522 Hardware uses SPI protocol
    mfrc522.PCD_Init(); // Initialize MFRC522 Hardware

    //If you set Antenna Gain to Max it will increase reading distance
    //mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);

    Serial.println(F(“BlueCore Tech Acces Control”)); // For debugging purposes
    ShowReaderDetails(); // Show details of PCD – MFRC522 Card Reader details

    //Wipe Code if Button Pressed while setup run (powered on) it wipes EEPROM
    if (digitalRead(wipeB) == LOW) { // when button pressed pin should get low, button connected to ground
    digitalWrite(redLed, LED_ON); // Red Led stays on to inform user we are going to wipe
    Serial.println(F(“Wipe Button Pressed”));
    Serial.println(F(“You have 5 seconds to Cancel”));
    Serial.println(F(“All records will be removed. This cannot be undone!”));
    delay(5000); // Give user enough time to cancel operation
    if (digitalRead(wipeB) == LOW) { // If button still be pressed, wipe EEPROM
    Serial.println(F(“CLEARING DATABASE”));
    for (int x = 0; x < EEPROM.length(); x = x + 1) { //Loop end of EEPROM address
    if (EEPROM.read(x) == 0) { //If EEPROM address 0
    // do nothing, already clear, go to the next address in order to save time and reduce writes to EEPROM
    }
    else {
    EEPROM.write(x, 0); // if not write 0 to clear, it takes 3.3mS
    }
    }
    Serial.println(F("DATABASE Successfully Wiped"));
    digitalWrite(redLed, LED_OFF); // visualize successful wipe
    delay(200);
    digitalWrite(redLed, LED_ON);
    delay(200);
    digitalWrite(redLed, LED_OFF);
    delay(200);
    digitalWrite(redLed, LED_ON);
    delay(200);
    digitalWrite(redLed, LED_OFF);
    }
    else {
    Serial.println(F("Wiping Cancelled"));
    digitalWrite(redLed, LED_OFF);
    }
    }
    // Check if master card defined, if not let user choose a master card
    // This also useful to just redefine Master Card
    // You can keep other EEPROM records just write other than 143 to EEPROM address 1
    // EEPROM address 1 should hold magical number which is '143'
    if (EEPROM.read(1) != 143) {
    Serial.println(F("No Master Card Set"));
    Serial.println(F("Scan A RFID Card to Set as Master Card"));
    do {
    successRead = getID(); // sets successRead to 1 when we get read from reader otherwise 0
    digitalWrite(blueLed, LED_ON); // Visualize Master Card need to be defined
    delay(200);
    digitalWrite(blueLed, LED_OFF);
    delay(200);
    }
    while (!successRead); // Program will not go further while you not get a successful read
    for ( int j = 0; j < 4; j++ ) { // Loop 4 times
    EEPROM.write( 2 + j, readCard[j] ); // Write scanned PICC's UID to EEPROM, start from address 3
    }
    EEPROM.write(1, 143); // Write to EEPROM we defined Master Card.
    Serial.println(F("Master Card Set"));
    }
    Serial.println(F("——————-"));
    Serial.println(F("Master Card's UID = "));
    for ( int i = 0; i < 4; i++ ) { // Read Master Card's UID from EEPROM
    masterCard[i] = EEPROM.read(2 + i); // Write it to masterCard
    Serial.print(masterCard[i], HEX);
    }
    Serial.println("");
    Serial.println(F("——————-"));
    Serial.println(F("Everything Ready"));
    Serial.println(F("Waiting for Keys or cards to be scanned"));
    cycleLeds(); // Everything ready lets give user some feedback by cycling leds
    }

    ///////////////////////////////////////// Main Loop ///////////////////////////////////
    void loop () {
    do {
    successRead = getID(); // sets successRead to 1 when we get read from reader otherwise 0
    if (programMode) {
    cycleLeds(); // Program Mode cycles through RGB waiting to read a new card
    }
    else {
    normalModeOn(); // Normal mode, blue Power LED is on, all others are off
    }
    }
    while (!successRead); //the program will not go further while you not get a successful read
    if (programMode) {
    if ( isMaster(readCard) ) { //If master card scanned again exit program mode
    Serial.println(F("Master Card Scanned"));
    Serial.println(F("Exiting Programming Mode"));
    Serial.println(F("—————————–"));
    programMode = false;
    return;
    }
    else {
    if ( findID(readCard) ) { // If scanned card is known delete it
    Serial.println(F("I know this key, removing…"));
    deleteID(readCard);
    Serial.println("—————————–");
    }
    else { // If scanned card is not known add it
    Serial.println(F("I do not know this key, adding…"));
    writeID(readCard);
    Serial.println(F("—————————–"));
    }
    }
    }
    else {
    if ( isMaster(readCard) ) { // If scanned card's ID matches Master Card's ID enter program mode
    programMode = true;
    Serial.println(F("Hello Master – Entered Programming Mode"));
    int count = EEPROM.read(0); // Read the first Byte of EEPROM that
    Serial.print(F("I have ")); // stores the number of ID's in EEPROM
    Serial.print(count);
    Serial.print(F(" record(s) in DATABASE"));
    Serial.println("");
    Serial.println(F("Scan a Card or key to ADD or REMOVE"));
    Serial.println(F("—————————–"));
    }
    else {
    if ( findID(readCard) ) { // If not, see if the card is in the EEPROM
    Serial.println(F("Welcome, Acces Granted"));
    granted(300); // Open the door lock for 300 ms
    }
    else { // If not, show that the ID was not valid
    Serial.println(F("Acces Denied!"));
    denied();
    }
    }
    }
    }

    ///////////////////////////////////////// Access Granted ///////////////////////////////////
    void granted (int setDelay) {
    digitalWrite(blueLed, LED_OFF); // Turn off blue LED
    digitalWrite(redLed, LED_OFF); // Turn off red LED
    digitalWrite(greenLed, LED_ON); // Turn on green LED
    digitalWrite(relay, LOW); // Unlock door!
    delay(3000); // Hold door lock open for given seconds
    digitalWrite(relay, HIGH); // Relock door
    delay(1000); // Hold green LED on for a second
    }

    ///////////////////////////////////////// Access Denied ///////////////////////////////////
    void denied() {
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    digitalWrite(redLed, LED_ON); // Turn on red LED
    delay(1000);
    }

    ///////////////////////////////////////// Get PICC's UID ///////////////////////////////////
    int getID() {
    // Getting ready for Reading PICCs
    if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
    return 0;
    }
    if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
    return 0;
    }
    // There are Mifare PICCs which have 4 byte or 7 byte UID care if you use 7 byte PICC
    // I think we should assume every PICC as they have 4 byte UID
    // Until we support 7 byte PICCs
    Serial.println(F("Scanned KEY's UID:"));
    for (int i = 0; i < 4; i++) { //
    readCard[i] = mfrc522.uid.uidByte[i];
    Serial.print(readCard[i], HEX);
    }
    Serial.println("");
    mfrc522.PICC_HaltA(); // Stop reading
    return 1;
    }

    void ShowReaderDetails() {
    // Get the MFRC522 software version
    byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg);
    Serial.print(F("MFRC522 Version: 0x"));
    Serial.print(v, HEX);
    if (v == 0x91)
    Serial.print(F(" = v1.0"));
    else if (v == 0x11)
    Serial.print(F(" = BlueCore Tech. RFID Acces v2.0"));
    else
    Serial.print(F(" (unknown)"));
    Serial.println("");
    // When 0x00 or 0xFF is returned, communication probably failed
    if ((v == 0x00) || (v == 0xFF)) {
    Serial.println(F("WARNING: Communication failure, is the RFID-MFRC522 properly connected?"));
    while(true); // do not go further
    }
    }

    ///////////////////////////////////////// Cycle Leds (Program Mode) ///////////////////////////////////
    void cycleLeds() {
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_ON); // Make sure green LED is on
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    delay(200);
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
    delay(200);
    digitalWrite(redLed, LED_ON); // Make sure red LED is on
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    delay(200);
    }

    //////////////////////////////////////// Normal Mode Led ///////////////////////////////////
    void normalModeOn () {
    digitalWrite(blueLed, LED_ON); // Blue LED ON and ready to read card
    digitalWrite(redLed, LED_OFF); // Make sure Red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure Green LED is off
    digitalWrite(relay, HIGH); // Make sure Door is Locked
    }

    //////////////////////////////////////// Read an ID from EEPROM //////////////////////////////
    void readID( int number ) {
    int start = (number * 4 ) + 2; // Figure out starting position
    for ( int i = 0; i < 4; i++ ) { // Loop 4 times to get the 4 Bytes
    storedCard[i] = EEPROM.read(start + i); // Assign values read from EEPROM to array
    }
    }

    ///////////////////////////////////////// Add ID to EEPROM ///////////////////////////////////
    void writeID( byte a[] ) {
    if ( !findID( a ) ) { // Before we write to the EEPROM, check to see if we have seen this card before!
    int num = EEPROM.read(0); // Get the numer of used spaces, position 0 stores the number of ID cards
    int start = ( num * 4 ) + 6; // Figure out where the next slot starts
    num++; // Increment the counter by one
    EEPROM.write( 0, num ); // Write the new count to the counter
    for ( int j = 0; j < 4; j++ ) { // Loop 4 times
    EEPROM.write( start + j, a[j] ); // Write the array values to EEPROM in the right position
    }
    successWrite();
    Serial.println(F("Succesfully added ID record to DATABASE"));
    }
    else {
    failedWrite();
    Serial.println(F("Failed! There is something wrong with ID or bad DATABASE"));
    }
    }

    ///////////////////////////////////////// Remove ID from EEPROM ///////////////////////////////////
    void deleteID( byte a[] ) {
    if ( !findID( a ) ) { // Before we delete from the EEPROM, check to see if we have this card!
    failedWrite(); // If not
    Serial.println(F("Failed! There is something wrong with ID or bad DATABASE"));
    }
    else {
    int num = EEPROM.read(0); // Get the numer of used spaces, position 0 stores the number of ID cards
    int slot; // Figure out the slot number of the card
    int start; // = ( num * 4 ) + 6; // Figure out where the next slot starts
    int looping; // The number of times the loop repeats
    int j;
    int count = EEPROM.read(0); // Read the first Byte of EEPROM that stores number of cards
    slot = findIDSLOT( a ); // Figure out the slot number of the card to delete
    start = (slot * 4) + 2;
    looping = ((num – slot) * 4);
    num–; // Decrement the counter by one
    EEPROM.write( 0, num ); // Write the new count to the counter
    for ( j = 0; j < looping; j++ ) { // Loop the card shift times
    EEPROM.write( start + j, EEPROM.read(start + 4 + j)); // Shift the array values to 4 places earlier in the EEPROM
    }
    for ( int k = 0; k < 4; k++ ) { // Shifting loop
    EEPROM.write( start + j + k, 0);
    }
    successDelete();
    Serial.println(F("Succesfully removed ID record from DATABASE"));
    }
    }

    ///////////////////////////////////////// Check Bytes ///////////////////////////////////
    boolean checkTwo ( byte a[], byte b[] ) {
    if ( a[0] != NULL ) // Make sure there is something in the array first
    match = true; // Assume they match at first
    for ( int k = 0; k < 4; k++ ) { // Loop 4 times
    if ( a[k] != b[k] ) // IF a != b then set match = false, one fails, all fail
    match = false;
    }
    if ( match ) { // Check to see if if match is still true
    return true; // Return true
    }
    else {
    return false; // Return false
    }
    }

    ///////////////////////////////////////// Find Slot ///////////////////////////////////
    int findIDSLOT( byte find[] ) {
    int count = EEPROM.read(0); // Read the first Byte of EEPROM that
    for ( int i = 1; i <= count; i++ ) { // Loop once for each EEPROM entry
    readID(i); // Read an ID from EEPROM, it is stored in storedCard[4]
    if ( checkTwo( find, storedCard ) ) { // Check to see if the storedCard read from EEPROM
    // is the same as the find[] ID card passed
    return i; // The slot number of the card
    break; // Stop looking we found it
    }
    }
    }

    ///////////////////////////////////////// Find ID From EEPROM ///////////////////////////////////
    boolean findID( byte find[] ) {
    int count = EEPROM.read(0); // Read the first Byte of EEPROM that
    for ( int i = 1; i <= count; i++ ) { // Loop once for each EEPROM entry
    readID(i); // Read an ID from EEPROM, it is stored in storedCard[4]
    if ( checkTwo( find, storedCard ) ) { // Check to see if the storedCard read from EEPROM
    return true;
    break; // Stop looking we found it
    }
    else { // If not, return false
    }
    }
    return false;
    }

    ///////////////////////////////////////// Write Success to EEPROM ///////////////////////////////////
    // Flashes the green LED 3 times to indicate a successful write to EEPROM
    void successWrite() {
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is on
    delay(200);
    digitalWrite(greenLed, LED_ON); // Make sure green LED is on
    delay(200);
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    delay(200);
    digitalWrite(greenLed, LED_ON); // Make sure green LED is on
    delay(200);
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    delay(200);
    digitalWrite(greenLed, LED_ON); // Make sure green LED is on
    delay(200);
    }

    ///////////////////////////////////////// Write Failed to EEPROM ///////////////////////////////////
    // Flashes the red LED 3 times to indicate a failed write to EEPROM
    void failedWrite() {
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    delay(200);
    digitalWrite(redLed, LED_ON); // Make sure red LED is on
    delay(200);
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    delay(200);
    digitalWrite(redLed, LED_ON); // Make sure red LED is on
    delay(200);
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    delay(200);
    digitalWrite(redLed, LED_ON); // Make sure red LED is on
    delay(200);
    }

    ///////////////////////////////////////// Success Remove UID From EEPROM ///////////////////////////////////
    // Flashes the blue LED 3 times to indicate a success delete to EEPROM
    void successDelete() {
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    delay(200);
    digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
    delay(200);
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    delay(200);
    digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
    delay(200);
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    delay(200);
    digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
    delay(200);
    }

    ////////////////////// Check readCard IF is masterCard ///////////////////////////////////
    // Check to see if the ID passed is the master programing card
    boolean isMaster( byte test[] ) {
    if ( checkTwo( test, masterCard ) )
    return true;
    else
    return false;
    }

    این کتاب خانه نصب کنید
    http://s8.picofile.com/file/8315141250/RFID_RC522_DOOR_ACCES_CONTROL.zip.html

    • با سلام
      کاربر گرامی، هدف از تعریف پروژه ارتقاء سطح دانش عملی شماست، نه که شما به سادگی موضوع را سرچ کنید و کپی پیست کنید. اگر دقت بفرمایید دربالاترهم کاربر دیگری عینا همین کدها را ارسال کرده است. ولی در پاسخ به ایشان اعلام شده که غیر قابل قبول است. لطفا جهت دریافت کد تخفیف، کدهای پروژه را با توجه به کدهای آموزش توسعه دهید و کامنت گذاری های لازم هم انجام دهید. سپس در یک فایل متنی آپلود و لینک مربوطه را ارسال کنید. از اینکه به قوانین احترام می‌گذارید از شما تشکر می‌کنیم.

        • دقیقا متوجه منظور شما نشدم. در این آموزش از تگ های RFID استفاده شده و لینک هم در وسایل مورد نیاز درج شده است.

      • سلام بعد از چند بار که از تگ استفاده میکنم دیگه تگ هارو نمیخونه و اردینو ریست میکنم خوب میشه مشکلش چیه ؟

          • Arduino: 1.8.5 (Windows 10), Board: “Arduino/Genuino Uno”

            C:\Users\Mahdi hrb\Documents\Arduino\sketch_jan17c\sketch_jan17c.ino:1:22: warning: extra tokens at end of #include directive

            #include .// ط§ط² ط·ط±غŒظ‚ ع©طھط§ط¨ط®ط§ظ†ظ‡ EEPROM ط¢غŒ ط¯غŒ غŒظˆظ†غŒع© ع©ط§ط±طھ ظˆ طھع¯ ظ‡ط§غŒ RFID ط±ط§ ظ…غŒط®ظˆط§ظ†غŒظ…

            ^

            C:\Users\Mahdi hrb\Documents\Arduino\sketch_jan17c\sketch_jan17c.ino: In function ‘void setup()’:

            sketch_jan17c:58: error: ‘class MFRC522’ has no member named ‘PCD_Init’

            mfrc522.PCD_Init(); // ظ…ظ‚ط¯ط§ط± ط¯ظ‡غŒ ط§ظˆظ„غŒظ‡ ط³ط®طھ ط§ظپط²ط§ط± MFRC522

            ^

            sketch_jan17c:59: error: ‘class MFRC522’ has no member named ‘PCD_SetAntennaGain’

            mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max); //ط³طھ ع©ط±ط¯ظ† ط¢ظ†طھظ† ط¨ط±ط§غŒ ظ…ط§عکظˆظ„ RFID ط¬ظ‡طھ ط§ظپط²ط§غŒط´ ط¨ط±ط¯ ع¯غŒط±ظ†ط¯ظ‡ ع©ظ‡ ط¯ط± ط§غŒظ† ط¢ظ…ظˆط²ط´ ط¨ظ‡ ط§غŒظ† ظ…ظˆط¶ظˆط¹ ظ†ظ…غŒظ¾ط±ط¯ط§ط²غŒظ….

            ^

            sketch_jan17c:59: error: ‘class MFRC522’ has no member named ‘RxGain_max’

            mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max); //ط³طھ ع©ط±ط¯ظ† ط¢ظ†طھظ† ط¨ط±ط§غŒ ظ…ط§عکظˆظ„ RFID ط¬ظ‡طھ ط§ظپط²ط§غŒط´ ط¨ط±ط¯ ع¯غŒط±ظ†ط¯ظ‡ ع©ظ‡ ط¯ط± ط§غŒظ† ط¢ظ…ظˆط²ط´ ط¨ظ‡ ط§غŒظ† ظ…ظˆط¶ظˆط¹ ظ†ظ…غŒظ¾ط±ط¯ط§ط²غŒظ….

            ^

            C:\Users\Mahdi hrb\Documents\Arduino\sketch_jan17c\sketch_jan17c.ino: In function ‘int getID()’:

            sketch_jan17c:152: error: ‘class MFRC522’ has no member named ‘PICC_IsNewCardPresent’

            if ( ! mfrc522.PICC_IsNewCardPresent()) { //ط§ع¯ط± غŒع© PICC ط¬ط¯غŒط¯ ط¨ظ‡ RFID ظ…ط¹ط±ظپغŒ ط´ط¯طŒ ط§ط¯ط§ظ…ظ‡ ظ…غŒط¯ظ‡ط¯.

            ^

            sketch_jan17c:155: error: ‘class MFRC522’ has no member named ‘PICC_ReadCardSerial’

            if ( ! mfrc522.PICC_ReadCardSerial()) {

            ^

            sketch_jan17c:163: error: ‘class MFRC522’ has no member named ‘uid’

            readCard[i] = mfrc522.uid.uidByte[i];

            ^

            sketch_jan17c:167: error: ‘class MFRC522’ has no member named ‘PICC_HaltA’

            mfrc522.PICC_HaltA(); // طھظˆظ‚ظپ ط®ظˆط§ظ†ط¯ظ† ع©ط§ط±طھ

            ^

            C:\Users\Mahdi hrb\Documents\Arduino\sketch_jan17c\sketch_jan17c.ino: In function ‘boolean checkTwo(byte*, byte*)’:

            C:\Users\Mahdi hrb\Documents\Arduino\sketch_jan17c\sketch_jan17c.ino:248:16: warning: NULL used in arithmetic [-Wpointer-arith]

            if ( a[0] != NULL )

            ^

            Multiple libraries were found for “MFRC522.h”
            Used: C:\Users\Mahdi hrb\Documents\Arduino\libraries\MFRC522-master
            Not used: C:\Users\Mahdi hrb\Documents\Arduino\libraries\rfid-master
            Not used: C:\Users\Mahdi hrb\Documents\Arduino\libraries\MFRC522-1.3.6
            exit status 1
            ‘class MFRC522’ has no member named ‘PCD_Init’

            This report would have more information with
            “Show verbose output during compilation”
            option enabled in File -> Preferences.
            مشکلش چیه کد هم با کلید دستوری زدم

            • سلام
              کدها به درستی کپی نشده است و ارور کتابخانه MFRC522 در برنامه وجود دارد. مجددا کتابخانه را بررسی و کدها را کپی کنید.

    • سلام
      در این مورد منتظر انتشار آموزش های بعدی RFID باشید، کامل به این موضوع خواهیم پرداخت.

  • سلام خسته نباشید
    میخواستم یک کارت rfidاز قبل کد خورده برای یک مکانی رو کپی کنم بر روی یک یا چند کارت دیگر چگونه میتوانم این کار را انجام دهم
    ممنون از شما

    • سلام
      در ابتدا باید مشخص گردد که کارت شما Read یا Write است و این موضوع بستگی به کد استفاده شده دارد و ممکن است اطلاعات به صورت هش شده روی کارت قرار گرفته شده باشد که در اینصورت غیرممکن است.

      • میشه بیشتر در مورد کپی کردن یه تگ روی چن تگ دیگه توضیح بدین؟من ی تگrfidدارم ک میخوام رو چند تا تگ دیگه کپی ش کنم,تگ مورد نظرم تو مشخصات کلی قابلیت خوندن و نوشتن داره,تگ هایی ک میخوام روشون کپی کنم هم همینطور,چطور میشه اینکارو انجام بدم,تگ موردنظرم قراره از دسترس خارج بشه و من میخوام ی جایگزین براش تو سیستم داشته باشم,ب کارتخوان هم دسترسی ندارم

        • با سلام
          در این خصوص برخی از تگ‌ها هستند که چنین قابلیتی را دارند. ولی کل این موضوع از زمنیه فعالیت دیجی اسپارک خارج است. اطلاعاتی برای راه حل این موارد وجود ندارد.

  • سلام ببخشید من میخوام یه قفل در با استفاده از rfid بسازم که توی اون با تعریف یه کارت مستر بشه از اون طریق کارت ها رو اضافه یا حذف کرد. میشه لطف کنید بگید که برای پیاده سازی این قفل به طور کامل به چه قطعاتی احتیاج هست؟ و چند تا سوال دیگه اینکه:
    ۱- آیا باید محدوده فرکانسی تگ و ریدر حتما یکی باشه و اگر نه تاچه حد میتونن با هم متفاوت باشن؟ و اینکه توی یه قفل همه تگ ها باید یه شکل باشن مثلا همه کارت باشن؟ نمیشه که یکی کارت باشه یکی دستبند و…؟
    ۲-اینکه توی پستتون نوشتین کارت با قابلیت خواندن و نوشتن دقیقا کجا تعریف میشه و آیا همه کارتها باید از این نوع باشن یا فقط مستر کارت از این نوع و بقیه از نوع فقط خواندنی؟
    ۳-برای ارتباط با یک رله باید چیکارکنم؟ و آیا رله ها انواع مختلفی دارن؟ واگه بخوام به این رله یک قفل وصل کنم باید از قفل و رله خاصی استفاده کنم؟ .نیاز به وسیله خاص دیگه ای هم هست؟
    ۴- همه این قطعه ها رو میشه گذاشت روی برد بورد؟
    ۵- اگه بخوام از طریق یه برنامه اندروید هم برد رو کنترل کنم از چه ماژولهایی باید استفاده کنم؟

    • سلام
      در ابتدا باید منتظر انتشار آموزش های بعدی RFID باشید تا کاملا آموزش داده شود. سوالات شما بسیار کلی است و برای اجرای عملی پروژه منتظر آموزش کامل باید باشید.
      در خصوص شوال اول ماژول RFID در محدوده فرکانسی ۱۳٫۵۶ مگاهرتز قابلیت خواندن و نوشتن بر روی تگ‌ها را دارا می باشد و میتوانید از تگ و کارت های ۱۲۵khz استفاده کنید. سوال دوم هم میتوانید از تگ و کارت استفاده کنید محدودیتی وجود ندارد و اینکه با توجه به سوال های شما مشخص است که تا به حال با ماژول RFID کار نکرده اید و هیچ اطلاعاتی از آن ندارید. پیشنهاد میشود در ابتدا آموزش های rfid منتشر شده در سایت را مطالعه نمایید. سپس شروع به اجرای پروژه های پیچیده تر کنید. برای اتصال رله باید در کدها رله را تعریف کنید و سپس به عنوان یکی از خروجی های آردوینو تعریف کنید. درخصوص سوال ۴ هم بله حتی میتوانید از شیلد پروتوتایپ استفاده کنید و روی آردوینو قرار دهید. و در نهایت برای سوال آخر باید منتظر انتشار پروژه ها باشید چون در کامنت ها نمیتوان توضیحات جامع داد.
      ازتوجه شما ممنونم.

      • سلام ممنون از آموزش خوبتون. من تمام اتصالات رو انجام دادم و دقیقا همین کد رو کپی کردم ولی مشکلی که وجود داره اینه که ماژول rc522 من فقط با تگ هایی که همراه خودش بوده کار میکنه. یعنی من یه سری تگ دیگه که فقط خواندن هستند و فرکانس ۱۲۵ کیلو هرتز دارن تهیه کردم ولی توی هیچکدوم از کدهای قرار داده شده در سایت این تگ ها رو نمیخونه یعنی وقتی اونها رو جلوی ماژول میگیرم هیچ عکس العملی نشون نمیده. میخواستم بدونم چرا؟
        چندتا سوال دیگه هم داشتم:
        ۱- اگر بخوام تگ ها رو بدون وجودشون حذف کنم چطور باید این کار رو بکنم؟منظورم اینه که اگه یه تگ گم بشه و بخوام اون رو از لیست تگ های مجاز حذف کنم چطور میتونم این کار رو انجام بدم؟
        ۲- برای اینکه امکان تعریف کردن چند مستر رو اضافه کنم باید چه تغییری توی اون قسمت که مربوط به جلوگیری از این کاره ایجاد کنم؟
        ۳- برای ایجاد امکان تغییر مستر باید چیکار کنم؟ منظورم اینه که اگر کارت مستر گم بشه یا لازم بشه که مستر جدید به جای قبلی تعریف بشه.
        ممنون از راهنماییتون.
        اگر ممکنه و میشه در صورتیکه نمیتونید پاسخ سوالاتم رو کامل بدید یا لازمه که منتظر آموزش های بعدی باشم یه منبع برای پیدا کردن جواب سوالاتم بهم معرفی کنید. ممنون

        • سلام
          از توجه شما ممنونم.
          در خصوص سوال اول، فرکانس تگ RFID با ماژول RFID متفاوت است و باید فرکانس هر دو یکسان باشد.
          ۱: هیچ غیر ممکنی وجود ندارد و با توجه به اینکه در حافظه EEPROM ذخیره می‌شود، ممکن است بتوانید با دانستن کد تگ آن را از حافظه پاک کرد.
          ۲: در این کد امکان پذیر نیست و باید تغییرات گسترده ای ایجاد کنید.
          ۳: باید کل سیستم را رفرش کنید و مجددا تعریف کنید.

          • ممنون. ولی هم در متن آموزش و هم در پرسش قبلی من شما گفتید که باید از کارتهای فقط خواندن ۱۲۵ کیلوهرتز استفاده بشه. یعنی هیچ راهی وجود نداره؟

              • ممنونم. من کدهای این آموزش رو هم کپی کردم و در اون هم فقط تگ و کارت همراه ماژول رو میخونه. اصلا تگها فقط خواندن رو نمیخونه. برای اینکه این تگها رو بخونه لازمه که از ماژول دیگه ای استفاده بشه؟ من توی چندتا فروشگاه اینترنتی و غیر اینترنتی گشتم ولی نتونستم مشابه تگهای همراه ماژول rc522 پیدا کنم. توی سایت خودتون هست؟

  • سلام . مستر کارت در واقع همان RFID هستند مثل حالت قبل که شناسه های RFID رو نمایش میداد ؟ در واقع همون حالت قبل هست که کارت های RFID رو میخونه که در برنامه نویسی آن را تعریف کردیم ؟ به عنوان سیستم حضور و غیاب می توان در نظر گرفت با کارت های RFID این پرژه رو ؟ اگه بخوایم این پروژه به اینترنت هم متصل بشه باید از چه ماژول و اتصالاتی استفاده کنیم ؟

    • سلام
      منطور از مستر کارت در واقع همان کارت ارشد است که به عنوان کارت اصلی در برنامه تعریف می‌شود. توسط مستر کارت یا همان کارت ارشد، کارت های زیر شاخه تعریف می‌شوند. اجازه ورود و عدم ورود کارت ها دیگر توسط مستر کارت صادر خواهد شد. همانطور که خودتان اشاره کردید برای سیستم حضور و غیاب می‌توان از این پروژه استفاده کرد. در ابتدا مستر کارت را معرفی میکنیم و در نهایت کارت های زیر شاخه را تعریف خواهیم کرد. در خصوص سوال دوم هم اتصال پروژه RFID به اینترنت بی ربط است ولی اگر شما بخواهید دیتا ها را از طریق اینترنت لاگ کنید، در این صورت باید از ماژول های WIFI و یا اترنت استفاده کنید. با این وجود این روش بسیار پیجیده است و نیاز به تخصص کافی خواهد داشت.

      • سلام . ممنون
        راه دیگه ای به غیر از وصل شدن به لپ تاب به غیر USB هست ؟ باید از چه نوع ماژول استفاده کنیم ؟ میتونید بیشتر راهنمایی کنید ؟
        برای خرید بورد از همان لینک برد شیشه ای رو خریداری کنیم ؟ برای LED چه نوع LED رو باید تهیه کنم؟

        • سلام مجدد
          پس از کامپایل برنامه می‌توانید از آداپتور و یا باطری برای تامین برق مورد نیاز آردوینو استفاده کنید.
          برای اتصال قطعات هم از برد بورد و یا شیلد پروتوتایپ آردوینو به دلخواه می‌توانید استفاده کنید.
          شیلد پروتوتایپ به صورت شیلد بر روی برد آردوینو قرار می‌گیرد و یک برد بورد بر روی آن قرار دارد، توسط آن می‌توانید ماژول RFID و ال ای دی ها را روی شیبد قرار دهید. تنها مزیت شیلد در این است که ۵ پایه مجزا GND و ۵ ولت بر روی آن قرار دارد. همچنین اتصال ماژول ها به شیلد فضای کمتری را در اختیار می‌گیرد. طبق فیلم و آموزش از بردبورد هم می‌توانید استفاده کنید.
          در خصوص ال ای دی هم تفاوتی ندارد. ال ای دی های متفاوتی در فروشگاه موجود است که به دلخواه می‌توانید خرید کنید. لینک چند مدل ال ای دی و شیلد پروتوتایپ را قرار میدهم تا بتوانید بررسی و خرید کنید.

          ال ای دی ۵ میلی متری RGB با ۴ پایه
          ال ای دی ۵ میلی متری هفت رنگ دو پایه
          ال ای دی اوال OVAL
          شیلد پروتوتایپ آردوینو

          برد بورد

            • در خصوص اتصال به اینترنت در کامنت قبل توضیح دادم.
              برای اتصال LED در متن آموزش در قسمت چرخه ال ای دی – اتصالات کامل توضیح داده ام. در این آموزش از سه ال ای دی آبی، سبز و قرمز استفاده شده است که به ترتیب به پایه های ۵،۶،۷ دیجیتال آردوینو وصل شده است. اتصال ال ای دی هم به این گونه است که دو پایه کوتاه و بلند دارد. پایه کوتاه پایه منفی است و به GND آردوینو متصل می‌شود و پایه بلند همان پایه سیگنال است که طبق تعریف کدها به یکی از پایه های دیجیتال وصل خواهد شد. اتصالات را انجام دهید و در صورت برخورد به مشکل مجددا از همین طریق اقدام نمایید تا راهنمایی کنم.

            • خواهش میکنم.
              موارد گفته شده را چک کنید. سپس در صورت بروز مشکل اعلام کنید تا راهنمایی کنم.

  • سلام ،ممنون.
    وسایل مورد نیاز مثل اتصالات و همان قطعاتی که در آموزش خواندن کدهای تگ RFID با ماژول Rc522 و آردوینو Aruino بود هست ؟ کارت ها و تگ های RFID که استفاده میکنیم در سیستم حضور و غیاب با نوع قبلی فرق دارند ؟ من یک سری کارت و تگ از این سایت خریداری کردم ولی فقط تگ و کارتی در ماژول RFID خوان بود رو میخوند . واینکه به جای چراغ چشمک زدن که با LED وصل کردید میتونیم از LCD استفاده کنیم ؟ اتصالات به چه صورت هست ؟
    درمورد اتصال به اینترنت من از قسمت آموزش کار با اینترنت اشیا W5100 ، را دیدم می خواستم این رو روی قسمت آموزش RFID ورود به سیستم با مستر کارت پیدا سازی کنم ، چنین چیزی امکان پذیر هست ؟ پورت های آردوینو با اتصالات قبلی که با ماژول rfid خوان بوده پر شده ، چه طور باید این اتصالات رو برقرار کنیم ؟ ممنون میشم اگه راهنمایی کنید .

    • سلام مجدد
      تمامی وسایل مورد نیاز در متن آموزش لینک شده است و در این دو پروژه RFID یکسان هستند. به احتمال زیاد تگی که شما خریداری کرده اید، تنها قابلیت READ دارد. که برای آن نیاز به کدی مجزا است. در هر محصول اطلاعات کامل آن درج شده است حتما دقت کنید.
      سوال بعدی هم بله اتصال به ال سی دی امکان پذیر است. تنها باید ال سی دی را در کد برنامه فراخوانی کنید. در این خصوص آموزش کامل راه اندازی ال سی دی و فراخوانی آن در کدهای دیگر در یک آموزش جداگانه کاملا توضیح دادم. پیشنهاد می‌شود در ابتدا آموزش راه اندازی ال سی دی کاراکتری را مطالعه نمایید و طبق دستورات گفته شده کدهای ال سی دی را به کد RFID تعمیم دهید.
      منظور شما را از اتصال به این اینترنت متوجه نمیشوم. در یکی از کامنت های قبلی هم توضیح دادم. در صورتی که بخواهید دیتا از طریق اینترنت برای شما ارسال گردد، می‌توانید از ماژول های ESP و اترنت استفاده کنید که این مورد نیاز به تخصص کافی خواهد داشت و بسیار پیچیده خواهد بود.

  • سلام ،توضیحات شما به من خیلی کمک میکنه . ممنون از لطف شما
    وسایل مورد نیاز مثل اتصالات و همان قطعاتی که در آموزش خواندن کدهای تگ RFID با ماژول Rc522 و آردوینو Aruino بود هست ؟ کارت ها و تگ های RFID که استفاده میکنیم در سیستم حضور و غیاب با نوع قبلی فرق دارند ؟ من یک سری کارت و تگ از این سایت خریداری کردم ولی فقط تگ و کارتی در ماژول RFID خوان بود رو میخوند . واینکه به جای چراغ چشمک زدن که با LED وصل کردید میتونیم از LCD استفاده کنیم ؟ اتصالات به چه صورت هست ؟
    درمورد اتصال به اینترنت من از قسمت آموزش کار با اینترنت اشیا W5100 ، را دیدم می خواستم این رو روی قسمت آموزش RFID ورود به سیستم با مستر کارت پیدا سازی کنم ، چنین چیزی امکان پذیر هست ؟ پورت های آردوینو با اتصالات قبلی که با ماژول rfid خوان بوده پر شده ، چه طور باید این اتصالات رو برقرار کنیم ؟ ممنون میشم اگه راهنمایی کنید .

    • سلام
      در کامنت قبل توضیح داده ام. دقت کنید که پاسخگویی به کامنت ها نیازمند صبر و شکیبایی است. تعداد کامنت ها بسیار زیاد است و به ترتیب پاسخ داده خواهد شد.

    • سلام
      در چرخه اصلی RFID امکان حذف مستر کارت وجود ندارد ولی می‌توانید آن را تغییر دهید.

      • آخه مشکل من اینه که من یک کارتی رو در اختیار دارم که این کارت رو در خیلی جاها تعریف کرده ام.
        در این مدار هم من اشتباها یک کارت دیگر رو به عنوان مستر کارت تعریف کردم.
        حالا چند بار برنامه رو از اول آپلود کردم ، آردوینو رو ریست کرم و… اما برنامه به حالت اولیه بر نمیگرده.
        کاری هست که بتونم انجام بدم تا مدار به حالت اولیه برگرده؟

        • راستی اگر ممکنه یک برنامه صحیح برای فعال کردن رله با این ماژول به من معرفی کنید.
          خیلی تلاش کردم تا اینکه خسته شدم.ممنون

          • در این خصوص منتظر انتشار بخش بعدی آموزش RFID باشید. به زودی منتشر خواهد شد.

        • سلام مجدد
          برای اینکار باید حافظه EEPROM راپاک کنید و مجددا کارت و تگ را تعریف کنید که نیاز به تغییر کد دارد. در بخش بعدی آموزش RFID به این موضوع خواهیم پرداخت.

  • سلام ، برای اینکه یک سری از کارت ها توسط RFID خوانده شود که یک سری قبلا باید در برنامه تعریف شده باشد تا سیستم آن را شناسایی کند ، برای اینکه کد های RFID را وارد کنیم تا سیستم آن را شناسایی کند باید از کدام قسمت کد برنامه آن را تغییر دهیم . ببخشید من مطالعه کردم متوجه نشدم .

    • سلام
      دقت کنید که در این برنامه نمی‌توانید تغییرات گفته شده را اعمال کنید. برای اینکار نیاز به تعریف کد جداگانه برای شناسایی تگ RFID خواهد بود. در آموزش های بعدی RFID به این موضوع خواهیم پرداخت.

  • ممنون, یعنی اگه همین پروژه ای که شما انجام دادی رو انجام بدم, کارت ها و تگ ها رو شناسایی نمیکنه یعنی مشخص نمیکنه که کدوم ها اجازه ورود دارند و یا ندارند, مدار رو بستم فقط کارت و تگ نداشتم که ببینم درست انجام دادم یا نه. مرسی از راهنماییتون

    • سلام مجدد
      در این آموزش اگر از کارت و تگ با قابلیت خواندن و نوشتن استفاده کنید، تمامی آن ها شناسایی خواهد شد. پس از آپلود برنامه باید از طریق سریال مانیتور مراحل را پیش بروید . پس از آپلود برنامه با انتخاب یکی از کارت ها به عنوان کارت ارشد یا همان مستر کارت ، کارت خوانده شده و به عنوان کارت ارشد تعریف می‌شود و سپس در سریال مانیتور هم متنی به عنوان تشخیص کارت ارشد نمایش داده می‌شود. برای تعریف تگ های زیر شاخه هم به همین صورت است و با هر بار نزدیک کردن تگ به ماژول ، تعریف شده و در سریال مانیتور نمایش داده می‌شود. در هنگام خرید ماژول RFID در آن یک کارت و یک تگ وجود دارد که قابلیت read و write دارند و برای استفاده در این آموزش پیشنهاد می‌شود.

  • سلام و وقت شما به خیر, من در مورد وصل ال ای دی اشکال دارم, ببخشید در مورد اتصالات به بورد شیشه ای پایه کوتاه تر به قسمت منفی وصل هست و پایه ی مثبت به j و سیم مربوطه نیز که برای اتصال به برد آردوینو هست به چه شکل به برد و پایه های ال ای دی در بورد متصل هست ؟

    • سلام
      لطفا سوال خود را واضح ار بیان کنید تا بتوانم دقیق تر راهنمایی کنم.
      برد بورد دارای دو ردیف GND و ۵ ولت است. همچنین ال ای دی اگر دو پایه باشد، پایه بلند پابه سیگنال و یا تغذیه ۵ ولت است و به پایه تغذیه ۵ ولت آردوینو متصل می‌شود. پایه کوتاه ال ای دی هم به پایه GND زمین برد بورد متصل خواهد شد.
      منظورتان از سیم مربوط برای اتصال به برد آردوینو همان کابل شیلد است؟

      • ببخشید من تا به حال با این بورد کار نکردم, برای اتصال ال ای دی ها اشکال دارم و اینکه از همان کابل نری به مادگی برای اتصال به بورد استفاده میکنیم ؟من هرکاری کردم وصل نشد

        • لطفا کامل نحوه ی اتصال را توضیح دهید تا ایرادات شما را متوجه شوم.
          برای اتصال ال ای دی در این پروژه به این صورت عمل کنید:
          ۳ ال ای دی با رنگ های متفاوت انتخاب کنید. همانطور که در متن آموزش توضیح داده ام، برای چرخه ال ای دی – LED نیاز به ۳ ال ای دی با رنگ های متفاوت داریم. برای اتصال ال ای دی ها نیاز به بردبورد خواهیم داشت:

          ال ای دی – LED آبی را به پین ۵ دیجیتال آردوینو وصل می‌کنیم.
          ال ای دی – LED قرمز را به پین ۷ دیجیتال آردوینو وصل می‌کنیم.
          ال ای دی – LED سبز را به پین ۶ دیجیتال آردوینو وصل می‌کنیم.
          و پایه کوتاه هر یک از ال ای دی ها را به پایه منفی بردبورد وصل کنید. سپس از پایه منفی بردبورد به یکی از پایه های GND آردوینو اتصال دهید.

          • بله تا این جا متوجه شدم, فقط از همون کابلی که برای اتصال ماژول به آردوینو استفاده کردیم برای اتصال بورد و ال ای دی به آردوینو هم استفاده کردیم ببخشید من تا اینجا مدار رو بستم فقط اتصال ال ای دی مونده که بلد نیستم چه طور باید کابل ها رو به بورد و آدوینو وصل کنم

            • سوالات شما بسیار نامفهوم است و اصلا متوجه منظور شما نمی‌شوم. لطفا شفاف تر بیان کنید تا راهنمایی کنم.
              در ابتدا برای مشخص شدن پایه ها پیشنهاد میکنم، ال ای دی ها را در یک طرف بردبورد و ماژول RFID را در سمت دیگر قرار دهید. آردوینو دارای ۱۳ پایه دیجیتال است که بر روی آن با ۰ تا ۱۳ مشخص شده است. در این آموزش برای اتصال ال ای دی نیاز به پایه های دیجیتال آردوینو داریم. حال از پایه بلند ال ای دی آبی به پایه ۵ دیجیتال آردوینو وصل کنید. و برای دیگر ال ای دی ها نیز به همین ترتیب است.

              • ببخشید من تا حال با این بورد کار نکردم, برای اتصال بورد به آردوینو از سیم مخصوص برد بورد باید استفاده کنیم یا از همون سیم هایی که برای اتصال ماژول و آردوینو استفاده کردیم. با کابلی که برای اتصال ماژول ها استفاده شده نمیتونم به بورد وصل کنم. عذر خواهی میکنم ببخشید سوالاتم به این شکل هست. به غیر از این بقیه اتصالات انجام شده

                • برای اتصال با توجه به اینکه پایه های ماژول RFID به صورن نری است، اگر ماژول RFID را به بردبورد وصل نکردید، باید از کابل فلت نری به مادگی برای اتصال آن به آردوینو استفاده کنید. اگر ماژول RFID را به بردبورد وصل می‌کنید باید توسط کابل نری به نری به آردوینو اتصال دهید. هیچ الزامی به استفاده از بردبورد نیست و تنها برای اتصال ال ای دی ها به بردبورد نیاز دارید.

  • ببخشید در پیام قبلی میخواستم ببینم میشه در مورد این پروژه عکسی که تا این جا انجام دادم را برای شما بفرستم ؟بازم معذرت میخوام بابت سوالم

    • بله حتما می‌توانید ‌عکس خود را از طریق یکی از سایت های آپلود و اشتراک گذاری، لینک کرده و ارسال کنید.

      • ببخشید لینک فایلی که برای این پروژه انجام دادم به دست شما رسیده, من چند بار فرستادم سیستم ارور میده,بابت چند بار ارسال پیام معذرت میخوام

      • سلام
        خواهش میکنم. در صورت برخورد به مشکل از همین طریق اعلام کنید ،حتما راهنمایی خواهم کرد.
        موفق باشید.

  • متشکرم .
    لینک عکس هایی که تا الان تونستم انجام بدم .
    http://s8.picofile.com/file/8321784534/RFID.rar.html
    http://s8.picofile.com/d/8321784534/520c3148-0cf6-4a0b-8cad-53685e96acfd/RFID.rar
    بیشتر در شکل اول برای اتصال ال ای دی ها به برد بورد و سیمی که باید به آن ها وصل کنیم اشکال دارم .
    برنامه را هم از با نرم افزار آردوینو انجام دادم و پروژه قبلی که در مورد خواندن RFID ها بود انجام دادم و نتیجه داد . برای این پروژه به این اشکال برخوردم .مرسی از راهنمایی شما

    • سلام مجدد
      اتصالات درست است. حال برای اتصال ال ای دی ها به آردوینو باید از کابل سوزنی یا همان نری به نری استفاده کنید. از سرمثبت و بلند تر ال ای دی با یک کابل سوزنی به پایه دیجیتال آردوینو وصل کنید. کابل هم باید در ردیف عمودی با پایه بلند ال ای دی قرار گیرد. تست کنید و حتما نتیجه را اعلام کنید.

    • عکس ها بررسی شد. در کامنت قبل راهنمایی کردم. از کابل نری به نری ( دو سر سوزنی ) برای اتصال ال ای دی ها به آردویو باید استفاده کنید. اتصالات را انجام دهید و نتیجه را اعلام کنید.

  • با سلام و وقت به خیر . در مورد اتصال ال ای دی به بورد و اتصال کابل عکس رو در لینک زیر آپلود کردم . ببخشید من قسمت آخر ویدیو که با مستر کارت هست رو متجوه نشدم در واقع میشه گفت که این یک سیستم حضور و غیاب هست که به برخی اجازه ورود می دهد و به بعضی از کارت ها اجازه نمیدهد ؟
    لینک ارسال فایل
    http://s8.picofile.com/file/8321873300/photo.rar.html
    ممنون

    • سلام
      بسیار عالی، اتصالات کاملا صحیح است.
      در واقع مستر کارت همان کارت ارشد است. در ابتدا یک کارت را به عنوان کارت ارشد یا همان مستر کارت تعریف می‌کنید. سپس تمامی تگ و کارت های دیگر با تایید کارت ارشد اجازه دسترسی و عدم دسترسی را دریافت خواهند کرد. در فیلم آموزش، ابتدا کارت RFID به عنوان کارت ارشد در سیستم تعریف می‌شود و عبارت Hello Master – Entered Program Mode نمایش داده می‌شود. سپس تگ اول را به RFID نزدیک می‌کنیم. با نزدیک کردن تگ جدید به RFID پیغامی مبنی بر Succesfully added ID record to EEPROM برای شما نمایش داده می‌شود و به این معنی است که تگ اول شناسایی شده و دسترسی برای ورود خواهد داشت. برای حذف همین تگ هم اگر مجددا به RFID نزدیک کنید پیغام شناسایی تگ از قبل و حذف آن را ارسال می‌کند. تمامی این مراحل در متن آموزش کامل توضیح داده شده است. مجددا مطالعه کنید و اگر ابهامی در آن داشتید، مطرح کنید تا توضیح دهم و راهنمایی کنم.

  • سلام .ممنون از لطف شما .
    برای اتصال این مجموعه به اینترنت و یا ارتباط دادن لپ تاپ و بورد از طریق بلوتوث راهی وجود دارد ؟ در واقع راهی به غیر از USB برای اتصال به لپ تاپ و هم چنین اتصال به اینترنت ؟

    • سلام
      درواقع چندین روش برای این منظور وجود دارد ولی بستگی به اینکه چه فعالیتی مد نظر شماست، دارد.

      • ممنون . میتونیم این مجموعه را به اینترنت متصل کنیم ؟ یعنی قابلیت این رو داره که به اینترنت متصل بشه و حضور و غیاب و ورود افراد رو در نظر گرفت ؟

        • برای انتقال دیتا می‌توانید از ماژول های ESP استفاده کنید. ولی در حالت عادی این پروژه برای سیستم حضور و غیاب افراد هم بدون نیاز به اینترنت کاربرد دارد.

          • سلام مجدد . بسیار ممنون
            من از روی ویدیو نگاه کردم . اول تگ شماره ۱و بعد تگ شماره ۲ دوباره تگ شماره ۳و سپس کارت رو روی ماژول قرار داده .
            دوباره تگ اول و کارت و تگ دوم . امیدوارم درست متوجه شده باشم . ال ای دی ها درست روشن خاموش میشن ولی نمیدونم دقیقا که این کارت و تگ هر دفعه برای چه منظوری باید به ماژول نزدیک کنیم ؟

            • در متن آموزش کامل توضیح داده شده است. هر یک از تگ های rfid جهت دسترسی در آردوینو تعریف می‌شود. پیشنهاد میشود در ابتدا در مورد روش کار rfid مطالعه نمایید.

  • تشکر
    برای انتقال دیتا از طریق ماژول های ESP اتصالات با آردوینو و ماژول RFID خوان باید به چه صورت باید باشد ؟

  • سلام.خسته نباشید.
    اگر ممکنه یک برنامه برای فعال نمودن رله به من معرفی کنید اگر هم هزینه ای دارد بنده پرداخت میکنم.

    • سلام
      از توجه شما ممنونم. فعالیت دیجی اسپارک غیر تجاری است و شما می‌توانید در هر مرحله از اجرا سوالات خود را بپرسید تا راهنمایی کنم. همچنین آموزش مربوطه به زودی منتشر خواهد شد و می‌توانید از آن استفاده کنید.

      • با سلام و.احترام, پروژه برای حضور و غیاب که باید از قبل برنامه را به آردوینو بدیم که کد تگ و کارت های متفاوت را تشخیص دهد و اجازه ورود به بعضی از کد ها بدهد ؟ کی به مرحله آموزش میرود, من به دنبال یک پروژه به این صورت هستم

        • سلام
          از توجه شما ممنونم.
          با توجه به اینکه در همین آموزش به درخواست مورد نظر شما پرداخته شده است، شفاف تر توضیح دهید تا دقیق تر راهنمایی کنم.
          تا به حال سه آموزش متفاوت در مورد RFID منتشر شده است. در آموزش اول تنها به توضیح کامل RFID پرداخته شده است. در آموزش دوم به خواندن کدهای تگ RFID پرداختم و در همین آموزش نحوه ی طراحی یک سیستم با مستر کارت را آموزش داده ام. در این آموزش با تعریف یک کارت به عنوان کارت ارشد ( Master Card) کارت های زیر شاخه آن را تعریف خواهیم کرد و اجازه دسترسی و عدم دسترسی را به آن تخصیص خواهیم داد. آموزش را مرحله به مرحله اجرا کنید و سپس در صورت برخورد به مشکل سوالات خود را از همین طریق بپرسید تا راهنمایی کنم.

        • سلام مجدد, بله ممنون, برای یک سیستم حضور و غیاب باید برخی از کد ها را به سیستم بدهم که فقط همان کارت هایی که در سیستم وارد شده را شناسایی کند و اجازه ورود دهد و به تگ هایی کد آن ها در برنامه تعریف نشده اجازه ورود ندهد

          • سلام
            در این آموزش به همین شیوه عمل شده است. در ابتدا کارت ارشد را تعریف میکنیم و سپس کارت های زیر شاخه آن را تعیین خواهیم کرد. پیشنهاد می‌کنم در ابتدا طبق آموزش اتصالات را انجام دهید و مرحله به مرحله با آموزش پیش بروید تا دقیق تر بتوانید عملکرد مدار را بررسی کنید. سوالات خود را از همین طریق بیان کنید.

          • تشکر, در مورد ماژول esp برای این پروژه باید چه کار کنیم ؟ فرمودید نیاز آموزش داره در کامنت های قبلی یعنی اتصالات و برنامه هایش را خیلی باید تغییر داد ؟

            • سلام
              بله دقیقا باید کتابخانه و دستورات فراخوانی آن در کدها اضافه شود و بسیار مفصل است. با این وجود نیاز به یک آموزش کامل خواهد داشت.

              • سلام
                زمان مشخصی برای انتشار آموزش ها وجود ندارد. پیشنهاد می‌کنم، با توجه به آموزش های ارائه شده پیش روید و سپس تغییرات را در کدها اعمال کنید. در هر مرحله در صورت برخورد به مشکل از همین طریق اعلام کنید تا راهنمایی کنم.

              • سلام وقت شما بخیر, برای اینکه از ماژول اترنت w100 استفاده کنیم باید چه اتصالاتی رو انجام دهیم ؟ من از آموزش w100 استفاده کردم ولی نتونستم اتصالاتش رو به این پروژه انجام بدم

                • سلام
                  در ابتدا توضیح دهید که چرا از شیلد اترنت میخواهید در این پروژه استفاده کنید تا راهنمایی کنم.

  • با سلام
    من تمامی مراحل را انجام دادم اروری هم نداشت ولی وقتی پیام Scan A PICC to Define as Master Card میاد وقتی کارت رو نزدیک می کنم اتفاقی نمی افتد

    • سلام
      در ابتدا اولین قدم تعریف کارت ارشد است. پس از آپلود برنامه هنگامی که سریال مانیتور را باز می‌کنید، عبارت Waiting PICCs to bo scanned نمایش داده می‌شود. با نزدیک کردن کارت RFID، کارت توسط ماژول باید خوانده شود و عبارت This is Master Card نمایش داده می‌شود. مجددا تست کنید و نحوه ی عملکردتان را توضیح دهید تا بتوانم دقیق‌تر راهنمایی کنم.

      • پس از اپلود پیغام No Master Card Defined
        Scan A PICC to Define as Master Card
        نمایش داده می شود و وقتی کارت را نزدیک می کنم اتفاقی نمی افتد

            • با این وجود مشکلی در شناسایی تگ نیست و احتمالا در اتصالات ایرادی وجود دارد. اولین قدم شناسایی مستر کارت است و بدون تشخیص آن امکان تعریف تگ های زیر شاخه وجود ندارد. مجددا اتصالات را چک کنید و نتیجه را اعلام کنید.

  • سلام مجدد, با استفاده از شیلد اترنت می توان این پروژه رو به اینترنت متصل کرد ؟میخوام به اینترنت وصل باشه. من آشنایی زیادی با شیلد ها و ماژول های اینترنت ندارم نمیدونم باید esp استفاده کنم یا اترنت w100

    • سلام
      بله متوجه منظور شما شدم، فقط هدف از اتصال RFID به اترنت را توضیح دهید تا متوجه بشوم چه تغییراتی می‌خواهید ایجاد کنید؟

  • تشکر, این پروژه رو میخواهم به اینترنت وصل کنم تا از طریق سرور بتوان ورود و خروج را کنترل کرد و اینکه این پروژه را به یک lan متصل کنم, در قسمت آموزش w100آدرس ip ایجاد کرده و به اینترنت متصل شده, از طریق بلوتوث یا وایرلس میتوان این پروژه رو به شبکه متصل کرد؟

    • سلام
      بسیار ایده‌ی جالبی است. برای این منظور چندین کار مهم نیاز است. اولا ساخت وب سرور جهت دریافت اطلاعات مورد نیاز و دسته بندی در دیتابیس، نکته دیگر هم تنظیمات شبکه که با چه DNS و IP پکیج دیتا ارسال شود.

      • سلام. تشکر,ساخت وب سرور به چه شکل هست و باید از چه قطعاتی استفاده کنیم؟ تنظیمات شبکه را هم باید به برنامه آردوینو اضافه کنیم ؟

        • سلام مجدد
          در خصوص وب سرور آموزش تخصصی در دیجی اسپارک منتشر نکرده‌ایم. ولی می‌توانید به آموزش مدیریت مصرف انرژی برد کنترل اینترنت اشیا Wemos D1 Mini بخش اول مراجعه کنید. تنظیمات شبکه هم بسیار پیچیده است و از بحث کامنت خارج است. منتظر آموزش‌های بعدی باشید.

          • سلام, از روی یکی از آموزش های شما که در مورد اتصال آردوینوhttp://goo.gl/XeUhta هست این پروژه میخوام متصل کنم ولی اتصالات را بررسی کردم فقط امکان برقراری یا ماژول rfidیا اترنت فقط وجود دارد, باید از دستگاه لحیم استفاده کنیم برای دیگری ؟

            • با سلام و تشکر از توجه شما
              کاربر گرامی دقت داشته باشید، سوالات شما کاملا مفهوم نمی‌باشد. اگر میخواهید پروژه‌ای را با استفاده از این بردها اجرا کنید؛ نیاز به دانش فنی دارید. صرفا برای دریافت راهنمایی می‌توانید از دیجی اسپارک استفاده کنید. همچنین اتصال برد RFID به شبکه برای انتقال داده‌ها کار پیچیده و زمان‌بری است. لطفا رعایت بفرمایید اگر دانش برنامه نویسی و دانش شبکه و سرور ندارید، کلا سمت این پروژه نروید.

          • سلام ممنون از راهنمایی شما, آموزش ها دیگری مورد rfid هست به غیر سیستم ورود و خواندن کارت ها و تگ ها که به من معرفی کنید؟

              • سلام تشکر, اگه بخوایم ال ای دی و برد بورد رو از برنامه حذف کنم, چه تغییراتی باید در برنامه ایجاد کنم؟به جای اتصال به اینترنت باید به نرم افزار دیگه ای مثل matlabو proteus انجام بدم و نیازی به ال ای دی ها نیست

                • سلام
                  ال ای دی ها به عنوان خروجی در کد تعریف شده است و تاثیری در عملکرد مدار نخواهد شد. می‌توانید از ال ای دی ها استفاده نکنید.

  • با سلام و وقت به خیر, ببخشید من کد ها و توضیحات رو که مطالعه کردم متوجه نشدم که تعریف کارت ارشد برای چه هست ؟و اینکه برای برنامه نویسی باید از چه منابع و کتاب هایی استفاده کنیم؟

    • سلام
      از توجه شما ممنونم.
      مستر کارت در واقع کارت اصلی است کهه توسط آن می‌توانید تگ های زیر شاخه را مشخص کنید. اجازه دسترسی و عدم دسترسی را به کارت های زیر شاخه خواهید داد.
      در خصوص برنامه نویسی هم کتاب و منابع متعددی برای برنامه نویسی C و C++ ارائه شده است که میتوانید استفاده کنید. برای شروع حرفه ای تر پیشنهاد می‌کنم مرحله به مرحله با آموزش های سایت پیش بروید و در صورت برخورد به مشکل و سوال از طریق ثبت نظر با نویسنده ها در ارتباط باشید.
      برای این آموزش مجددا برنامه را اجرا کنید. سپس مرحله به مرحله با آموزش پیش بروید تا روند تعریف کارت ارشد و تگ های زیر شاخه را مشاهده کنید و مجددا سوالات خود را بپرسید تا راهنمایی کنم.

  • سلام
    خسته نباشید من واقعا ذوق زده شدم، نمیدونم این همه آموزش را چطور انجام بدم. میشه بگید که من کی میتونم بیام سراغ این آموزش؟ پیش نیاز داره؟

    • سلام
      در ابتدا پیشنهاد می‌کنم، وسایل مورد نیاز جهت اجرای این پروژه را تهیه نمایید و سپس مرحله به مرحله با آموزش پیش بروید.
      در صورت ابهام و برخورد به مشکل از همین طریق اقدام نمایید، من در سریع ترین زمان ممکن پاسخ سوال شما را خواهم داد.

  • سلام. وقت بخیر…
    این ماژول همونطور که گفتید فرکانسش ۱۳٫۵۶ مگاهرتزه….چطور توی وسایل مورد نیاز ، تگ ۱۲۵ کیلوهرتز معرفی کردید؟

    • سلام
      بله حق با شماست. بنده این مورد را بررسی نکردم و در حال بررسی از طرف فروشگاه هستم.

  • سلام خانم پوربلورچیان
    من با rfid یه پروژه نوشتم برای استارت دکمه ای خودرو و الان روی ماشینم داره کار میکنه. تگ معرفی میشه اگه اوکی باشه اجازه میده با کلیدی که تعبیه شده حالت های استارت ماشین دونه به دونه اجرا بشه.

    سوالی که دارم اینه. ماژولی آنتنی ریموتی چیزی هست که من به جای rfid و کارت استفاده کنم به این صورت که لازم نباشه کارت یه جای مشخص ارائه بشه یعنی جوری باشه که زمانی که توی یه محدوده مشخصی مثلا ۳۰ سانت یا ۵۰ سانت تا ماژول این ریموت یا هر چیز دیگه ای تشخیص داده بشه و سیستم فعال بشه وقتی هم که از اون محدوده دور شد دوباره غیر فعال کنه سیستم رو.

    یه چیزی شبیه به سیستم keyless توی ماشین های خارجی

    من خیلی گشتم نفهمیدم چی رو استفاده کنم
    ممنون میشم راهنماییم کنید.

    • سلام
      اینطور که من از توضیحات شما متوجه شدم، می‌خواهید همان کارت RFID را از فاصله ای دورتر فعال کنید که این موضوع در RFID وجود دارد ولی تجهیزات آن متفاوت است. در خصوص ریموت های Keyless هم موارد بسیار بسیار با RFID متفاوت است.

      • من اطلاعی ندارم از تجهیزاتش
        اگر شما اطلاع دارین بفرمایین هم برای rfid هم برای keyless برای پروژه ای میخوام لازم دارم
        من گشتم خیلی چیزی پیدا نکردم

        • سلام مجدد
          در خصوص RFID با برد زیاد، نیاز به گیرنده برد بالا دارد. در چنین حالتی آنتن گیرنده متفاوت خواهد بود و البته تا جایی که بنده میدانم فرکانس کاری هم تغییر می‌کند. متاسفانه این تجهیزات در حال حاضر به صورت ماژولار مانند RC522 در بازار موجود نمی‌باشد.
          در خصوص ریموت Keyless موارد وارد مبحث دیگری به اسم ایموبلایزر می‌شود. که نسل‌های متفاوت و رده امنیتی مختلفی دارند. پرداختن به این مورد از بحث در این کامنت خارج است.

  • سلام ببخشید میشه شماتیک فیلم بدید و این که چرا وقتی کارت نزدیک هنوز نکردیم همه ledروشن میشه و اینکه وقتی کارت نزدیک میکنیم در سریال مانیتور به من کدF2F22883 اینا میده و اینکه کدهای دیگه هم میده من میخوام با یه کد به خصوصی که در برنامه نویسی تعیین میکنم با اون کد برنامه باز کنه.

    • سلام
      اگر منظور شما از شماتیک اتصالات می‌باشد، در متن آموزش کاملا موارد توضیح داده شده است.
      در خصوص سوال دوم در متن کد ال ای دی ها به این صورت تعریف شده است، می‌توانید آن را به دلخواه خود تغییر دهید و یا حتی استفاده نکنید.
      برای سوال سوم دقت کنید وقتی مستر کارت شناسایی می‌شود، کد کارت به همراه متن “Master Card Defined” در سریال مانیتور نمایش داده می‌شود. سپس با نزدیک کردن تگ کد آن با پیغام I know this PICC, so removing و یا I do not know this PICC, adding… در سریال مانیتور نمایش داده می‌شود.
      پیشنهاد می‌کنم مجددا متن آموزش را با دقت مطالعه کنید و مرحله به مرحله پروژه را اجرا و همزمان سریال مانیتور را چک کنید.
      نتیجه را اعلام کنید تا راهنمایی کنم.

  • سلام خسته نباشید.
    همچین اروری میده
    دلیلش چیه


    F:\arduino\PROJECT\rfid_2\rfid_2.ino:1:22: warning: extra tokens at end of #include directive

    #include .// از طریق کتابخانه EEPROM آی دی یونیک کارت و تگ های RFID را میخوانیم

    ^

    F:\arduino\PROJECT\rfid_2\rfid_2.ino: In function ‘void loop()’:

    rfid_2:105: error: ‘isMaster’ was not declared in this scope

    if ( isMaster(readCard) ) { //اگر کارت ارشد تعریÙ? شده باشد به منو اصلی باز میگردد

    ^

    rfid_2:126: error: ‘isMaster’ was not declared in this scope

    if ( isMaster(readCard) ) { // اگر آی دی کارت اسکن شده با آی دی کارت ارشد تطبیق داده شودوارد حالت تنظیم برنامه خواهد شد.

    ^

    rfid_2:143: error: ‘failed’ was not declared in this scope

    failed();

    ^

    F:\arduino\PROJECT\rfid_2\rfid_2.ino: In function ‘void writeID(byte*)’:

    rfid_2:212: error: ‘successWrite’ was not declared in this scope

    successWrite();

    ^

    rfid_2:215: error: ‘failedWrite’ was not declared in this scope

    failedWrite();

    ^

    F:\arduino\PROJECT\rfid_2\rfid_2.ino: In function ‘void deleteID(byte*)’:

    rfid_2:222: error: ‘failedWrite’ was not declared in this scope

    failedWrite();

    ^

    rfid_2:242: error: ‘successDelete’ was not declared in this scope

    successDelete();

    ^

    F:\arduino\PROJECT\rfid_2\rfid_2.ino: In function ‘boolean checkTwo(byte*, byte*)’:

    F:\arduino\PROJECT\rfid_2\rfid_2.ino:248:16: warning: NULL used in arithmetic [-Wpointer-arith]

    if ( a[0] != NULL )

    ^

    exit status 1
    ‘isMaster’ was not declared in this scope

    This report would have more information with
    “Show verbose output during compilation”
    option enabled in File -> Preferences.

    • سلام
      کدها را از طریق کلید میانبری که برای انتقال کدها در نظر گرفته شده است، به نرم افزار آردوینو انتقال دهید. مجددا تست و نتیجه را اعلام کنید تا راهنمایی کنم.

  • سلام ..این پروژه امکان اینکه نشون بده کارت وارد شده زمان رو هم مشخص کنه داره مثلا بگه در فلان تاریخ و ساعت این کارت وارد شده

    • سلام
      برای اینکار نیاز به تغییرات در کدها می‌باشد. پروژه را انجام دهید و در صورت برخورد به مشکل از همین طریق بپرسید تا راهنمایی کنم.

  • سلام ..ببخشید این پروژه امکان ثبت تاریخ و زمان رو هم داره..مثلا بگه در فلان ساعت و تاریخ کارت وارد شده .

  • سلام واقعن خیلی احتیاج ب این جواب دارم که این پروژه میتونه نشون بده که در چه تاریخ و در چه ساعتی کارت وارد شده

    • کاربر گرامی
      لطفا منتظر دریافت پاسخ باشید. تعداد کامنت ها بسیار زیاد است و تمام تلاشم بر این است تا در سریع ترین زمان ممکن پاسخ سوال شما را ارسال کنم.
      همانطور که گفتم برای این مورد نیاز به تغییر در کدها خواهید داشت و باید کتابخانه ساعت و دستورات لازم را فراخوانی کنید.

  • بازم سلام.امکانش هست که کد های تاریخ و ساعتو اضافه کنید..یا بفرستینش
    این پروژه پایان ناممه واقعن احتیاجش دارم
    لطفا راهنمایی کنید

    • سلام
      کاربر گرامی دیجی اسپارک بستر آموزش‌های رایگان می‌باشد، نه بستر طراحی مدار رایگان! لطفا در این خصوص حد و حریم را رعایت بفرمایید. درصورت تمایل به واحد طراحی مدار دانشجو کیت مراجعه کنید.

  • سلام .طبق این برنامه ک شما نوشتید باید اینطور باشه که اگه کارت دسترسی نداشت ال ایی دی قرمز روشن شه اگه دسترسی داشت ال ایی دی سبز درسته

    • سلام
      بله دقیقا و ال ای دی آبی هم آماده برای خواندن کارت است. دقت کنید که انتخاب ال ای دی ها اختیاری است و می‌توانید در کد برنامه تغییر دهید.

    • سلام
      بله
      از هر مدلی می‌توانید استفاده کنید ولی ممکن است نیاز به تغییر کدها داشته باشید.

    • سلام
      با توجه به اینکه، پروژه این پست در بخش بعدی RFID، منتشر شده است، منقضی شده است و بن به آن تعلق نمی‌گیرد.

  • سلام خسته نباشید
    من در خط ۵۸ برنامه (مقدار دهی اولیه سخت افزار) ارور دریافت میکنم موقع اپلود اگه ممکنه راهنمایی کنید
    متن ارور ( ‘class ‘ MFRC522’ hase no member named PCD_Init )
    ممنون
    در ضمن برنامه های دیگه ایی رو تست کردم مشکلی نداشت

    • سلام
      کد برنامه تست شده است و ایرادی ندارد. لطفا از طریق کلید میانبر Ctrl+C و Ctrl+V کد را به نرم افزار آردوینو انتقال دهید.
      سپس کتابخانه MFRC522 را فراخوانی کنید و اگر دانلود کرده اید حتما باید از حالت زیپ خارج کرده و در پوشه arduino/library ذخیره کنید.
      موارد را تست کرده و نتیجه را اعلام کنید.

  • با عرض سلام و خسته نباشید
    میخواستم بدونم برای اینکه هر کارت رو به یه کاری اختصاص بدم باید چکار کنم.مثلا یه کارتی رو به اپراتور اخصاص بدم که با استفاده از اون کارت وارد کارای مخصوص به خودش رو انجام بده و دو کارت دیگه که کارایی مشابه دارن؟

    • سلام
      برای اینکار باید در کدها تغییراتی ایجاد کنید. پس از شناخته شدن کارت مورد نظر وارد حلقه شرطی شود و یک دستور خاص را اجرا نماید. برای این منظور باید از ساختار های تصمیم مانند Switch استفاده کنید و کد برنامه را تعمیم دهید.

  • با سلام
    من کتابخونه accsess control رو با اردوینو uno راه انداختم ولی این کار رو با اردوینو نانو یا پرو مینی انجام میدم قفل میکنن تو کار همه چی درست انجام شده ولتاژها هم درسته برای ماژول ۵۲۲ ولتاژ ۳٫۳ رو با رگولاتور تامین کردم ولی نمیدونم چرا قفل میکنه فقط تگ اول یا مستر کارت رو میخونه میره تو پروگرم مود و بیرون میاد ولی تگ دیگه ای اضافه کنی این نوشته رو مینویسه و تا ریست نکنی کار نمیکنه
    این نوشته و بعدش کد کارت Scanned PICC’s UID:

      • بله همه این پروژه رو من روی uno نوشتم با ال سی دی بعد که روی نانو ریختم به این مشکل خوردم حتی با فایل اصلی هم تست کردم فرقی نداشت

        • کاربر گرامی تا جایی که بنده اطلاع دارم برای استفاده از rfid توسط برد آردوینو نانو به مشکل میخورید. لطفا مساعدت فرموده و سوالتان را فقط در یک قسمت بنویسید. از نوشتن همزمان سوال در چند پست خودداری کنید.

  • با سلام با تشکر از اموزشتون ولی من کد را که کپی کردم هنگام کامپایل خطا میده و الان میخام هم رله بهش اضافه کنم هم SMS بفرسته برای کاربر مستر ولی الان با این خطاها نمیشه کاری کرد مثلا یک خطا اینه ‘class MFRC522’ has not member named ‘uid’

    • سلام
      از توجه شما ممنونم.
      این ارور مربوط به کتابخانه MFRC522 می‌باشد. بررسی کنید که آیا کتابخانه به درستی نصب شده است یا خیر.
      نتیجه را از همین طریق اعلام کنید.

  • من با این خطا مواجه شدم:
    C:\Users\sepid\AppData\Local\Temp\untitled191710711.tmp\sketch_dec22a\sketch_dec22a.ino: In function ‘boolean checkTwo(byte*, byte*)’:

    C:\Users\sepid\AppData\Local\Temp\untitled191710711.tmp\sketch_dec22a\sketch_dec22a.ino:247:16: warning: NULL used in arithmetic [-Wpointer-arith]

    if ( a[0] != NULL )

    ^

  • سلام خسته نباشید
    میشه براش چند تا کارت که خودت دوس داری تعریف کنی؟
    ینی مثلا اگه یه نفر کارت شبیه اون
    (خودش خریده باشه)داشت نتونه اونو باز کنه؟

    • سلام
      تگ های RFID دارای کد منحصر به فرد است. از این رو می‌توانید در کدنویسی فقط تگ هایی که اجازه ورود و یا دسترسی دارند، را مشخص کنید.

  • سلام
    بستگی به جنس آن خواهد داشت ولی حداکثر تا فاصله ۷ سانتی متر جواب خواهد داد.

  • سلام این خطا رو میده
    آردوینو:۱٫۸٫۸ (Windows 10), بُرد:”Arduino/Genuino Uno”

    C:\Users\mohammad\Documents\Arduino\sketch_feb05a\sketch_feb05a.ino:1:22: warning: extra tokens at end of #include directive

    #include .// از طریق کتابخانه EEPROM آی دی یونیک کارت و تگ های RFID را میخوانیم

    ^

    C:\Users\mohammad\Documents\Arduino\sketch_feb05a\sketch_feb05a.ino: In function ‘void setup()’:

    sketch_feb05a:58:11: error: ‘class MFRC522’ has no member named ‘PCD_Init’

    mfrc522.PCD_Init(); // مقدار دهی اولیه سخت اÙ?زار MFRC522

    ^

    sketch_feb05a:59:11: error: ‘class MFRC522’ has no member named ‘PCD_SetAntennaGain’

    mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max); //ست کردن آنتن برای ماژول RFID جهت اÙ?زایش برد گیرنده Ú©Ù‡ در این آموزش به این موضوع نمیپردازیم.

    ^

    sketch_feb05a:59:38: error: ‘class MFRC522’ has no member named ‘RxGain_max’

    mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max); //ست کردن آنتن برای ماژول RFID جهت اÙ?زایش برد گیرنده Ú©Ù‡ در این آموزش به این موضوع نمیپردازیم.

    ^

    C:\Users\mohammad\Documents\Arduino\sketch_feb05a\sketch_feb05a.ino: In function ‘int getID()’:

    sketch_feb05a:152:18: error: ‘class MFRC522’ has no member named ‘PICC_IsNewCardPresent’

    if ( ! mfrc522.PICC_IsNewCardPresent()) { //اگر یک PICC جدید به RFID معرÙ?ÛŒ شد، ادامه میدهد.

    ^

    sketch_feb05a:155:18: error: ‘class MFRC522’ has no member named ‘PICC_ReadCardSerial’

    if ( ! mfrc522.PICC_ReadCardSerial()) {

    ^

    sketch_feb05a:163:27: error: ‘class MFRC522’ has no member named ‘uid’

    readCard[i] = mfrc522.uid.uidByte[i];

    ^

    sketch_feb05a:167:11: error: ‘class MFRC522’ has no member named ‘PICC_HaltA’

    mfrc522.PICC_HaltA(); // توقÙ? خواندن کارت

    ^

    C:\Users\mohammad\Documents\Arduino\sketch_feb05a\sketch_feb05a.ino: In function ‘boolean checkTwo(byte*, byte*)’:

    C:\Users\mohammad\Documents\Arduino\sketch_feb05a\sketch_feb05a.ino:248:16: warning: NULL used in arithmetic [-Wpointer-arith]

    if ( a[0] != NULL )

    ^

    Multiple libraries were found for “MFRC522.h”
    ??????? ???: C:\Users\mohammad\Documents\Arduino\libraries\MFRC522-master
    ??????? ????: C:\Users\mohammad\Documents\Arduino\libraries\MFRC522-1.4.3
    exit status 1
    ‘class MFRC522’ has no member named ‘PCD_Init’

    This report would have more information with
    “Show verbose output during compilation”
    option enabled in File -> Preferences.

    • سلام
      ارورها مربوط به انتخاب برد و کتابخانه ها است. در ابتدا نوع برد را به درستی انتخاب کنید. سپس با توجه به متن آموزش کتابخانه های مورد نیاز را دانلود و نصب کنید.
      نتیجه را از همین طریق اعلام کنید.

  • سلام.امیدوارم اولین نفر باشم

    #include // We are going to read and write PICC’s UIDs from/to EEPROM
    #include // RC522 Module uses SPI protocol
    #include // Library for Mifare RC522 Devices

    /*
    Instead of a Relay you may want to use a servo. Servos can lock and unlock door locks too
    Relay will be used by default
    */

    // #include

    /*
    For visualizing whats going on hardware we need some leds and to control door lock a relay and a wipe button
    (or some other hardware) Used common anode led,digitalWriting HIGH turns OFF led Mind that if you are going
    to use common cathode led or just seperate leds, simply comment out #define COMMON_ANODE,
    */

    #define COMMON_ANODE

    #ifdef COMMON_ANODE
    #define LED_ON LOW
    #define LED_OFF HIGH
    #else
    #define LED_ON HIGH
    #define LED_OFF LOW
    #endif

    #define redLed 7 // Set Led Pins
    #define greenLed 6
    #define blueLed 5

    #define relay 4 // Set Relay Pin
    #define wipeB 3 // Button pin for WipeMode

    bool programMode = false; // initialize programming mode to false

    uint8_t successRead; // Variable integer to keep if we have Successful Read from Reader

    byte storedCard[4]; // Stores an ID read from EEPROM
    byte readCard[4]; // Stores scanned ID read from RFID Module
    byte masterCard[4]; // Stores master card’s ID read from EEPROM

    // Create MFRC522 instance.
    #define SS_PIN 10
    #define RST_PIN 9
    MFRC522 mfrc522(SS_PIN, RST_PIN);

    ///////////////////////////////////////// Setup ///////////////////////////////////
    void setup() {
    //Arduino Pin Configuration
    pinMode(redLed, OUTPUT);
    pinMode(greenLed, OUTPUT);
    pinMode(blueLed, OUTPUT);
    pinMode(wipeB, INPUT_PULLUP); // Enable pin’s pull up resistor
    pinMode(relay, OUTPUT);
    //Be careful how relay circuit behave on while resetting or power-cycling your Arduino
    digitalWrite(relay, HIGH); // Make sure door is locked
    digitalWrite(redLed, LED_OFF); // Make sure led is off
    digitalWrite(greenLed, LED_OFF); // Make sure led is off
    digitalWrite(blueLed, LED_OFF); // Make sure led is off

    //Protocol Configuration
    Serial.begin(9600); // Initialize serial communications with PC
    SPI.begin(); // MFRC522 Hardware uses SPI protocol
    mfrc522.PCD_Init(); // Initialize MFRC522 Hardware

    //If you set Antenna Gain to Max it will increase reading distance
    //mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);

    Serial.println(F(“Access Control Example v0.1”)); // For debugging purposes
    ShowReaderDetails(); // Show details of PCD – MFRC522 Card Reader details

    //Wipe Code – If the Button (wipeB) Pressed while setup run (powered on) it wipes EEPROM
    if (digitalRead(wipeB) == LOW) { // when button pressed pin should get low, button connected to ground
    digitalWrite(redLed, LED_ON); // Red Led stays on to inform user we are going to wipe
    Serial.println(F(“Wipe Button Pressed”));
    Serial.println(F(“You have 10 seconds to Cancel”));
    Serial.println(F(“This will be remove all records and cannot be undone”));
    bool buttonState = monitorWipeButton(10000); // Give user enough time to cancel operation
    if (buttonState == true && digitalRead(wipeB) == LOW) { // If button still be pressed, wipe EEPROM
    Serial.println(F(“Starting Wiping EEPROM”));
    for (uint16_t x = 0; x < EEPROM.length(); x = x + 1) { //Loop end of EEPROM address
    if (EEPROM.read(x) == 0) { //If EEPROM address 0
    // do nothing, already clear, go to the next address in order to save time and reduce writes to EEPROM
    }
    else {
    EEPROM.write(x, 0); // if not write 0 to clear, it takes 3.3mS
    }
    }
    Serial.println(F("EEPROM Successfully Wiped"));
    digitalWrite(redLed, LED_OFF); // visualize a successful wipe
    delay(200);
    digitalWrite(redLed, LED_ON);
    delay(200);
    digitalWrite(redLed, LED_OFF);
    delay(200);
    digitalWrite(redLed, LED_ON);
    delay(200);
    digitalWrite(redLed, LED_OFF);
    }
    else {
    Serial.println(F("Wiping Cancelled")); // Show some feedback that the wipe button did not pressed for 15 seconds
    digitalWrite(redLed, LED_OFF);
    }
    }
    // Check if master card defined, if not let user choose a master card
    // This also useful to just redefine the Master Card
    // You can keep other EEPROM records just write other than 143 to EEPROM address 1
    // EEPROM address 1 should hold magical number which is '143'
    if (EEPROM.read(1) != 143) {
    Serial.println(F("No Master Card Defined"));
    Serial.println(F("Scan A PICC to Define as Master Card"));
    do {
    successRead = getID(); // sets successRead to 1 when we get read from reader otherwise 0
    digitalWrite(blueLed, LED_ON); // Visualize Master Card need to be defined
    delay(200);
    digitalWrite(blueLed, LED_OFF);
    delay(200);
    }
    while (!successRead); // Program will not go further while you not get a successful read
    for ( uint8_t j = 0; j < 4; j++ ) { // Loop 4 times
    EEPROM.write( 2 + j, readCard[j] ); // Write scanned PICC's UID to EEPROM, start from address 3
    }
    EEPROM.write(1, 143); // Write to EEPROM we defined Master Card.
    Serial.println(F("Master Card Defined"));
    }
    Serial.println(F("——————-"));
    Serial.println(F("Master Card's UID"));
    for ( uint8_t i = 0; i < 4; i++ ) { // Read Master Card's UID from EEPROM
    masterCard[i] = EEPROM.read(2 + i); // Write it to masterCard
    Serial.print(masterCard[i], HEX);
    }
    Serial.println("");
    Serial.println(F("——————-"));
    Serial.println(F("Everything is ready"));
    Serial.println(F("Waiting PICCs to be scanned"));
    cycleLeds(); // Everything ready lets give user some feedback by cycling leds
    }

    ///////////////////////////////////////// Main Loop ///////////////////////////////////
    void loop () {
    do {
    successRead = getID(); // sets successRead to 1 when we get read from reader otherwise 0
    // When device is in use if wipe button pressed for 10 seconds initialize Master Card wiping
    if (digitalRead(wipeB) == LOW) { // Check if button is pressed
    // Visualize normal operation is iterrupted by pressing wipe button Red is like more Warning to user
    digitalWrite(redLed, LED_ON); // Make sure led is off
    digitalWrite(greenLed, LED_OFF); // Make sure led is off
    digitalWrite(blueLed, LED_OFF); // Make sure led is off
    // Give some feedback
    Serial.println(F("Wipe Button Pressed"));
    Serial.println(F("Master Card will be Erased! in 10 seconds"));
    bool buttonState = monitorWipeButton(10000); // Give user enough time to cancel operation
    if (buttonState == true && digitalRead(wipeB) == LOW) { // If button still be pressed, wipe EEPROM
    EEPROM.write(1, 0); // Reset Magic Number.
    Serial.println(F("Master Card Erased from device"));
    Serial.println(F("Please reset to re-program Master Card"));
    while (1);
    }
    Serial.println(F("Master Card Erase Cancelled"));
    }
    if (programMode) {
    cycleLeds(); // Program Mode cycles through Red Green Blue waiting to read a new card
    }
    else {
    normalModeOn(); // Normal mode, blue Power LED is on, all others are off
    }
    }
    while (!successRead); //the program will not go further while you are not getting a successful read
    if (programMode) {
    if ( isMaster(readCard) ) { //When in program mode check First If master card scanned again to exit program mode
    Serial.println(F("Master Card Scanned"));
    Serial.println(F("Exiting Program Mode"));
    Serial.println(F("—————————–"));
    programMode = false;
    return;
    }
    else {
    if ( findID(readCard) ) { // If scanned card is known delete it
    Serial.println(F("I know this PICC, removing…"));
    deleteID(readCard);
    Serial.println("—————————–");
    Serial.println(F("Scan a PICC to ADD or REMOVE to EEPROM"));
    }
    else { // If scanned card is not known add it
    Serial.println(F("I do not know this PICC, adding…"));
    writeID(readCard);
    Serial.println(F("—————————–"));
    Serial.println(F("Scan a PICC to ADD or REMOVE to EEPROM"));
    }
    }
    }
    else {
    if ( isMaster(readCard)) { // If scanned card's ID matches Master Card's ID – enter program mode
    programMode = true;
    Serial.println(F("Hello Master – Entered Program Mode"));
    uint8_t count = EEPROM.read(0); // Read the first Byte of EEPROM that
    Serial.print(F("I have ")); // stores the number of ID's in EEPROM
    Serial.print(count);
    Serial.print(F(" record(s) on EEPROM"));
    Serial.println("");
    Serial.println(F("Scan a PICC to ADD or REMOVE to EEPROM"));
    Serial.println(F("Scan Master Card again to Exit Program Mode"));
    Serial.println(F("—————————–"));
    }
    else {
    if ( findID(readCard) ) { // If not, see if the card is in the EEPROM
    Serial.println(F("Welcome, You shall pass"));
    granted(300); // Open the door lock for 300 ms
    }
    else { // If not, show that the ID was not valid
    Serial.println(F("You shall not pass"));
    denied();
    }
    }
    }
    }

    ///////////////////////////////////////// Access Granted ///////////////////////////////////
    void granted ( uint16_t setDelay) {
    digitalWrite(blueLed, LED_OFF); // Turn off blue LED
    digitalWrite(redLed, LED_OFF); // Turn off red LED
    digitalWrite(greenLed, LED_ON); // Turn on green LED
    digitalWrite(relay, LOW); // Unlock door!
    delay(setDelay); // Hold door lock open for given seconds
    digitalWrite(relay, HIGH); // Relock door
    delay(1000); // Hold green LED on for a second
    }

    ///////////////////////////////////////// Access Denied ///////////////////////////////////
    void denied() {
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    digitalWrite(redLed, LED_ON); // Turn on red LED
    delay(1000);
    }

    ///////////////////////////////////////// Get PICC's UID ///////////////////////////////////
    uint8_t getID() {
    // Getting ready for Reading PICCs
    if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
    return 0;
    }
    if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
    return 0;
    }
    // There are Mifare PICCs which have 4 byte or 7 byte UID care if you use 7 byte PICC
    // I think we should assume every PICC as they have 4 byte UID
    // Until we support 7 byte PICCs
    Serial.println(F("Scanned PICC's UID:"));
    for ( uint8_t i = 0; i < 4; i++) { //
    readCard[i] = mfrc522.uid.uidByte[i];
    Serial.print(readCard[i], HEX);
    }
    Serial.println("");
    mfrc522.PICC_HaltA(); // Stop reading
    return 1;
    }

    void ShowReaderDetails() {
    // Get the MFRC522 software version
    byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg);
    Serial.print(F("MFRC522 Software Version: 0x"));
    Serial.print(v, HEX);
    if (v == 0x91)
    Serial.print(F(" = v1.0"));
    else if (v == 0x92)
    Serial.print(F(" = v2.0"));
    else
    Serial.print(F(" (unknown),probably a chinese clone?"));
    Serial.println("");
    // When 0x00 or 0xFF is returned, communication probably failed
    if ((v == 0x00) || (v == 0xFF)) {
    Serial.println(F("WARNING: Communication failure, is the MFRC522 properly connected?"));
    Serial.println(F("SYSTEM HALTED: Check connections."));
    // Visualize system is halted
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    digitalWrite(redLed, LED_ON); // Turn on red LED
    while (true); // do not go further
    }
    }

    ///////////////////////////////////////// Cycle Leds (Program Mode) ///////////////////////////////////
    void cycleLeds() {
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_ON); // Make sure green LED is on
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    delay(200);
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
    delay(200);
    digitalWrite(redLed, LED_ON); // Make sure red LED is on
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    delay(200);
    }

    //////////////////////////////////////// Normal Mode Led ///////////////////////////////////
    void normalModeOn () {
    digitalWrite(blueLed, LED_ON); // Blue LED ON and ready to read card
    digitalWrite(redLed, LED_OFF); // Make sure Red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure Green LED is off
    digitalWrite(relay, HIGH); // Make sure Door is Locked
    }

    //////////////////////////////////////// Read an ID from EEPROM //////////////////////////////
    void readID( uint8_t number ) {
    uint8_t start = (number * 4 ) + 2; // Figure out starting position
    for ( uint8_t i = 0; i < 4; i++ ) { // Loop 4 times to get the 4 Bytes
    storedCard[i] = EEPROM.read(start + i); // Assign values read from EEPROM to array
    }
    }

    ///////////////////////////////////////// Add ID to EEPROM ///////////////////////////////////
    void writeID( byte a[] ) {
    if ( !findID( a ) ) { // Before we write to the EEPROM, check to see if we have seen this card before!
    uint8_t num = EEPROM.read(0); // Get the numer of used spaces, position 0 stores the number of ID cards
    uint8_t start = ( num * 4 ) + 6; // Figure out where the next slot starts
    num++; // Increment the counter by one
    EEPROM.write( 0, num ); // Write the new count to the counter
    for ( uint8_t j = 0; j < 4; j++ ) { // Loop 4 times
    EEPROM.write( start + j, a[j] ); // Write the array values to EEPROM in the right position
    }
    successWrite();
    Serial.println(F("Succesfully added ID record to EEPROM"));
    }
    else {
    failedWrite();
    Serial.println(F("Failed! There is something wrong with ID or bad EEPROM"));
    }
    }

    ///////////////////////////////////////// Remove ID from EEPROM ///////////////////////////////////
    void deleteID( byte a[] ) {
    if ( !findID( a ) ) { // Before we delete from the EEPROM, check to see if we have this card!
    failedWrite(); // If not
    Serial.println(F("Failed! There is something wrong with ID or bad EEPROM"));
    }
    else {
    uint8_t num = EEPROM.read(0); // Get the numer of used spaces, position 0 stores the number of ID cards
    uint8_t slot; // Figure out the slot number of the card
    uint8_t start; // = ( num * 4 ) + 6; // Figure out where the next slot starts
    uint8_t looping; // The number of times the loop repeats
    uint8_t j;
    uint8_t count = EEPROM.read(0); // Read the first Byte of EEPROM that stores number of cards
    slot = findIDSLOT( a ); // Figure out the slot number of the card to delete
    start = (slot * 4) + 2;
    looping = ((num – slot) * 4);
    num–; // Decrement the counter by one
    EEPROM.write( 0, num ); // Write the new count to the counter
    for ( j = 0; j < looping; j++ ) { // Loop the card shift times
    EEPROM.write( start + j, EEPROM.read(start + 4 + j)); // Shift the array values to 4 places earlier in the EEPROM
    }
    for ( uint8_t k = 0; k < 4; k++ ) { // Shifting loop
    EEPROM.write( start + j + k, 0);
    }
    successDelete();
    Serial.println(F("Succesfully removed ID record from EEPROM"));
    }
    }

    ///////////////////////////////////////// Check Bytes ///////////////////////////////////
    bool checkTwo ( byte a[], byte b[] ) {
    for ( uint8_t k = 0; k < 4; k++ ) { // Loop 4 times
    if ( a[k] != b[k] ) { // IF a != b then false, because: one fails, all fail
    return false;
    }
    }
    return true;
    }

    ///////////////////////////////////////// Find Slot ///////////////////////////////////
    uint8_t findIDSLOT( byte find[] ) {
    uint8_t count = EEPROM.read(0); // Read the first Byte of EEPROM that
    for ( uint8_t i = 1; i <= count; i++ ) { // Loop once for each EEPROM entry
    readID(i); // Read an ID from EEPROM, it is stored in storedCard[4]
    if ( checkTwo( find, storedCard ) ) { // Check to see if the storedCard read from EEPROM
    // is the same as the find[] ID card passed
    return i; // The slot number of the card
    }
    }
    }

    ///////////////////////////////////////// Find ID From EEPROM ///////////////////////////////////
    bool findID( byte find[] ) {
    uint8_t count = EEPROM.read(0); // Read the first Byte of EEPROM that
    for ( uint8_t i = 1; i < count; i++ ) { // Loop once for each EEPROM entry
    readID(i); // Read an ID from EEPROM, it is stored in storedCard[4]
    if ( checkTwo( find, storedCard ) ) { // Check to see if the storedCard read from EEPROM
    return true;
    }
    else { // If not, return false
    }
    }
    return false;
    }

    ///////////////////////////////////////// Write Success to EEPROM ///////////////////////////////////
    // Flashes the green LED 3 times to indicate a successful write to EEPROM
    void successWrite() {
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is on
    delay(200);
    digitalWrite(greenLed, LED_ON); // Make sure green LED is on
    delay(200);
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    delay(200);
    digitalWrite(greenLed, LED_ON); // Make sure green LED is on
    delay(200);
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    delay(200);
    digitalWrite(greenLed, LED_ON); // Make sure green LED is on
    delay(200);
    }

    ///////////////////////////////////////// Write Failed to EEPROM ///////////////////////////////////
    // Flashes the red LED 3 times to indicate a failed write to EEPROM
    void failedWrite() {
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    delay(200);
    digitalWrite(redLed, LED_ON); // Make sure red LED is on
    delay(200);
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    delay(200);
    digitalWrite(redLed, LED_ON); // Make sure red LED is on
    delay(200);
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    delay(200);
    digitalWrite(redLed, LED_ON); // Make sure red LED is on
    delay(200);
    }

    ///////////////////////////////////////// Success Remove UID From EEPROM ///////////////////////////////////
    // Flashes the blue LED 3 times to indicate a success delete to EEPROM
    void successDelete() {
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    delay(200);
    digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
    delay(200);
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    delay(200);
    digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
    delay(200);
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    delay(200);
    digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
    delay(200);
    }

    ////////////////////// Check readCard IF is masterCard ///////////////////////////////////
    // Check to see if the ID passed is the master programing card
    bool isMaster( byte test[] ) {
    return checkTwo(test, masterCard);
    }

    bool monitorWipeButton(uint32_t interval) {
    uint32_t now = (uint32_t)millis();
    while ((uint32_t)millis() – now < interval) {
    // check on every half a second
    if (((uint32_t)millis() % 500) == 0) {
    if (digitalRead(wipeB) != LOW)
    return false;
    }
    }
    return true;
    }

  • سلام. خسته نباشید اینم کد با توانایی استفاده از رله. و اینکه امیدوارم اولین نفر باشم 🙂

    #include // We are going to read and write PICC’s UIDs from/to EEPROM
    #include // RC522 Module uses SPI protocol
    #include // Library for Mifare RC522 Devices

    /*
    Instead of a Relay you may want to use a servo. Servos can lock and unlock door locks too
    Relay will be used by default
    */

    // #include

    /*
    For visualizing whats going on hardware we need some leds and to control door lock a relay and a wipe button
    (or some other hardware) Used common anode led,digitalWriting HIGH turns OFF led Mind that if you are going
    to use common cathode led or just seperate leds, simply comment out #define COMMON_ANODE,
    */

    #define COMMON_ANODE

    #ifdef COMMON_ANODE
    #define LED_ON LOW
    #define LED_OFF HIGH
    #else
    #define LED_ON HIGH
    #define LED_OFF LOW
    #endif

    #define redLed 7 // Set Led Pins
    #define greenLed 6
    #define blueLed 5

    #define relay 4 // Set Relay Pin
    #define wipeB 3 // Button pin for WipeMode

    bool programMode = false; // initialize programming mode to false

    uint8_t successRead; // Variable integer to keep if we have Successful Read from Reader

    byte storedCard[4]; // Stores an ID read from EEPROM
    byte readCard[4]; // Stores scanned ID read from RFID Module
    byte masterCard[4]; // Stores master card’s ID read from EEPROM

    // Create MFRC522 instance.
    #define SS_PIN 10
    #define RST_PIN 9
    MFRC522 mfrc522(SS_PIN, RST_PIN);

    ///////////////////////////////////////// Setup ///////////////////////////////////
    void setup() {
    //Arduino Pin Configuration
    pinMode(redLed, OUTPUT);
    pinMode(greenLed, OUTPUT);
    pinMode(blueLed, OUTPUT);
    pinMode(wipeB, INPUT_PULLUP); // Enable pin’s pull up resistor
    pinMode(relay, OUTPUT);
    //Be careful how relay circuit behave on while resetting or power-cycling your Arduino
    digitalWrite(relay, HIGH); // Make sure door is locked
    digitalWrite(redLed, LED_OFF); // Make sure led is off
    digitalWrite(greenLed, LED_OFF); // Make sure led is off
    digitalWrite(blueLed, LED_OFF); // Make sure led is off

    //Protocol Configuration
    Serial.begin(9600); // Initialize serial communications with PC
    SPI.begin(); // MFRC522 Hardware uses SPI protocol
    mfrc522.PCD_Init(); // Initialize MFRC522 Hardware

    //If you set Antenna Gain to Max it will increase reading distance
    //mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max);

    Serial.println(F(“Access Control Example v0.1”)); // For debugging purposes
    ShowReaderDetails(); // Show details of PCD – MFRC522 Card Reader details

    //Wipe Code – If the Button (wipeB) Pressed while setup run (powered on) it wipes EEPROM
    if (digitalRead(wipeB) == LOW) { // when button pressed pin should get low, button connected to ground
    digitalWrite(redLed, LED_ON); // Red Led stays on to inform user we are going to wipe
    Serial.println(F(“Wipe Button Pressed”));
    Serial.println(F(“You have 10 seconds to Cancel”));
    Serial.println(F(“This will be remove all records and cannot be undone”));
    bool buttonState = monitorWipeButton(10000); // Give user enough time to cancel operation
    if (buttonState == true && digitalRead(wipeB) == LOW) { // If button still be pressed, wipe EEPROM
    Serial.println(F(“Starting Wiping EEPROM”));
    for (uint16_t x = 0; x < EEPROM.length(); x = x + 1) { //Loop end of EEPROM address
    if (EEPROM.read(x) == 0) { //If EEPROM address 0
    // do nothing, already clear, go to the next address in order to save time and reduce writes to EEPROM
    }
    else {
    EEPROM.write(x, 0); // if not write 0 to clear, it takes 3.3mS
    }
    }
    Serial.println(F("EEPROM Successfully Wiped"));
    digitalWrite(redLed, LED_OFF); // visualize a successful wipe
    delay(200);
    digitalWrite(redLed, LED_ON);
    delay(200);
    digitalWrite(redLed, LED_OFF);
    delay(200);
    digitalWrite(redLed, LED_ON);
    delay(200);
    digitalWrite(redLed, LED_OFF);
    }
    else {
    Serial.println(F("Wiping Cancelled")); // Show some feedback that the wipe button did not pressed for 15 seconds
    digitalWrite(redLed, LED_OFF);
    }
    }
    // Check if master card defined, if not let user choose a master card
    // This also useful to just redefine the Master Card
    // You can keep other EEPROM records just write other than 143 to EEPROM address 1
    // EEPROM address 1 should hold magical number which is '143'
    if (EEPROM.read(1) != 143) {
    Serial.println(F("No Master Card Defined"));
    Serial.println(F("Scan A PICC to Define as Master Card"));
    do {
    successRead = getID(); // sets successRead to 1 when we get read from reader otherwise 0
    digitalWrite(blueLed, LED_ON); // Visualize Master Card need to be defined
    delay(200);
    digitalWrite(blueLed, LED_OFF);
    delay(200);
    }
    while (!successRead); // Program will not go further while you not get a successful read
    for ( uint8_t j = 0; j < 4; j++ ) { // Loop 4 times
    EEPROM.write( 2 + j, readCard[j] ); // Write scanned PICC's UID to EEPROM, start from address 3
    }
    EEPROM.write(1, 143); // Write to EEPROM we defined Master Card.
    Serial.println(F("Master Card Defined"));
    }
    Serial.println(F("——————-"));
    Serial.println(F("Master Card's UID"));
    for ( uint8_t i = 0; i < 4; i++ ) { // Read Master Card's UID from EEPROM
    masterCard[i] = EEPROM.read(2 + i); // Write it to masterCard
    Serial.print(masterCard[i], HEX);
    }
    Serial.println("");
    Serial.println(F("——————-"));
    Serial.println(F("Everything is ready"));
    Serial.println(F("Waiting PICCs to be scanned"));
    cycleLeds(); // Everything ready lets give user some feedback by cycling leds
    }

    ///////////////////////////////////////// Main Loop ///////////////////////////////////
    void loop () {
    do {
    successRead = getID(); // sets successRead to 1 when we get read from reader otherwise 0
    // When device is in use if wipe button pressed for 10 seconds initialize Master Card wiping
    if (digitalRead(wipeB) == LOW) { // Check if button is pressed
    // Visualize normal operation is iterrupted by pressing wipe button Red is like more Warning to user
    digitalWrite(redLed, LED_ON); // Make sure led is off
    digitalWrite(greenLed, LED_OFF); // Make sure led is off
    digitalWrite(blueLed, LED_OFF); // Make sure led is off
    // Give some feedback
    Serial.println(F("Wipe Button Pressed"));
    Serial.println(F("Master Card will be Erased! in 10 seconds"));
    bool buttonState = monitorWipeButton(10000); // Give user enough time to cancel operation
    if (buttonState == true && digitalRead(wipeB) == LOW) { // If button still be pressed, wipe EEPROM
    EEPROM.write(1, 0); // Reset Magic Number.
    Serial.println(F("Master Card Erased from device"));
    Serial.println(F("Please reset to re-program Master Card"));
    while (1);
    }
    Serial.println(F("Master Card Erase Cancelled"));
    }
    if (programMode) {
    cycleLeds(); // Program Mode cycles through Red Green Blue waiting to read a new card
    }
    else {
    normalModeOn(); // Normal mode, blue Power LED is on, all others are off
    }
    }
    while (!successRead); //the program will not go further while you are not getting a successful read
    if (programMode) {
    if ( isMaster(readCard) ) { //When in program mode check First If master card scanned again to exit program mode
    Serial.println(F("Master Card Scanned"));
    Serial.println(F("Exiting Program Mode"));
    Serial.println(F("—————————–"));
    programMode = false;
    return;
    }
    else {
    if ( findID(readCard) ) { // If scanned card is known delete it
    Serial.println(F("I know this PICC, removing…"));
    deleteID(readCard);
    Serial.println("—————————–");
    Serial.println(F("Scan a PICC to ADD or REMOVE to EEPROM"));
    }
    else { // If scanned card is not known add it
    Serial.println(F("I do not know this PICC, adding…"));
    writeID(readCard);
    Serial.println(F("—————————–"));
    Serial.println(F("Scan a PICC to ADD or REMOVE to EEPROM"));
    }
    }
    }
    else {
    if ( isMaster(readCard)) { // If scanned card's ID matches Master Card's ID – enter program mode
    programMode = true;
    Serial.println(F("Hello Master – Entered Program Mode"));
    uint8_t count = EEPROM.read(0); // Read the first Byte of EEPROM that
    Serial.print(F("I have ")); // stores the number of ID's in EEPROM
    Serial.print(count);
    Serial.print(F(" record(s) on EEPROM"));
    Serial.println("");
    Serial.println(F("Scan a PICC to ADD or REMOVE to EEPROM"));
    Serial.println(F("Scan Master Card again to Exit Program Mode"));
    Serial.println(F("—————————–"));
    }
    else {
    if ( findID(readCard) ) { // If not, see if the card is in the EEPROM
    Serial.println(F("Welcome, You shall pass"));
    granted(300); // Open the door lock for 300 ms
    }
    else { // If not, show that the ID was not valid
    Serial.println(F("You shall not pass"));
    denied();
    }
    }
    }
    }

    ///////////////////////////////////////// Access Granted ///////////////////////////////////
    void granted ( uint16_t setDelay) {
    digitalWrite(blueLed, LED_OFF); // Turn off blue LED
    digitalWrite(redLed, LED_OFF); // Turn off red LED
    digitalWrite(greenLed, LED_ON); // Turn on green LED
    digitalWrite(relay, LOW); // Unlock door!
    delay(setDelay); // Hold door lock open for given seconds
    digitalWrite(relay, HIGH); // Relock door
    delay(1000); // Hold green LED on for a second
    }

    ///////////////////////////////////////// Access Denied ///////////////////////////////////
    void denied() {
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    digitalWrite(redLed, LED_ON); // Turn on red LED
    delay(1000);
    }

    ///////////////////////////////////////// Get PICC's UID ///////////////////////////////////
    uint8_t getID() {
    // Getting ready for Reading PICCs
    if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
    return 0;
    }
    if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
    return 0;
    }
    // There are Mifare PICCs which have 4 byte or 7 byte UID care if you use 7 byte PICC
    // I think we should assume every PICC as they have 4 byte UID
    // Until we support 7 byte PICCs
    Serial.println(F("Scanned PICC's UID:"));
    for ( uint8_t i = 0; i < 4; i++) { //
    readCard[i] = mfrc522.uid.uidByte[i];
    Serial.print(readCard[i], HEX);
    }
    Serial.println("");
    mfrc522.PICC_HaltA(); // Stop reading
    return 1;
    }

    void ShowReaderDetails() {
    // Get the MFRC522 software version
    byte v = mfrc522.PCD_ReadRegister(mfrc522.VersionReg);
    Serial.print(F("MFRC522 Software Version: 0x"));
    Serial.print(v, HEX);
    if (v == 0x91)
    Serial.print(F(" = v1.0"));
    else if (v == 0x92)
    Serial.print(F(" = v2.0"));
    else
    Serial.print(F(" (unknown),probably a chinese clone?"));
    Serial.println("");
    // When 0x00 or 0xFF is returned, communication probably failed
    if ((v == 0x00) || (v == 0xFF)) {
    Serial.println(F("WARNING: Communication failure, is the MFRC522 properly connected?"));
    Serial.println(F("SYSTEM HALTED: Check connections."));
    // Visualize system is halted
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    digitalWrite(redLed, LED_ON); // Turn on red LED
    while (true); // do not go further
    }
    }

    ///////////////////////////////////////// Cycle Leds (Program Mode) ///////////////////////////////////
    void cycleLeds() {
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_ON); // Make sure green LED is on
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    delay(200);
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
    delay(200);
    digitalWrite(redLed, LED_ON); // Make sure red LED is on
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    delay(200);
    }

    //////////////////////////////////////// Normal Mode Led ///////////////////////////////////
    void normalModeOn () {
    digitalWrite(blueLed, LED_ON); // Blue LED ON and ready to read card
    digitalWrite(redLed, LED_OFF); // Make sure Red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure Green LED is off
    digitalWrite(relay, HIGH); // Make sure Door is Locked
    }

    //////////////////////////////////////// Read an ID from EEPROM //////////////////////////////
    void readID( uint8_t number ) {
    uint8_t start = (number * 4 ) + 2; // Figure out starting position
    for ( uint8_t i = 0; i < 4; i++ ) { // Loop 4 times to get the 4 Bytes
    storedCard[i] = EEPROM.read(start + i); // Assign values read from EEPROM to array
    }
    }

    ///////////////////////////////////////// Add ID to EEPROM ///////////////////////////////////
    void writeID( byte a[] ) {
    if ( !findID( a ) ) { // Before we write to the EEPROM, check to see if we have seen this card before!
    uint8_t num = EEPROM.read(0); // Get the numer of used spaces, position 0 stores the number of ID cards
    uint8_t start = ( num * 4 ) + 6; // Figure out where the next slot starts
    num++; // Increment the counter by one
    EEPROM.write( 0, num ); // Write the new count to the counter
    for ( uint8_t j = 0; j < 4; j++ ) { // Loop 4 times
    EEPROM.write( start + j, a[j] ); // Write the array values to EEPROM in the right position
    }
    successWrite();
    Serial.println(F("Succesfully added ID record to EEPROM"));
    }
    else {
    failedWrite();
    Serial.println(F("Failed! There is something wrong with ID or bad EEPROM"));
    }
    }

    ///////////////////////////////////////// Remove ID from EEPROM ///////////////////////////////////
    void deleteID( byte a[] ) {
    if ( !findID( a ) ) { // Before we delete from the EEPROM, check to see if we have this card!
    failedWrite(); // If not
    Serial.println(F("Failed! There is something wrong with ID or bad EEPROM"));
    }
    else {
    uint8_t num = EEPROM.read(0); // Get the numer of used spaces, position 0 stores the number of ID cards
    uint8_t slot; // Figure out the slot number of the card
    uint8_t start; // = ( num * 4 ) + 6; // Figure out where the next slot starts
    uint8_t looping; // The number of times the loop repeats
    uint8_t j;
    uint8_t count = EEPROM.read(0); // Read the first Byte of EEPROM that stores number of cards
    slot = findIDSLOT( a ); // Figure out the slot number of the card to delete
    start = (slot * 4) + 2;
    looping = ((num – slot) * 4);
    num–; // Decrement the counter by one
    EEPROM.write( 0, num ); // Write the new count to the counter
    for ( j = 0; j < looping; j++ ) { // Loop the card shift times
    EEPROM.write( start + j, EEPROM.read(start + 4 + j)); // Shift the array values to 4 places earlier in the EEPROM
    }
    for ( uint8_t k = 0; k < 4; k++ ) { // Shifting loop
    EEPROM.write( start + j + k, 0);
    }
    successDelete();
    Serial.println(F("Succesfully removed ID record from EEPROM"));
    }
    }

    ///////////////////////////////////////// Check Bytes ///////////////////////////////////
    bool checkTwo ( byte a[], byte b[] ) {
    for ( uint8_t k = 0; k < 4; k++ ) { // Loop 4 times
    if ( a[k] != b[k] ) { // IF a != b then false, because: one fails, all fail
    return false;
    }
    }
    return true;
    }

    ///////////////////////////////////////// Find Slot ///////////////////////////////////
    uint8_t findIDSLOT( byte find[] ) {
    uint8_t count = EEPROM.read(0); // Read the first Byte of EEPROM that
    for ( uint8_t i = 1; i <= count; i++ ) { // Loop once for each EEPROM entry
    readID(i); // Read an ID from EEPROM, it is stored in storedCard[4]
    if ( checkTwo( find, storedCard ) ) { // Check to see if the storedCard read from EEPROM
    // is the same as the find[] ID card passed
    return i; // The slot number of the card
    }
    }
    }

    ///////////////////////////////////////// Find ID From EEPROM ///////////////////////////////////
    bool findID( byte find[] ) {
    uint8_t count = EEPROM.read(0); // Read the first Byte of EEPROM that
    for ( uint8_t i = 1; i < count; i++ ) { // Loop once for each EEPROM entry
    readID(i); // Read an ID from EEPROM, it is stored in storedCard[4]
    if ( checkTwo( find, storedCard ) ) { // Check to see if the storedCard read from EEPROM
    return true;
    }
    else { // If not, return false
    }
    }
    return false;
    }

    ///////////////////////////////////////// Write Success to EEPROM ///////////////////////////////////
    // Flashes the green LED 3 times to indicate a successful write to EEPROM
    void successWrite() {
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is on
    delay(200);
    digitalWrite(greenLed, LED_ON); // Make sure green LED is on
    delay(200);
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    delay(200);
    digitalWrite(greenLed, LED_ON); // Make sure green LED is on
    delay(200);
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    delay(200);
    digitalWrite(greenLed, LED_ON); // Make sure green LED is on
    delay(200);
    }

    ///////////////////////////////////////// Write Failed to EEPROM ///////////////////////////////////
    // Flashes the red LED 3 times to indicate a failed write to EEPROM
    void failedWrite() {
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    delay(200);
    digitalWrite(redLed, LED_ON); // Make sure red LED is on
    delay(200);
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    delay(200);
    digitalWrite(redLed, LED_ON); // Make sure red LED is on
    delay(200);
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    delay(200);
    digitalWrite(redLed, LED_ON); // Make sure red LED is on
    delay(200);
    }

    ///////////////////////////////////////// Success Remove UID From EEPROM ///////////////////////////////////
    // Flashes the blue LED 3 times to indicate a success delete to EEPROM
    void successDelete() {
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    digitalWrite(redLed, LED_OFF); // Make sure red LED is off
    digitalWrite(greenLed, LED_OFF); // Make sure green LED is off
    delay(200);
    digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
    delay(200);
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    delay(200);
    digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
    delay(200);
    digitalWrite(blueLed, LED_OFF); // Make sure blue LED is off
    delay(200);
    digitalWrite(blueLed, LED_ON); // Make sure blue LED is on
    delay(200);
    }

    ////////////////////// Check readCard IF is masterCard ///////////////////////////////////
    // Check to see if the ID passed is the master programing card
    bool isMaster( byte test[] ) {
    return checkTwo(test, masterCard);
    }

    bool monitorWipeButton(uint32_t interval) {
    uint32_t now = (uint32_t)millis();
    while ((uint32_t)millis() – now < interval) {
    // check on every half a second
    if (((uint32_t)millis() % 500) == 0) {
    if (digitalRead(wipeB) != LOW)
    return false;
    }
    }
    return true;
    }

    • با سلام
      از توجه شما ممنونم.
      هدف از تعریف پروژه، رشد و کمک به دیگر کاربران می‌باشد. کدهای ارسالی توسط شما با استناد به کامنت های درج شده در کد به صورت کپی می‌باشد.
      کدها را اصلاح و مجددا ارسال نمایید.

  • سلام
    تشکر از آموزش خوبتون میخواستم بدونم حافظه EEPROM چند بار میتونه READ وWRITE انجام بده ؟
    ایا محدودیت داره ؟

  • سلام.زمانی که کارت ها شناسایی شدن باید دوباره کد رو وارد اردینو کرد یا از نرم افزار خارج شد؟؟

    • سلام
      خیر کد در حافظه برنامه ذخیره شده است. سوال خود را شفاف تر بیان کنید تا راهنمایی شود.

  • سلام ممنون از پروژهای خوبتون من این پروژه را پیاده کردم عملکردش عالیه فقط میخواستم بدونم چجوری میشه با تگ فعال مجدد با تگ غیر فعال بشه ممنون میشم راهنمایی کنید

    • با سلام
      در این خصوص بایستی در کدها تغییراتی اعمال کنید. کد تگ را بخوانید و سپس با دستور برنامه نویسی if else برای تگ شرط فعال و عدم فعال را تعریف کنید. تمامی این مراحل بایستی در حلقه Loop نوشته شود.

  • سلام
    من همزمان از RFID RC522وPIR حرکتی استفاده میکنم با UNOمشکل من اینه که کد نویسی هر کدوم به تنهایی جواب میده ولی وقتی با هم مینویسم PIR جواب نمیده ممنون

    • با سلام
      در نظر داشته باشید توابعی که در حلقه نوشته اید صحیح باشد. ممکن است در فراخوانی هر تابع در حلقه مشکلی وجود داشته باشد.

  • سلام
    چه جوری میشه چند کد تگ به صورت هگز رو وارد یک طرح کرد
    بردم اردیونو هست ولی یک کد اپلود میشه؟

  • باسلام
    میخواستم ببینیم از دوستان کسی در مورد اتصال آردوینو به کارتخوان فروشگاهی میتونه کمکم کن
    مرسی

    • با سلام
      کاربر گرامی پیام شما منتشر شد. همچنین توضیحات کاملتری دهید، تا راهنمایی شود.

  • سلام وقتتون بخیر
    میخواستم بدونم که این پروژه یا ماژول rc522 رو میشه داخل پروتئوس شبیه سازی کرد؟

  • سلام اگر به خروجی انالوگ وصل بشه چه فرقی می کنه لطفاً اگر واتساپ یا تلگرام دارید یا ایمل کنید با تشکر

    • با سلام
      کاربر گرامی سوال شما واضج نیست.
      همچنین تمامی موارد فقط از طریق سایت امکان پذیر است.

  • سلام وقتتون بخیر.عذر میخوام بنده قصد دارم یک دستگاهی بسازم که وقتی تگ روی ماژول قرار میگیرد یک رله وصل شود و زمانی که تگ برداشته میشود رله قطع شود.امکانش هست بنده را راهنمایی کنین متشکرم

      • سلام روز بخیر
        بنده این اموزش را کاملا مطالعه کردم اما در این دستگاه رله به صورت لحظه ای وصل یا قطع میشه
        بنده میخواهم تا زمانی که تگ روی ماژول قرار دارد رله وصل باشد و به محض دور شدن تگ از ماژول،رله قطع شود
        مانند سیستم برق اتاق هتل

  • سلام من کد ها رو روی آردوینو انتقال دادم ولی وقتی کارت ها رو به RFID نزدیک میکنم هیچ علایمی نشون نمیده ایا امکانش هست که با any desk به لپ تاپ من وصل بشید و این رو درست کنید ؟

    • با سلام
      کاربر گرامی در این خصوص در ابتدا وضیعت سریال مانیتور را اعلام کنید تا بررسی شود.

  • سلام وقتتون بخیر
    بنده از ماژول EM_18 استفاده میکنم
    و کد ساده ای رو نوشتم که درصورت دسترس بودن تگی که تعریف شده led روشن بشه ولی با هر تگی که امتحان میکنم led روشن میشه
    میتونید در این زمینه راهنماییم کنید