RFID выключатель

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

shadow174 пишет:

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

старайтесь выражаться яснее. Каких блоков, куда прописывать?

Логика того, почему байты проще - байтов в номере карты всего 4, а когда вы переведете их в символы - в зависмотсти от записи их станет от 12 до 15. И как, по Вашему, проще сравнивать?

Кстати, еще проще записывать номер карты как 32битное число. Там вообще сравнение в одно действие будет

shadow174
Offline
Зарегистрирован: 07.06.2021

b707 пишет:

shadow174 пишет:

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

старайтесь выражаться яснее. Каких блоков, куда прописывать?

Логика того, почему байты проще - байтов в номере карты всего 4, а когда вы переведете их в символы - в зависмотсти от записи их станет от 12 до 15. И как, по Вашему, проще сравнивать?

Кстати, еще проще записывать номер карты как 32битное число. Там вообще сравнение в одно действие будет

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

      
  if ( rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()){
if (rfid.uid.uidByte[0] == uidCard1[0] ||
    rfid.uid.uidByte[0] == uidCard1[1] ||
    rfid.uid.uidByte[0] == uidCard1[2] ||
    rfid.uid.uidByte[0] == uidCard1[3] ) { 
rfid_OK = 1;
past_1_1 = MILLIS ;
if ( ! lamp_ON) 
lamp_ON = 1;
Serial.println("lamp_ON");
digitalWrite(LOCK, LOW);     // Включаем реле
}
if (rfid.uid.uidByte[0] == uidCard2[0] ||
rfid.uid.uidByte[0] == uidCard2[1] ||
rfid.uid.uidByte[0] == uidCard2[2] ||
rfid.uid.uidByte[0] == uidCard2[3] ) {
rfid_OK = 1;
past_1_1 = MILLIS ;
if ( ! lamp_ON) {
lamp_ON = 1;
Serial.println("lamp_ON2");
digitalWrite(LOCK, LOW);     // Включаем реле

Мне кажется,что где то здесь и есть проблема.

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

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

Я смотрю, вы упорно не желаете исправлять ошибку, на которую я указал. Имеете что-то возразить? :)

shadow174
Offline
Зарегистрирован: 07.06.2021

b707 пишет:

Я смотрю, вы упорно не желаете исправлять ошибку, на которую я указал. Имеете что-то возразить? :)

Вы про эту ошибку?

if (rfid.uid.uidByte[0] == uidCard[0] ||
    rfid.uid.uidByte[0] == uidCard[1] ||
    rfid.uid.uidByte[0] == uidCard[2] ||
    rfid.uid.uidByte[0] == uidCard[3] ) { 
shadow174
Offline
Зарегистрирован: 07.06.2021

b707 пишет:

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

Вы про этот массив? Делаю по такому сценарию, вторая карта не реагирует

byte uidCard[][4] = {
                    {0xBA, 0x6B, 0xFE, 0xBE},
                    {0xCC, 0xB8, 0xC1, 0x38},
​                    };
/*
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
byte uidCard [][4] = {
                     {0xBA, 0x6B, 0xFE, 0xBE},
                     {0xE6, 0x38, 0xFE, 0x13},
                     };
  #include <SPI.h>
  #include <MFRC522.h>
  const int SDA_pin = 10;
  const int RST_pin = 9;
  const int LOCK = 6;         // подключаем электрозамок

  uint8_t lamp_ON = 0; // лампа горит 1/ 0 нет
  uint8_t rfid_OK = 0;// опознование успешно 1/ 0 нет
  MFRC522 rfid(SDA_pin, RST_pin); // Instance of the class

void setup() {
  Serial.begin(9600);
  //#1
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522
  pinMode(LOCK, OUTPUT);    //объявляем пин как выход.
  digitalWrite(LOCK, HIGH);  //Выключаем реле
  Serial.println("Поднесите карту к считывателю");
}

void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1
  if (! rfid_OK && lamp_ON) {
    lamp_ON = 0;
    Serial.println("Доступ запрещён");
    digitalWrite(LOCK, HIGH);     // Выключаем реле
  }
  static uint32_t past_1_1 = 0 ; // время в течении которого идет сброс флага успеш опознования
  if (rfid_OK && (MILLIS -  past_1_1 >= 100)) rfid_OK = 0; //  если в течении 100 миллисек не было успешного опознования
  static uint32_t past_1 = 0 ;
  if (MILLIS - past_1 >= 20) { // опрос карточки идет каждые 20 миллисек
    past_1 = MILLIS ;
    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_OK = 1;
     past_1_1 = MILLIS ;
     if ( ! lamp_ON) {
     lamp_ON = 1;
     Serial.println("Доступ разрешён");
     digitalWrite(LOCK, LOW);     // Включаем реле
     Serial.print("UID:");
     String content= "";
     byte letter;
     for (byte i = 0; i < rfid.uid.size; i++) 
  {
     Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
     Serial.print(rfid.uid.uidByte[i], DEC);
     content.concat(String(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "));
     content.concat(String(rfid.uid.uidByte[i], DEC));
  }   
  }
  }
  }
  }

 

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

в строке 13 вы карты прописали в двумерном массиве, а в строке 51 читаете одномерный

shadow174
Offline
Зарегистрирован: 07.06.2021

b707 пишет:

в строке 13 вы карты прописали в двумерном массиве, а в строке 51 читаете одномерный

Как я понимаю строка 13 верно написана теперь, а что с 51 нужно сделать, чтобы стала двухмерной?

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

 

погодите,  мало просто обратится к двумерному массиву, надо перебрать его значения в цикле. А цикла в вашем коде вовсе нет, так что я про двумерность пока помолчу.

Старайтесь разбираться сами. У нас на форуме принято только подсказывать направление, а не делать задачу за новичка.

shadow174
Offline
Зарегистрирован: 07.06.2021

b707 пишет:

 

погодите,  мало просто обратится к двумерному массиву, надо перебрать его значения в цикле. А цикла в вашем коде вовсе нет, так что я про двумерность пока помолчу.

Старайтесь разбираться сами. У нас на форуме принято только подсказывать направление, а не делать задачу за новичка.


Если бы знал как решить задачу, разве отвлекал бы вас.
Запутался уже просто))

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

сорри, у меня пока нет времени расписывать подробно.

shadow174
Offline
Зарегистрирован: 07.06.2021

b707 пишет:

сорри, у меня пока нет времени расписывать подробно.


Вот так?
rfid.uid.uidByte[0] == uidCard[][0] &&
rfid.uid.uidByte[1] == uidCard[][1] &&
rfid.uid.uidByte[2] == uidCard[][2] &&
rfid.uid.uidByte[3] == uidCard[][3] ) {

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

shadow174 пишет:
b707 пишет:

 

погодите,  мало просто обратится к двумерному массиву, надо перебрать его значения в цикле. А цикла в вашем коде вовсе нет, так что я про двумерность пока помолчу.

Старайтесь разбираться сами. У нас на форуме принято только подсказывать направление, а не делать задачу за новичка.

Если бы знал как решить задачу, разве отвлекал бы вас. Запутался уже просто))

Тут есть два варианта - в зависимости от того, какого хотите добиться результата.

1. Если хотите научиться, отложите эту задачу и возьмите задачу попроще - с которой можете справиться.

2. Если нужна реализация конкретного проекта - то это только в коммерческий раздел "Ищу исполнителя".

shadow174
Offline
Зарегистрирован: 07.06.2021

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

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

shadow174 пишет:
Вот так? rfid.uid.uidByte[0] == uidCard[][0] && rfid.uid.uidByte[1] == uidCard[][1] && rfid.uid.uidByte[2] == uidCard[][2] && rfid.uid.uidByte[3] == uidCard[][3] ) {

ну а цикл-то где?

shadow174
Offline
Зарегистрирован: 07.06.2021

b707 пишет:

shadow174 пишет:
Вот так? rfid.uid.uidByte[0] == uidCard[][0] && rfid.uid.uidByte[1] == uidCard[][1] && rfid.uid.uidByte[2] == uidCard[][2] && rfid.uid.uidByte[3] == uidCard[][3] ) {

ну а цикл-то где?

Попробовал идти другим путем, но опять проблема с идендификацией карты - либо не реагирует, либо если закоментировать строку 59 - все подряд карты пропускает. Не пойму, что делать

[code]
/*
  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: BA 6B FE BE  карта №1
                  CC B8 C1 38  карта №2
*/
//#1
/*byte uidCard[][4] = {
                    {0xBA, 0x6B, 0xFE, 0xBE},
                    {0xCC, 0xB8, 0xC1, 0x38},

  };*/

uint32_t Card;
uint32_t Card1 = 0xBA6BFEBE;   //карта 1
uint32_t Card2 = 0xCCB8C138;  //карта 2
//
#include <SPI.h>
#include <MFRC522.h>
const int SDA_pin = 10;
const int RST_pin = 9;
const int LOCK = 6;    // подключаем реле
uint8_t lamp_ON = 0;  // лампа горит 1/ 0 нет
uint8_t rfid_OK = 0; // опознование успешно 1/ 0 нет
MFRC522 rfid(SDA_pin, RST_pin); // Instance of the class
//
void setup() {
  Serial.begin(9600);
  SPI.begin();      // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522
  pinMode(LOCK, OUTPUT);      //объявляем пин как выход.
  digitalWrite(LOCK, HIGH);  //выключаем реле
  Serial.println("Поднесите карту к считывателю");
}
//
void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  if (! rfid_OK && lamp_ON) {
    lamp_ON = 0;
    digitalWrite(LOCK, HIGH);  //Выключаем реле
    Serial.println("CARD_OFF");
  }
  static uint32_t past_1_1 = 0 ; // время в течении которого идет сброс флага успеш опознования
  if (rfid_OK && (MILLIS -  past_1_1 >= 100)) rfid_OK = 0; //  если в течении 100 миллисек не было успешного опознования
  static uint32_t past_1 = 0 ;
  if (MILLIS - past_1 >= 20) { // опрос карточки идет каждые 20 миллисек
    past_1 = MILLIS ;
    if ( rfid.PICC_IsNewCardPresent() && rfid.PICC_ReadCardSerial()) {
      Card = ((rfid.uid.uidByte[0] * 0x100 + rfid.uid.uidByte[1]) * 0x100 + rfid.uid.uidByte[2]) * 0x100 + rfid.uid.uidByte[3];

      if (Card == Card1) {
        rfid_OK = 1;
        past_1_1 = MILLIS ;
        if ( ! lamp_ON) {
          lamp_ON = 1;
          Serial.println("Card1");
          digitalWrite(LOCK, LOW);     // Включаем реле
        }
        if (Card == Card2) {
          rfid_OK = 1;
          past_1_1 = MILLIS ;
          if ( ! lamp_ON) {
            lamp_ON = 1;
            Serial.println("Card2");
            digitalWrite(LOCK, LOW);     // Включаем реле*/

          }
        }
      }
    }
  }
}
[/code]

 

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

вы код методом тыка пишете?

вы понимаете, что такое тип uint32_t? вот это что такое у вас? почему множители у каждого байта одинаковые?

Card = ((rfid.uid.uidByte[0] * 0x100 + rfid.uid.uidByte[1]) * 0x100 + rfid.uid.uidByte[2]) * 0x100 + rfid.uid.uidByte[3];

и, кстати, это никакой не "другой путь" - у вас опять для каждой карты свой повторяющийся кусок кода.

А если у вас будет 10 карт - так и будете писать 10 условий if (Card == Card1) ... и для каждой копию всех действий?

Отложите проект, почитайте что-нибудь про массивы и циклы, вы пока просто не готовы писать правильно.

shadow174
Offline
Зарегистрирован: 07.06.2021

Спасибо. Обязательно займусь самообразованием, тем более что это интересно.

Кое что, все таки получилось выжать - работает. Понимаю. что не совсем правильно и удобно, но пока хотя бы так.

Просто примеров как таковых не смог найти, чтобы как вы советуете сделать - не писать по 10 условий.

Ткните хоть примерно.

А тут, то что получилось..

/*
  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
byte uidCard1[4] = {0xBA, 0x6B, 0xFE, 0xBE};
byte uidCard2[4] = {0xCC, 0xB8, 0xC1, 0x38};
#include <SPI.h>
#include <MFRC522.h>
const int SDA_pin = 10;
const int RST_pin = 9;
uint8_t lamp_ON = 0; // лампа горит 1/ 0 нет
uint8_t rfid_OK = 0;// опознование успешно 1/ 0 нет
const int LOCK = 6;              // подключаем реле
MFRC522 rfid(SDA_pin, RST_pin); // Instance of the class
//
void setup() {
  Serial.begin(9600);
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522
  pinMode(LOCK, OUTPUT);      //объявляем пин как выход.
  digitalWrite(LOCK, HIGH);  //Выключаем реле
  Serial.println("Поднесите карту к считывателю");
}
void loop() {
  static uint32_t MILLIS ;
  MILLIS = millis() ;
  //#1
  if (! rfid_OK && lamp_ON) {
    lamp_ON = 0;
    Serial.println("lamp_OFF");
    digitalWrite(LOCK, HIGH);     // Выключаем реле
  }
  static uint32_t past_1_1 = 0 ; // время в течении которого идет сброс флага успеш опознования
  if (rfid_OK && (MILLIS -  past_1_1 >= 100)) rfid_OK = 0; //  если в течении 100 миллисек не было успешного опознования
  static uint32_t past_1 = 0 ;
  if (MILLIS - past_1 >= 20) { // опрос карточки идет каждые 20 миллисек
    past_1 = MILLIS ;
    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.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_OK = 1;
        past_1_1 = MILLIS ;
        if ( ! lamp_ON) {
          lamp_ON = 1;
          Serial.println("lamp_ON1");
          digitalWrite(LOCK, LOW);     // Включаем реле
        }
      }
    }
  }
}

 

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

shadow174 пишет:

Просто примеров как таковых не смог найти, чтобы как вы советуете сделать - не писать по 10 условий.

Ткните хоть примерно.

Не примеры нужно искать, а учебник читать.