RFID

Тема в разделе "Arduino & Shields", создана пользователем Дэн Пискунов, 19 ноя 2016.

  1. Помогите новичку ... Как сделать что-бы приложил к сканеру карту реле включилось ещё раз приложил выключалось !
     
  2. qwone

    qwone Гик

    Код (C++):
    /*
    #1 светодиод -> 13 (led_pin) 1 горит / 0 нет

    #2 RFID_RC522 RST -> 9 (RST_pin)
            SDA(SS)-> 10 (SDA_pin)
            MOSI   -> 11 (MOSI_pin)
            MISO   -> 12 (MISO_pin)
            SCK    -> 13 (SCK_pin)
            3,3В   -> 3,3В
            GND    -> GND

            Card UID: E6 38 FE 13  брелок
    */

    //#1
    const int led_pin = 13; //нога светодиода
    uint8_t Led;// значение на нем
    //#2
    byte uidCard[4] = {0xE6, 0x38, 0xFE, 0x13};
    #include <SPI.h>
    #include <MFRC522.h>
    const int SDA_pin = 10;
    const int RST_pin = 9;
    MFRC522 rfid(SDA_pin, RST_pin); // Instance of the class
    uint8_t RFID_btn = 0; // 1 есть правильная карточка / 0 нет или карточки или неправильная

    void setup() {
      //#1
      pinMode(led_pin, OUTPUT);   // инициализировать светодиод
      digitalWrite(led_pin, Led = 1); // и погасить светодиод
      //#2
      SPI.begin(); // Init SPI bus
      rfid.PCD_Init(); // Init MFRC522
    }

    void loop() {
      //#1
      //#2
      static uint32_t past_1 = 0 ;
      if (millis() - past_1 >= 200) { // опрос карточки идет каждые 200 миллисек
        past_1 = millis() ;
        RFID_btn = RFID_btn << 1;
        if ( rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial() &&
             rfid.uid.uidByte[0] == uidCard[0] &&
             rfid.uid.uidByte[1] == uidCard[1] &&
             rfid.uid.uidByte[2] == uidCard[2] &&
             rfid.uid.uidByte[3] == uidCard[3] )
          RFID_btn = RFID_btn | 1;
        if  ((RFID_btn & 3) == 1)digitalWrite(led_pin, Led = ! Led);
      }
    }
     
  3. Airbus

    Airbus Радиохулиган Модератор

    У Вас будет реагировать на конкретную Вашу карту с UID 0xE6, 0x38, 0xFE, 0x13 если не нужно читать UID карты а просто само её наличие то всё гораздо проще.
    Код (C++):
    /*
    * MOSI: Pin 11
    * MISO: Pin 12
    * SCK: Pin 13
    * SS: Pin 10
    * RST: Pin 8
    */

    #include <SPI.h>
    #include "RFID.h"
    int led = 12; //пин 12 как выход
    #define SS_PIN 10 //SS пин 10
    #define RST_PIN 8 //RST пин 8
    RFID rfid(SS_PIN, RST_PIN);
    // Setup variables:
    void setup()
    {
    SPI.begin();
    rfid.init();
    pinMode(led, OUTPUT); //Пин 12 на выход
    }
    void loop()
    { if (rfid.isCard()) //если есть ответ от карты
      {
    digitalWrite(led, HIGH); //включаем
       }
    else {
      digitalWrite(led, LOW);  //если нет выключаем
           }
              }
     
  4. он не работает не удалось определить
     
  5. что в этом коде . выполняется ?! я не понял . мне надо просто с помощью кода карты включить реле которая на 4 пине .
     
  6. qwone

    qwone Гик

    Дэн Пискунов . И что вы не можете поменять в const int led_pin =13;//нога светодиода
    цифру 13 на 4. Реле надеюсь включается при 1?
    byte uidCard[4]={0xE6, 0x38, 0xFE, 0x13};
    А здесь поставить номер своей карты. Или собираетесь включать выключать любой картой?
     
    Последнее редактирование: 29 ноя 2016
  7. Airbus

    Airbus Радиохулиган Модератор

    Ну да так и есть.А самому подумать не?
     
  8. а как добавить ещё карту
     
  9. #include "RFID.h" где взять эту библиотеку ?
     
  10. Tomasina

    Tomasina Сушитель лампочек Модератор

  11. qwone

    qwone Гик

    Ну можно и так.
    Код (C++):
    /*
    #1 светодиод -> 13 (led_pin) 1 горит / 0 нет

    #2 RFID_RC522 RST -> 9 (RST_pin)
            SDA(SS)-> 10 (SDA_pin)
            MOSI   -> 11 (MOSI_pin)
            MISO   -> 12 (MISO_pin)
            SCK    -> 13 (SCK_pin)
            3,3В   -> 3,3В
            GND    -> GND

    */

    //#1
    const int led_pin = 13; //нога светодиода
    uint8_t Led;// значение на нем
    //#2
    #include <SPI.h>
    #include <MFRC522.h>
    const int SDA_pin = 10;
    const int RST_pin = 9;
    MFRC522 rfid(SDA_pin, RST_pin); // Instance of the class
    uint8_t RFID_btn = 0; // 1 есть  карточка / 0 нет  карточки

    void setup() {
      //#1
      pinMode(led_pin, OUTPUT);   // инициализировать светодиод
      digitalWrite(led_pin, Led = 1); // и погасить светодиод
      //#2
      SPI.begin(); // Init SPI bus
      rfid.PCD_Init(); // Init MFRC522
    }

    void loop() {
      //#1
      //#2
      static uint32_t past_1 = 0 ;
      if (millis() - past_1 >= 200) { // опрос карточки идет каждые 200 миллисек
        past_1 = millis() ;
        RFID_btn = (RFID_btn << 1) | rfid.PICC_IsNewCardPresent();
        if  ((RFID_btn & 3) == 1)digitalWrite(led_pin, Led = ! Led);
      }
    }
     
    Последнее редактирование: 29 ноя 2016
  12. Airbus

    Airbus Радиохулиган Модератор

    Можно и без неё если у Вас MFRC522.h будет работать.Тогда в Скетче от qwone ничего менять не надо. RFID.h и MFRC522.h одно и то же но MFRC522.h у меня отказывается работать напрочь.
     
  13. qwone

    qwone Гик

    Код на 4 карточки
    Код (C++):
    /*
    #1 светодиод -> 13 (led_pin) 1 горит / 0 нет

    #2 RFID_RC522 RST -> 9 (RST_pin)
            SDA(SS)-> 10 (SDA_pin)
            MOSI   -> 11 (MOSI_pin)
            MISO   -> 12 (MISO_pin)
            SCK    -> 13 (SCK_pin)
            3,3В   -> 3,3В
            GND    -> GND

            Card UID: E6 38 FE 13  брелок 1
            Card UID: E6 38 FE 10  брелок 2
            Card UID: E6 38 FE 11  брелок 3
            Card UID: E6 38 FE 12  брелок 4
    */

    //#1
    const int led_pin = 13; //нога светодиода
    uint8_t Led;// значение на нем
    //#2
    byte uidCard1[4] = {0xE6, 0x38, 0xFE, 0x13};
    byte uidCard2[4] = {0xE6, 0x38, 0xFE, 0x10};
    byte uidCard3[4] = {0xE6, 0x38, 0xFE, 0x11};
    byte uidCard4[4] = {0xE6, 0x38, 0xFE, 0x12};
    #include <SPI.h>
    #include <MFRC522.h>
    const int SDA_pin = 10;
    const int RST_pin = 9;
    MFRC522 rfid(SDA_pin, RST_pin); // Instance of the class
    uint8_t RFID_btn = 0; // 1 есть правильная карточка / 0 нет или карточки или неправильная

    void setup() {
      //#1
      pinMode(led_pin, OUTPUT);   // инициализировать светодиод
      digitalWrite(led_pin, Led = 1); // и погасить светодиод
      //#2
      SPI.begin(); // Init SPI bus
      rfid.PCD_Init(); // Init MFRC522
    }

    void loop() {
      //#1
      //#2
      static uint32_t past_1 = 0 ;
      if ( millis() - past_1 >= 200) { // опрос карточки идет каждые 200 миллисек
        past_1 = millis() ;
        RFID_btn = RFID_btn << 1;
        if ( rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial() &&
             (
               rfid.uid.uidByte[0] == uidCard1[0] &&  // проверка 1 карточки
               rfid.uid.uidByte[1] == uidCard1[1] &&
               rfid.uid.uidByte[2] == uidCard1[2] &&
               rfid.uid.uidByte[3] == uidCard1[3] ||
               rfid.uid.uidByte[0] == uidCard2[0] &&  // проверка 2 карточки
               rfid.uid.uidByte[1] == uidCard2[1] &&
               rfid.uid.uidByte[2] == uidCard2[2] &&
               rfid.uid.uidByte[3] == uidCard2[3] ||
               rfid.uid.uidByte[0] == uidCard3[0] &&  // проверка 3 карточки
               rfid.uid.uidByte[1] == uidCard3[1] &&
               rfid.uid.uidByte[2] == uidCard3[2] &&
               rfid.uid.uidByte[3] == uidCard3[3] ||  // проверка 4 карточки
               rfid.uid.uidByte[0] == uidCard4[0] &&
               rfid.uid.uidByte[1] == uidCard4[1] &&
               rfid.uid.uidByte[2] == uidCard4[2] &&
               rfid.uid.uidByte[3] == uidCard4[3]
             )
           )
          RFID_btn = RFID_btn | 1;
        if  ((RFID_btn & 3) == 1) digitalWrite(led_pin, Led = ! Led);
      }
    }
     
  14. qwone

    qwone Гик

    Код (C++):
    /*
    #1 светодиод -> 13 (led_pin) 1 горит / 0 нет

    #2 RFID_RC522 RST -> 9 (RST_pin)
            SDA(SS)-> 10 (SDA_pin)
            MOSI   -> 11 (MOSI_pin)
            MISO   -> 12 (MISO_pin)
            SCK    -> 13 (SCK_pin)
            3,3В   -> 3,3В
            GND    -> GND

            Card UID: E6 38 FE 13  брелок 1
            Card UID: E6 38 FE 10  брелок 2
            Card UID: E6 38 FE 11  брелок 3
            Card UID: E6 38 FE 12  брелок 4
    */

    //#1
    const int led_pin = 13; //нога светодиода
    uint8_t Led;// значение на нем
    //#2
    byte uidCard1[4] = {0xE6, 0x38, 0xFE, 0x13};
    byte uidCard2[4] = {0xE6, 0x38, 0xFE, 0x10};
    byte uidCard3[4] = {0xE6, 0x38, 0xFE, 0x11};
    byte uidCard4[4] = {0xE6, 0x38, 0xFE, 0x12};
    #include <SPI.h>
    #include <MFRC522.h>
    const int SDA_pin = 10;
    const int RST_pin = 9;
    MFRC522 rfid(SDA_pin, RST_pin); // Instance of the class
    uint8_t RFID_btn = 0; // 1 есть правильная карточка / 0 нет или карточки или неправильная
    uint8_t  Card;

    void setup() {
      Serial.begin(9600);
      //#1
      pinMode(led_pin, OUTPUT);   // инициализировать светодиод
      digitalWrite(led_pin, Led = 1); // и погасить светодиод
      //#2
      SPI.begin(); // Init SPI bus
      rfid.PCD_Init(); // Init MFRC522

    }

    void loop() {
      //#1
      //#2
      static uint32_t past_1 = 0 ;
      if ( millis() - past_1 >= 200) { // опрос карточки идет каждые 200 миллисек
        past_1 = millis() ;
        RFID_btn = RFID_btn << 1;
        if ( rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
          if  (rfid.uid.uidByte[0] == uidCard1[0] &&  // проверка 1 карточки
               rfid.uid.uidByte[1] == uidCard1[1] &&
               rfid.uid.uidByte[2] == uidCard1[2] &&
               rfid.uid.uidByte[3] == uidCard1[3] ) {
            RFID_btn = RFID_btn | 1;
            Card = 1;
          }
          if (rfid.uid.uidByte[0] == uidCard2[0] && // проверка 2 карточки
              rfid.uid.uidByte[1] == uidCard2[1] &&
              rfid.uid.uidByte[2] == uidCard2[2] &&
              rfid.uid.uidByte[3] == uidCard2[3] ) {
            RFID_btn = RFID_btn | 1;
            Card = 2;
          }
          if ( rfid.uid.uidByte[0] == uidCard3[0] && // проверка 3 карточки
               rfid.uid.uidByte[1] == uidCard3[1] &&
               rfid.uid.uidByte[2] == uidCard3[2] &&
               rfid.uid.uidByte[3] == uidCard3[3]  ) {
            RFID_btn = RFID_btn | 1;
            Card = 3;
          }
          if (rfid.uid.uidByte[0] == uidCard4[0] && // проверка 4 карточки
              rfid.uid.uidByte[1] == uidCard4[1] &&
              rfid.uid.uidByte[2] == uidCard4[2] &&
              rfid.uid.uidByte[3] == uidCard4[3]) {
            RFID_btn = RFID_btn | 1;
            Card = 4;
          }
          if  ((RFID_btn & 3) == 1) {
            digitalWrite(led_pin, Led = ! Led);
            Serial.print("Card :");
            Serial.println(Card);
          }
        }
      }
    }
     
  15. Tomasina

    Tomasina Сушитель лампочек Модератор

    а зачем так сложно - проверять кварты, если можно использовать псевдохеш?
     
    Airbus и Neilon нравится это.
  16. qwone

    qwone Гик

    Ну да. Зачем делать сложно, если можно сделать еще сложнее код, мудреней и не надежней.
     
  17. Tomasina

    Tomasina Сушитель лампочек Модератор

    гм, что тут заумного по сравнению с вашим кодом??
    Код (C++):
    #define RFID_MASTER     4037699341
    #define RFID_STOP       3325048478
    #define RFID_RESTART    3858093365
    #define RFID_PLAY       511694389

    void loop()
    {
      unsigned long currentID = readRFID();   // опрос ридера
      switch (currentID)
        {
          case RFID_MASTER :
             // blip
            break;

          case RFID_PLAY:
             // blop
            break;

          case RFID_STOP:
             // blap
            break;

          case RFID_RESTART:
             // blup
            break;

          case CARD_NONE:
             // clap
            break;

          case CARD_ERROR:
             // clop
            break;
        }
    }

    unsigned long readRFID()
    {
      unsigned long uidDec;    // псевдо-хеш: десятичное представление ID карты
      if (!mfrc522.PICC_IsNewCardPresent())  return CARD_NONE;// метки нет
      else if (mfrc522.PICC_ReadCardSerial()) // метка есть и удалось прочитать
      {
        for (byte i = 0; i < mfrc522.uid.size; i++) uidDec = uidDec * 256 + mfrc522.uid.uidByte[i];
        mfrc522.PICC_ReadCardSerial();
        return uidDec;
      }
      else return CARD_ERROR; // метка есть, но прочитать не удалось
    }
     
    Бонусом получаем возможность отслеживания состояния ридера: карты нет, карта есть, карту убрали (не из-за хеша, чуть другая архитектура кода).
     
  18. qwone

    qwone Гик

    С моей точки , ничего не выиграли. Ни размер исходника, ни понимания. Это как какой карандаш слаще:желтый или красный.