Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Arduino как се прави база данни и четене
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=17871
Страница 1 от 1

Автор:  koko76bj [ Пет Май 07, 2021 10:15 am ]
Заглавие:  Arduino как се прави база данни и четене

Здравейте,
написах един код за RFID четец за врата,който си работи нормално.Но не знам как може да се направи една променлива от базата с данни на UID и после да се чете.Не знам дали се изразих правилно.Написах го по "бабешки" начин и не ми харесва много как изглежда.

Код:
byte Key_1_UID[4] = {0x3A, 0xC9, 0x6A, 0xCB};
byte Key_2_UID[4] = {0x35, 0x21, 0x8B, 0x17};
byte Key_3_UID[4] = {0x20, 0x02, 0x7B, 0x25};
byte Key_4_UID[4] = {0x3F, 0xF1, 0x4B, 0x15};


може ли това да се направи в една променлива?

и може ли това с четенето да е по-кратко?

Код:
if (rfid.uid.uidByte[0] == Key_1_UID[0] &&
          rfid.uid.uidByte[1] == Key_1_UID[1] &&
          rfid.uid.uidByte[2] == Key_1_UID[2] &&
          rfid.uid.uidByte[3] == Key_1_UID[3] ) {
       
        digitalWrite(RELAY_DOOR, HIGH);  // unlock the door for 2 seconds
        delay(2000);
        digitalWrite(RELAY_DOOR, LOW);   // lock the door
      }
      else
      if (rfid.uid.uidByte[0] == Key_2_UID[0] &&
          rfid.uid.uidByte[1] == Key_2_UID[1] &&
          rfid.uid.uidByte[2] == Key_2_UID[2] &&
          rfid.uid.uidByte[3] == Key_2_UID[3] ) {
       
        digitalWrite(RELAY_DOOR, HIGH);  // unlock the door for 2 seconds
        delay(2000);
        digitalWrite(RELAY_DOOR, LOW);   // lock the door
      }
       else
      if (rfid.uid.uidByte[0] == Key_3_UID[0] &&
          rfid.uid.uidByte[1] == Key_3_UID[1] &&
          rfid.uid.uidByte[2] == Key_3_UID[2] &&
          rfid.uid.uidByte[3] == Key_3_UID[3] ) {
        ;
        digitalWrite(RELAY_DOOR, HIGH);  // unlock the door for 2 seconds
        delay(2000);
        digitalWrite(RELAY_DOOR, LOW);   // lock the door
      }
       else
      if (rfid.uid.uidByte[0] == Key_4_UID[0] &&
          rfid.uid.uidByte[1] == Key_4_UID[1] &&
          rfid.uid.uidByte[2] == Key_4_UID[2] &&
          rfid.uid.uidByte[3] == Key_4_UID[3] ) {
       
        digitalWrite(RELAY_DOOR, HIGH);  // unlock the door for 2 seconds
        delay(2000);
        digitalWrite(RELAY_DOOR, LOW);   // lock the door
      }


дано ме разберете какво питам.

Автор:  t_i_t_o [ Пет Май 07, 2021 11:51 am ]
Заглавие:  Re: Arduino как се прави база данни и четене

Сложи ключевете в двумерен масив и после в цикъл един по един ги проверявай с memcmp(), нещо от сорта:

#define KEYS_NUM 4
#define KEY_LEN 4

byte keys[KEYS_NUM][KEY_LEN] =
{
{0x3A, 0xC9, 0x6A, 0xCB},
{0x35, 0x21, 0x8B, 0x17},
...
}

for (i = 0; i < KEYS_NUM; i++)
{
if (!memcmp(keys[i], rfid.uid.uidByte, KEY_LEN))
{
digitalWrite(RELAY_DOOR, HIGH); // unlock the door for 2 seconds
delay(2000);
digitalWrite(RELAY_DOOR, LOW); // lock the door
}
}

Ама най добре да не ги хардкодваш в кода ами да ги записваш в епрома с някакъв мастър ключ... аз така направих преди 10 години за входа на блока. Така няма нужда да ребилдваш и препрограмираш ако искаш да добавиш нов ключ.

Автор:  koko76bj [ Пет Май 07, 2021 12:03 pm ]
Заглавие:  Re: Arduino как се прави база данни и четене

Няма да се добавят или махат ключове,тези четирите ще са само.Благодаря ти.

Автор:  TheWizard [ Пет Май 07, 2021 2:58 pm ]
Заглавие:  Re: Arduino как се прави база данни и четене

4 байта е 32 битов инт

uint32_t data;
rfid_read( &data, 4);

for( int i = 0; i < KEY_NUMBERS; i++ )
if ( data == key[i] ) ... ok, break;

Автор:  t_i_t_o [ Пет Май 07, 2021 3:09 pm ]
Заглавие:  Re: Arduino как се прави база данни и четене

TheWizard написа:
4 байта е 32 битов инт

+1 Това още повече опростява кода, т.е. ключовете може да си ги сложиш в едномерен uint32 масив с 4 елемента и вместо memcmp() да използваш "==".

Автор:  itso.t [ Пет Май 07, 2021 4:44 pm ]
Заглавие:  Re: Arduino как се прави база данни и четене

koko76bj написа:
Няма да се добавят или махат ключове,тези четирите ще са само.Благодаря ти.

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

Автор:  koko76bj [ Пет Май 07, 2021 5:25 pm ]
Заглавие:  Re: Arduino как се прави база данни и четене

TheWizard написа:
4 байта е 32 битов инт

uint32_t data;
rfid_read( &data, 4);

for( int i = 0; i < KEY_NUMBERS; i++ )
if ( data == key[i] ) ... ok, break;


t_i_t_o написа:
ключовете може да си ги сложиш в едномерен uint32 масив с 4 елемента и вместо memcmp() да използваш "==".


Това не го разбрах.Къде се прави масива?
Извинявам се че задавам такива въпроси но още имам да уча,не съм на вашето ниво.

Автор:  TheWizard [ Пет Май 07, 2021 5:46 pm ]
Заглавие:  Re: Arduino как се прави база данни и четене

Код:
const uint32_t key[4] = {
   0x11223344, // ключ 1
   0x22334455, // ключ 2
   0x33445566,
   0x44556677,
}

int data;
rfid_read( &data, 4); // сигурно имаш функция за четене на масив данни от ерфида
printf("%X\n", data); // принт да вземеш числото за кей масива

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/