3 RFIDRC522 + 3 светодиода

Тема в разделе "Arduino & Shields", создана пользователем Mgal, 14 мар 2017.

  1. Mgal

    Mgal Нуб

    Всем доброго времени суток. Пытаюсь создать имитационную модель своего проекта. Немного разобрался с Arduino, однако не хватает времени для более детального разбора и чем дальше лезу, тем больше путаюсь. Помогите, пожалуйста, составить программу. Буду очень благодарен.

    Попытаюсь доступно и полно описать алгоритм и все используемые датчики и приборы.

    Имеются 3 RFIDRC522, к каждому RFID относится по 3 светодиода (красный, желтый и синий), т.е. вот так
    [​IMG]



    Т.е. каждый из них представляет свой отдельный производственный участок 1, 2, 3 соответственно.

    Их всех нужно подключить к одной Ардуино (с этим я примерно разобрался – посмотрел видео в Youtube)


    Все RFID-reader располагаются в порядке очереди по нумерации. В определенный момент у RFID-reader может гореть только один светодиод.

    Суть заключается в следующем:

    Вначале ни на одном RFID-reader не зафиксированы метки, следовательно синий светодиоды каждого из них горят, а желтый и красный нет.


    Фиксация RFID-меток будет осуществляться по очереди с 1 по 3 RFID-reader.




    I) Ожидание фиксации меток


    II) Фиксация меток (причем нужно настроить так, чтобы сперва зафиксировались все метки, а потом происходила проверка условий ниже, иначе для каждой фиксации будет проверятся условие)

    Т.е. нужно чтобы программа после первой фиксации 1 метки, выдержала еще 2-3 секунды для фиксации остальных меток и после шла проверять условия описанные ниже.




    III) Если:


    1. Метки зафиксированы на RFID2: записать эти метки в его память, у него горит красный светодиод (остальные нет)


    Проверяются если ли на RFID1 такие же метки, которые зарегистрированы у RFID2, если да, то они удаляются, если нет, то остаются.


    Затем проверяются, остались ли у RFID1 еще метки, если да его светодиод горит красным, если нет, то желтым.


    Проверить есть ли у RFID3 метки, если да то у нее горит красный светодиод (остальные нет), если нет, то синий (остальные нет)


    Идем к пункту I



    2. Метки зафиксированы на RFID1, то записать эти метки в его память и его красный светодиод горит (а остальные нет)

    Проверить если на RFID2 метки, если есть, то его красный светодиод горит, иначе

    Если RFID3 содержит метки, то у RFID3 горит красный светодиод и у RFID2 желтый, если нет то RFID3 горит синим, а RFID2 горит синим.

    Идем к пункту I


    3. Если метка зарегистрирована на RFID3, то горит ее красный светодиод (а желтый и синий нет)

    Проверяются если ли на RFID2 такие же метки, которые зарегистрированы у RFID3, если да, то они удаляютя, если нет, то остаются. Затем проверяются, остались ли у RFID2 еще метки, если да его светодиод горит красным, если нет, то желтым.

    Если на RFID1 есть метки, то он горит красным, если нет и RFID2 не содержит меток, то синим, иначе желтым.

    Идем к пункту I
     
  2. Tomasina

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

    где вы нашли видео подключения нескольких RFID к одной Arduino? Тут народ уже два года пытается решить косяки, возникающие при таком подключении.
     
  3. Mgal

    Mgal Нуб

    Вот

     
  4. Tomasina

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

    ну видео хоть и свеженькое (год всего), но библиотека та же самая.
     
  5. Mgal

    Mgal Нуб

    А можно реализовать это, если использовать 3 Arduiono и к каждому подключить отдельно свой RFID и светодиоды?
     
  6. rkit

    rkit Гуру

    Участки далеко друг от друга? С длинными проводами не взлетит.
     
  7. Mgal

    Mgal Нуб

    Это имитационная модель. Просто показать как это функционирует. Мне нужно в живую показать изменения светодиодов, от того есть ли в памяти RFID номера меток или нет.
    Помогите хотя бы написать функцию, которая сохраняет UID всех меток поднесенных к RFID-reader.
    Как я понял:
    // Данные о номере карты хранятся в 5 переменных,
    int serNum0;
    int serNum1;
    int serNum2;
    int serNum3;
    int serNum4;
    Как можно вытащить цельный номер без разбиения и сохранить его в отдельную переменную?
     
  8. rkit

    rkit Гуру

    Никак. Нету таких больших типов. Читайте про массивы.
     
  9. Tomasina

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

    а так?
    Код (C++):
    unsigned long ID = serNum0 + serNum1*4 + serNum2*16 + serNum3*64 + serNum4*128;
     
  10. rkit

    rkit Гуру

    Там по 2 бита в интах. что ли?
     
  11. 9xA59kK

    9xA59kK Гик

    Это для примера, баловался RFID RC522 , но этот код надо допиливать он не полный, надеюсь для понимания процесса достаточно.
    Код (C++):


    #include <SPI.h>
    #include <RFID.h>

    #define SS_PIN 10
    #define RST_PIN 9  // reset пин

    RFID rfid(SS_PIN, RST_PIN);

    /* Setup variables:   создаем переменные размерностью byte, в эти переменный сохраним результат сканирования ID карты.    Этот пример для простоты понимания, можно и по другому писать код.*/
    // объявляем переменные
        byte serNum0;
        byte serNum1;
        byte serNum2;
        byte serNum3;              // 4 байта карты
      //  byte serNum4;           // 5 байт карты

        unsigned long MSBLSB = 0; //в этой переменной сохраним результат

    void loop()
    {

       if (rfid.isCard()) {    // ждем карту
            if (rfid.readCardSerial()) {    //читаем карту, используем 4 первых байта карты
                serNum0 = rfid.serNum[0];
                serNum1 = rfid.serNum[1];
                serNum2 = rfid.serNum[2];
                serNum3 = rfid.serNum[3];
            //  serNum4 = rfid.serNum[4];   // пятый байт карты
                MSBLSB = (((MSBLSB = serNum0 << 8 | serNum1)<<8 | serNum2)<< 8 | serNum3) ;    //Склеиваем MSB & LSB, преобразуем в 4 байтное целое число
    //-----------------------------------------------------------------------------------------------------------------------
    }
     
     
    Последнее редактирование: 22 мар 2017
  12. ostrov

    ostrov Гуру

    Что это не взлетит? RS-485 и полетит хоть за полтора км.
     
  13. ostrov

    ostrov Гуру

    Двухмерный массив: 5 на 3 в вашем случае самое то.