Вопрос по RFID

Arduino Uno
Offline
Зарегистрирован: 02.10.2017

Может ли ардуина посылать логическую единицу на конкретный пин, при выполнении следующих условий:

Есть 9 карт (у каждой соответственно свой уникальный ID)

Карты поделены на три группы.

1-я группа = 2 карты, которые должны активировать  первый пин 

2-я группа = 3 карты, которые должны активировать второй пин

3-я группа = 4 карты, которые должны активировать третий пин

Иными словами:

Как заставить Ардуину ждать и посылать логическую единицу на пин  при условии, что были поднесены все карты из группы (т.е. при поднесении одной карты из группы , не важно в какой последовательности, ардуина ждет следующую и только увидев все карты из группы питает конкретный пин)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Arduino Uno пишет:

Может ли ардуина посылать логическую единицу на конкретный пин

Может

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arduino Uno пишет:

Как заставить Ардуину ждать и посылать логическую единицу на пин  при условии, что были поднесены все карты из группы (т.е. при поднесении одной карты из группы , не важно в какой последовательности, ардуина ждет следующую и только увидев все карты из группы питает конкретный пин)

Здесь больше вопросов, чем ответов. Например, могут ли между картами одной группы, затёсыаться другие? Каков максимальный интервал времени между картами одной группы и т.д.

А заставить-то понятно как:

Arduino Uno
Offline
Зарегистрирован: 02.10.2017

Затесываться другие не могут. Интервал не имеет значения.
И каждая группа не связана с другими.
Т.е. нет задачи подносить все 9 карт, что бы запитать все 3 пина. Каждая группа карт применяется в строго определенной ситуации и применяется, только одна, для активации одного конкретного пина.

b707
Offline
Зарегистрирован: 26.05.2017

замечание не по делу - в ардуино существуют две темы, по которым задается максимальное число самых тупых вопросов - это автосигнализации с автозапуском и RFID

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arduino Uno пишет:
Затесываться другие не могут. Интервал не имеет значения.

Т.е., я правильно понимаю.

1. Поднесли карту из группы 1
2. Год нчего не подносили.
3. Поднесли вторую карту из группы 1
4. Всё сработало.

А вот если

1. Поднесли карту из группы 1
2. Год нчего не подносили.
3. Поднесли карту из группы 2
4. Система забыла про карту из группы1 и теперь остальных двух карт из группы 2, которые могут быть поднесены хоть через минуту, хоть через 10 лет?

 
Arduino Uno
Offline
Зарегистрирован: 02.10.2017

Если поднесли карту из группы 2, то ничего произошло.

Система ее проигнорировала и все еще ждет необходимую карту.

И обнуляется система с выключением/включением питания ардуины.

Иными словами, если я поднес карту 1 из второй группы, затем поднес карту 2, затем отключил ардуину и включил заново, то ардуина опять ждет любую карту из любой группы для активации на определенный пин.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ардуино Uno. Так все просто создайте объект по классу RFID , который вызывает две функции. 1 если карты 1 группы. а 2 если карты 2 группы. И объект класса замок, который откроется если последовательно придут методы 1, а потом 2. И все.

ПС: А если вы не сможете этот скетч написать, то и прочитать скетч тоже не сможете. А тупо писать код. И потом вы скажете что работает, не работает. Это будет моя глупость.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Евгений, полное ТЗ выпытывать - оно будет сильно сложно, как я погляжу :) Не все понимают нюансы мультисостояний системы, к сожалению. 

По теме вопроса, псевдокод (подчёркиваю, ПСЕВДОКОД, т.е. просто демонстация алгоритма). Т.е. компилироваться он не обязан, и не должен, а нужен лишь для того, чтобы больше вас запутать :

typedef struct
{
  unsigned long key;
  bool checked;
  
} RFIDKey;

RFIDKey keyGroup1[] = {
 {0x12345, false},
 {0x23456, false},
 {0x34567, false},
 {0, false} // конец списка
};

RFIDKey keyGroup2[] = {
 {0x98765, false},
 {0x87654, false},
 {0x76543, false},
 {0, false} // конец списка
};

RFIDKey* groups[] = {
  &keyGroup1,
  &keyGroup2,
  NULL
};

int currentWorkingGroup = -1;
RFIDKey lastReadedKey = 0;

bool findKeygroupByKey(const RFIDKey& key, int& keygroupIndex)
{
    int idx = 0;
    RFIDKey* array = groups[idx];
    
    while(array)
    {

      array = groups[idx++];
      while(*array.key != 0) 
      { 
        if(*array.key == key.key) 
         { 
          keygroupIndex = idx; 
          return true; 
         } 
       array++; 
      } 
     } 
    return false; 
} 

void setup() 
{ 
  Serial.begin(9600); 
} 

void loop() 
{ 
  if(rfid.keyPresent()) 
  { 
    RFIDKey currentkey = rfid.readKey(); 
    if(currentkey != lastReadedKey) 
    { 
      // new key on reader 
      int keygroupIndex; 
      if(findKeygroupByKey(currentkey,keygroupIndex)) 
      { 
        // known key 
        if(currentWorkingGroup == -1) // no working group 
        { 
          currentWorkingGroup = keygroupIndex;
          RFIDKey* array = groups[keygroupIndex];
          while(*array.key != 0) 
          {
            if(*array.key == key.key)
            {
                *array.checked = true;
                break;
            }
            array++;
          } 
        } 
        else // has working group 
        { 
          if(keygroupIndex != currentWorkingGroup) // not right group 
            return; 
            
            RFIDKey* array = groups[keygroupIndex]; 
            int totalInGroup = 0; 
            int totalCheckedInGroup = 0; 
            
            while(*array.key != 0) 
            { 
              totalInGroup++; 
              if(*array.key == key.key) 
                *array.checked = true; 
              
              if(*array.checked) 
                totalCheckedInGroup++; 
                
               array++; 
             } 
             
             if(totalInGroup == totalCheckedInGroup) 
             { 
                Serial.print("Total of keys in group "); 
                Serial.print(keygroupIndex); 
                Serial.println("was present on reader."); 
                // тут можно включать пин 
              } 
          } 
       } 
       lastReadedKey = currentkey; 
     } 
   } 
   else 
   { 
    lastReadedKey = 0; 
   } 
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вот мой каркас программы.

/**/
unsigned long mill; // переменная под millis()
//--------------------------------
// класс замок
class Cl_Lock {
  protected:
    byte pin1, pin2, pin3;
    byte stat = 0; //состояние 0 начало/1 пришла 1 карта /2 пришла 2 карта
  public:
    /*конструктор*/
    Cl_Lock(byte pin1_, byte pin2_, byte pin3_)
      : pin1(pin1), pin2(pin2), pin3(pin3) {}
    /*вставить в setup*/
    void init() {}
    /*вставить в loop*/
    void run() {}
    /*пришла 1 карта*/
    void Card1() {}
    /*пришла 2 карта*/
    void Card2() {}
};
//--------------------------------
// класс RFID
struct card_t {
  struct card_t (*next);
  unsigned long card;
};
class Cl_RFID {
  protected:
    struct card_t (*grup1) = NULL;
    struct card_t (*grup2) = NULL;
    void (*Do1)(), (*Do2)();
  public:
    /*конструктор*/
    Cl_RFID(void (*Do1_)(), void (*Do2_)())
      : Do1(Do1_), Do2(Do2_) {}
    /*вставить в setup*/
    void init() {}
    /*вставить в loop*/
    void run() {}
    /*добавить карту во 1 группу*/
    void AddCard1(unsigned long card_) {}
    /*добавить карту во 2 группу*/
    void AddCard2(unsigned long card_) {}
};
//---Компоновка-----------------------------
Cl_Lock Lock(/*пин1*/2,/*пин2*/3,/*пин3*/4);
void Do1() {
  Lock.Card1();
}
void Do2() {
  Lock.Card2();
}
Cl_RFID RFID(/*обработчик1*/&Do1,/*обработчик2*/&Do2);
//---main-----------------------------
void setup() {
  Lock.init();
  RFID.init();
  RFID.AddCard1(0x12345); // добавить карту в 1 группу
  RFID.AddCard1(0x12345);
  RFID.AddCard2(0x12345); // добавить карту в 2 группу
  RFID.AddCard2(0x12345);
}

void loop() {
  mill = millis();
  Lock.run();
  RFID.init();
}
/**/

ПС: Я не понимаю смысла в клянчаньи кода. У каждого кто долго занимался программирование выработался свой стиль, отличный не только от новичков, но и от друг друга.

Arduino Uno
Offline
Зарегистрирован: 02.10.2017

Господа, я искренне благодарю всех, кто вызвался подсказать и помочь, но мне кажется, что формулировка "клянчанье кода" не совсем правильная, ибо, смею предположить, для того и создаются подобные форумы, что бы те, кто ещё плохо разбираются в предмете, но имеющие некие задачи и желание их решить могли задать соответствующие вопросы тем, кто разбирается в этом лучше, а те, кто разбирается в этом лучше, могли дать соответствующие ответы. Иначе зачем они тут, зачем все это. Это же не закрытый клуб любителей Конского табака, где можно покурить молча или пообсуждать исключительно ненапрягающие светские новости. На том и стоит Интернет - обмен информацией, опытом и знаниями.

Arduino Uno
Offline
Зарегистрирован: 02.10.2017

P.s. А те, для кого большинство вопросов кажется тупым, посему, ничего , кроме как высказываться "не по теме" они не считают нужным, видимо родились в том состоянии и кондиции и с тем же багажем опыта и знаний в котором прибывают и по сей день. И вопросы их, на протяжении всей их жизни имели и имеют исключительно фундаментальное значение для академической науки.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arduino Uno пишет:

Если поднесли карту из группы 2, то ничего произошло.

Ну, вот. Вы же писали, что 

Arduino Uno пишет:
Затесываться другие не могут.

А теперь оказывается. пожалуйста - просто игнорируются.

Т.е. так:

1. Поднесли карту из группы 1
2. После этого можно подносить или не подносить карты их других групп, но когда (хоть через год) поднесут вторую карту игруппы 1, то всё сработает.

так?

И, кстати, что потом? Будет снова ждать первой карты из какой-т группы, а потом уже только из этой?

Arduino Uno
Offline
Зарегистрирован: 02.10.2017

Совершенно верно, после перезагрузки ардуины, система ждёт первую карту (но не карта под номером один, а любую произвольную из конкретной группы). Грубо говоря есть массив карт третей группы (ID1, ID2, ID3, ID4) поднося любую из карты этой группы, допустим ID3 она учитывается и продолжается ожидание, но уже оставшихся трёх карт ID1, ID2, ID4 ( не важно в какой последовательности). Подносим ID4 , система учла и ждёт ID1 и ID2, далее поднесли допустим ID1 и ждём ID2, подносим ID2 и ардуина посылает логическую еденицу на назначенный пин.

b707
Offline
Зарегистрирован: 26.05.2017

еще не по делу :)

почему-то именно те, кто задает самые тупые вопросы или приходит клянчить код - почему-то именно эти люди лучше других знают, зачем нужен этот форум и вообще интернет :)

 

Arduino Uno
Offline
Зарегистрирован: 02.10.2017

Ещё по делу. Почему-то именно те, кому нечего сказать, либо по причине сверх-обьемных знаний и как следствие неспособности их конвертировать в прикладные и общеупотребляемые данные или (как правило) по причине банального отсутствия любых знаний - встревают в обсуждения со словами "ещё не по теме". Не забывая посильней раздуть щеки создавая видимость всеосведомленности во всех вопросах.

b707
Offline
Зарегистрирован: 26.05.2017

вы правы, по теме я ничего полезного вам не скажу - ибо это пустая трата времени. Очевидно, что вы еще сами не знаете, что хотите. Если сейчас из вас просьбами и угорозами все-таки удастся вытащить внятное ТЗ - вы еще десять раз потом его измените и все равно останетесь недовольны :) Так что лучше не дергаться и смотреть на ваши метания со стороны, как тот старый стрелочник из рассказа Жванецкого

Рассказ "Куда толкать?" помните? - перечитайте, это про вас

Arduino Uno
Offline
Зарегистрирован: 02.10.2017

У Михаила Михайловича есть и про вас замечательный рассказ, про доцента, помните? Перечитайте.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

(анекдот)

 Первокласник зашел на профильный форум и спросил, как мне сдать EГЭ. Ему посыпалось куча вариантов. Ну так как он первокласник и он советы не понял. Тогда после 200-300 поста он сообщает форуму, что он первокласник и ему надо попроще. Ну форум разумеется в Ахуе. И тогда ему дали ценнный совет. Мол не спеши, кругом деградация знаний, искуственые ИИ, в общем подожди, в школу ходить не надо, не зачем забивать глупостью голову.

И прошло много лет и этот первокласник окончил школу и пришел пришел ЕГЭ. Все расселись и входит женщина и говорит. 

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

 Вот так бывший первокласник сдал "успешно" ЕГЭ. 

b707
Offline
Зарегистрирован: 26.05.2017

Arduino Uno пишет:
У Михаила Михайловича есть и про вас замечательный рассказ, про доцента, помните? Перечитайте.

тупой рассказ... никогда не мог понять, над чем они смеются...

infyniti
Offline
Зарегистрирован: 15.07.2017

Впринципе обычное задание для контроллера ни чего сверх естественнова 

infyniti
Offline
Зарегистрирован: 15.07.2017

Возьмите обычный код создайте в нем три функции вместо одной каждой айди присвойте 1 или 0 както так

 

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Arduino Uno пишет:
... для того и создаются подобные форумы, что бы те, кто ещё плохо разбираются в предмете... могли задать соответствующие вопросы тем, кто разбирается в этом лучше...

Нет, это просто евроинтеграция какая-то!

Ну почему все арабы уверены, что Европа существует именно для них, а не для коренных европейцев!?!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arduino Uno пишет:
.... ID2 и ардуина посылает логическую еденицу на назначенный пин.
Не вынуждайте меня прибегать к ненормативной лексике. Вы мой вопрос читали? Там же прямо спрашивалось, а дальше что? Ну, выставили HIGH и чо? Заснуть, зациклиться, спровоцировать землетрясение? Чего потом делать-то?