Интеллектуальный контроль доступа на основе Arduino uno и ЖК-дисплея

kakaxi
Offline
Зарегистрирован: 20.07.2021
Краткое введение
 
Умный дом становится все более распространенным с развитием технологий, эта статья будет посвящена аспектам безопасности проекта интеллектуального контроля доступа.
В этой статье используется сенсорный экран STONE для отправки команд на MCU для управления реле и модулем MFRC522.
Принцип чтения карт: при управлении RFID-RC522 модуль, определить ID карты ID близко к ID карты, а затем определить, существует ли ID в базе данных слова типичный, ID является типичным значением слова, если существование проверки через, а затем распечатать соответствующее имя, а затем привести в действие электромагнитный замок таким же образом.
 
Необходимые материалы
 
Arduino Uno
Электронный замок KOB
Реле
Сенсорный дисплей STONE STWI070WT-01
Модуль MFRC522
 
Реализованная функция
 
1. регистрация карты.
2. регистрация имени пользователя и пароля.
3. проведение картой для разблокировки электронного замка.
4. Имя пользователя и пароль для разблокировки электронного замка.
 
Схема подключения

Разработка графического интерфейса пользователя

код

#include <SPI.h>
#include <MFRC522.h>
//#include <ArduinoJson.h>
//#include <SoftwareSerial.h>
 
#define SS_PIN 10
#define RST_PIN 9

#define clocks 7
 
MFRC522 rfid(SS_PIN, RST_PIN);
 

byte nuidPICC[4];
byte nuidPICC2[4];
unsigned char RX1_BUF[50];

unsigned char RX3_BUF[10];

uint8_t count_i=0;
uint8_t tag=0;

int idsnum = 4;

//uint32_t nuidPICC2=0;

//int numwei = 32;
//unsigned char names[100]={'a',"lbw"};
//unsigned char names[100]={"zbw","lbw"};
//unsigned char *cnames=names[0];
unsigned char names[30][10] = {"zbw",0};
unsigned char names2[30][10] = {"zbw",0};
unsigned char ids[50]={0x13,0xA5,0x5D,0x04};
unsigned char password1[30][20]={"zbw3366",0};
unsigned char admin[2][5]={"yyds",0};
int names_nums = 0;

void card_read();
void password_read();
void password_regit();
void printHex(byte *buffer, byte bufferSize);

void setup()
{
   Serial.begin(115200);
   SPI.begin();
  rfid.PCD_Init();
  pinMode(clocks, OUTPUT);

}

void loop(){

 while (Serial.available())
  {
    RX1_BUF[count_i]=Serial.read();
    Serial.println(RX1_BUF[count_i]);
    count_i++;
    }
    //memcpy(RX2_BUF,RX1_BUF,count_i);
    
    if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 1))
  {
    Serial.println();
    Serial.println("button");
    for(tag=0;tag<RX1_BUF[6]-1;tag++)
        {
          RX3_BUF[tag]=RX1_BUF[tag+7];
        }
    }
    memset(RX1_BUF,0,count_i);
    

    if(((strcmp("card2",(const char *)RX3_BUF))==0)){
    memset(RX3_BUF,0,count_i);
    count_i=0;
    card_read((const char*)*names2, 100, 10);
    }
    else if(((strcmp("password2",(const char *)RX3_BUF))==0)){
    memset(RX3_BUF,0,count_i);
    count_i=0;
    Serial.println(count_i);
    password_read((const char*)*names, 100, 10, (const char*)*password1, 100, 20);
    }
    else if(((strcmp("password1",(const char *)RX3_BUF))==0)){
    memset(RX3_BUF,0,count_i);
    count_i=0;
    Serial.println(count_i);
    password_regit((const char*)*admin, 2, 2, *names);
    }
    else if(((strcmp("card1",(const char *)RX3_BUF))==0)){
    memset(RX3_BUF,0,count_i);
    count_i=0;
    Serial.println(count_i);
    card_regit((const char*)*admin, 2, 2);
    }
    count_i=0;
}

void card_read(char *namess, int n, int m){
  Serial.println("card_read");
  count_i=0;

  while(1){

    while (Serial.available())
  {
    RX1_BUF[count_i]=Serial.read();
    Serial.println(RX1_BUF[count_i]);
    count_i++;
    }
    if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 1))
  {
    Serial.println();
    Serial.println("button");
    for(tag=0;tag<RX1_BUF[6]-1;tag++)
        {
          RX3_BUF[tag]=RX1_BUF[tag+7];
        }
    }
    memset(RX1_BUF,0,count_i);
    count_i=0;

    if(((strcmp("back3",(const char *)RX3_BUF))==0)){
    Serial.println("back_home");
    return;
    }

  
  if ( ! rfid.PICC_IsNewCardPresent())
    continue;
 
  
  if ( ! rfid.PICC_ReadCardSerial())
    continue;
 
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
 
  
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println("not support");
    continue;
  }
  
  
  for (byte i = 0,nuidPICC2 = 0,numwei = 32; i < 4; i++) {
    //Serial.println(rfid.uid.uidByte[i]);
    nuidPICC[i] = rfid.uid.uidByte[i];
    Serial.println(nuidPICC[i],HEX);
    //nuidPICC2 = rfid.uid.uidByte[i];
    //nuidPICC2 = nuidPICC2 << (numwei-8);
  } 

  Serial.println();

  Serial.println(&(*(namess+1*10)));

  
  rfid.PICC_HaltA();
 
  
  rfid.PCD_StopCrypto1();
  for (int id_num = 0;id_num < 100; id_num++){
  if ((nuidPICC[0] == ids[id_num])&&(nuidPICC[1] == ids[id_num+1])&&(nuidPICC[2] == ids[id_num+2])&&(nuidPICC[3] == ids[id_num+3]))
  {
    //cnames = names[id_num];
    if(((strcmp("",&(*(namess+(id_num/4)*10))))==0))break;
    //if(&(*(namess+(id_num/4)*10)) == "")break;
    Serial.print(id_num);
    Serial.print("UID:");
    Serial.print(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"cardname1\",\"text\":\""));
    //for(int id_nums = 0;id_nums < 10;id_nums++)
    //{
   // Serial.print(&(*(namess + id_num + id_nums - 1)));
    //Serial.print(&(*(namess + id_num + id_nums - 1)));
    //}
    Serial.print(&(*(namess + (id_num/4)*10 )));
    Serial.print(F("\"}>ET"));
    printHex(rfid.uid.uidByte, rfid.uid.size);
    digitalWrite(clocks, HIGH);
    Serial.println(F("ST<{\"cmd_code\":\"set_visible\",\"type\":\"widget\",\"widget\":\"gif4\",\"visible\":true}>ET"));
    delay(3000);
    digitalWrite(clocks, LOW);
    Serial.println(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"cardid1\",\"text\":\"\"}>ET"));
    Serial.println(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"cardname1\",\"text\":\"\"}>ET"));
    Serial.println(F("ST<{\"cmd_code\":\"set_visible\",\"type\":\"widget\",\"widget\":\"gif4\",\"visible\":false}>ET"));
    //nuidPICC2 = 0;
    break;
  }
  //nuidPICC2 = 0;
  }
}
}

void printHex(byte *buffer, byte bufferSize) {
  Serial.println();
  Serial.print(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"cardid1\",\"text\":\""));
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? "0" : "");
    Serial.print(buffer[i], HEX);
  }
  Serial.print(F("\"}>ET"));
}

void password_read(char *namess, int n, int m, char *passwords, int o, int p){
  
//  unsigned char RX4_BUF[10] = {0};
  unsigned char RX5_BUF[20] = {0};
//  unsigned char RX6_BUF[20] = {0};
  int name_true = 0;
  int password_true = 0;
  int i, j;
  int name_s = 0;
  Serial.println("password_read");
  

  while(1){

    while (Serial.available())
  {
    RX1_BUF[count_i]=Serial.read();
    Serial.println(RX1_BUF[count_i]);
    count_i++;
    }
    if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 1))
  {
    Serial.println();
    Serial.println("button");
    for(tag=0;tag<RX1_BUF[6]-1;tag++)
        {
          RX3_BUF[tag]=RX1_BUF[tag+7];
        }
        RX3_BUF[tag] = NULL;
        RX3_BUF[tag+1] = NULL;
        RX3_BUF[tag+2] = NULL;
    //Serial.println(((const char *)RX3_BUF)); 
    }
    else if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 112))
  {
    Serial.println();
    Serial.println("edit");
    for(name_s = 0; name_s < RX1_BUF[6]-8; name_s++)
    {
      RX5_BUF[name_s] = RX1_BUF[name_s+15];
    }
        RX5_BUF[name_s] = NULL;
        RX5_BUF[name_s+1] = NULL;
        RX5_BUF[name_s+2] = NULL;
    
        Serial.println(((const char *)RX5_BUF)); 
        if (RX1_BUF[12]==53){
    for (i=0;i<100;i++){
      for (j=0;j<10;j++){
        if (strcmp(&(*(namess + i*10 )),(const char*)RX5_BUF)==0)
        {name_true = 1;
        break;
        }
      }
      if(name_true == 1)break;
    }
        }

        else if (RX1_BUF[12]==54){
          for (;i<100;i++){
      for (j=0;j<20;j++){
        if (strcmp(&(*(passwords + i*20 )),(const char*)RX5_BUF)==0)
        {password_true = 1;
        break;
        }
      }
      if(name_true == 1)break;
    }
        }
    Serial.println(name_true);
    Serial.println(password_true);
    Serial.println(&(*(namess + 1*10 )));
    Serial.println(&(*(passwords + 1*20 )));
    if ((name_true == 1)&&(password_true == 1)){
    digitalWrite(clocks, HIGH);
    Serial.println(F("ST<{\"cmd_code\":\"set_visible\",\"type\":\"widget\",\"widget\":\"lock2\",\"visible\":true}>ET"));
    delay(3000);
    digitalWrite(clocks, LOW);
    Serial.println(F("ST<{\"cmd_code\":\"set_visible\",\"type\":\"widget\",\"widget\":\"lock2\",\"visible\":false}>ET"));
    Serial.println(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"edit\",\"widget\":\"edit5\",\"text\":\"\"}>ET"));
    Serial.println(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"edit\",\"widget\":\"edit6\",\"text\":\"\"}>ET"));
    name_true = password_true = 0;
    }
    }
    memset(RX1_BUF,0,count_i);
    count_i=0;

    if(((strcmp("back4",(const char *)RX3_BUF))==0)){
    Serial.println("back_home");
    return;


void password_regit(char *admins, int w, int e,char *namess){

  unsigned char RX6_BUF[20] = {0};
  unsigned char rname_BUF[10] = {0};
  unsigned char rpass_BUF[20] = {0};
//  unsigned char RX6_BUF[20] = {0};
  int name1_true = 0;
  int password1_true = 0;
  int admin1_true = 0;
  int name_s;
  //int n, p;
  Serial.println("password_regit");
  

  while(1){

    while (Serial.available())
  {
    RX1_BUF[count_i]=Serial.read();
    Serial.println(RX1_BUF[count_i]);
    count_i++;
    }
    if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 1))
  {
    Serial.println();
    Serial.println("button");
    for(tag=0;tag<RX1_BUF[6]-1;tag++)
        {
          RX3_BUF[tag]=RX1_BUF[tag+7];
        }
        RX3_BUF[tag] = NULL;
        RX3_BUF[tag+1] = NULL;
        RX3_BUF[tag+2] = NULL;
    }
    else if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 112))
  {
    Serial.println();
    Serial.println("edit");
    for(name_s = 0; name_s < RX1_BUF[6]-8; name_s++)
    {
      RX6_BUF[name_s] = RX1_BUF[name_s+15];
    }
    
        Serial.println(((const char *)RX6_BUF)); 
        if (RX1_BUF[12]==51)
        {
          memcpy(rname_BUF,RX6_BUF,name_s);
          name1_true = 1;
          rname_BUF[name_s] = NULL;
          rname_BUF[name_s+1] = NULL;
          rname_BUF[name_s+2] = NULL;
        }
        else if (RX1_BUF[12]==52)
        {
          memcpy(rpass_BUF,RX6_BUF,name_s);
          password1_true = 1;
          rpass_BUF[name_s] = NULL;
          rpass_BUF[name_s+1] = NULL;
          rpass_BUF[name_s+2] = NULL;
        }
        else if (RX1_BUF[12]==55)
        {
          if (strcmp(&(*(admins)),(const char*)RX6_BUF)==0)
          admin1_true = 1;
        }
        
        Serial.println(name1_true);
        Serial.println(password1_true);
        Serial.println(admin1_true);
//        Serial.println(&(*(admins)));
        Serial.println((const char*)rname_BUF);
        Serial.println((const char*)rpass_BUF);

        if ((name1_true == 1)&&(password1_true == 1)&&(admin1_true == 1))
        {
          names_nums++;

          strncpy(&(names[names_nums][0]), &rname_BUF[0], strlen(rname_BUF));
          strncpy(&(password1[names_nums][0]), &rpass_BUF[0], strlen(rpass_BUF));

          name1_true = password1_true = admin1_true = 0;
        }

    
  
}
    memset(RX1_BUF,0,count_i);
    count_i=0;
    if(((strcmp("back2",(const char *)RX3_BUF))==0)){
    Serial.println("back_home");
    return;
  }
}
}

void card_regit(char *admins, int w, int e){

  unsigned char RX7_BUF[20] = {0};
  unsigned char rname_BUF[10] = {0};
  unsigned char rpass_BUF[20] = {0};
  int name1_true = 0;
  int password1_true = 0;
  int admin1_true = 0;
  int name_s;
  int set_label = 0;
  Serial.println("card_regit");
  

  while(1){

    while (Serial.available())
  {
    RX1_BUF[count_i]=Serial.read();
    Serial.println(RX1_BUF[count_i]);
    count_i++;
    }
    if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 1))
  {
    Serial.println();
    Serial.println("button");
    for(tag=0;tag<RX1_BUF[6]-1;tag++)
        {
          RX3_BUF[tag]=RX1_BUF[tag+7];
        }
        RX3_BUF[tag] = NULL;
        RX3_BUF[tag+1] = NULL;
        RX3_BUF[tag+2] = NULL;
    //Serial.println(((const char *)RX3_BUF)); 
    }
    else if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 112))
  {
    Serial.println();
    Serial.println("edit");
    for(name_s = 0; name_s < RX1_BUF[6]-8; name_s++)
    {
      RX7_BUF[name_s] = RX1_BUF[name_s+15];
    }
    
        Serial.println(((const char *)RX7_BUF)); 
        if (RX1_BUF[12]==49)
        {
          memcpy(rname_BUF,RX7_BUF,name_s);
          name1_true = 1;
          rname_BUF[name_s] = NULL;
          rname_BUF[name_s+1] = NULL;
          rname_BUF[name_s+2] = NULL;
        }
        else if (RX1_BUF[12]==50)
        {
          if (strcmp(&(*(admins)),(const char*)RX7_BUF)==0)
          admin1_true = 1;
        }
        
        Serial.println(name1_true);
        Serial.println(admin1_true);
        Serial.println(&(*(admins)));

        

    
  
}

    memset(RX1_BUF,0,count_i);
    count_i=0;
    if(((strcmp("back1",(const char *)RX3_BUF))==0)){
    Serial.println("back_home");
    return;
  }
if ((name1_true == 1)&&(admin1_true == 1))
        {
          
          if (set_label == 0)Serial.println(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"cardid\",\"text\":\"please place card!\"}>ET"));
          set_label = 1;
          if ( ! rfid.PICC_IsNewCardPresent())
    continue;
 
  
  if ( ! rfid.PICC_ReadCardSerial())
    continue;
 
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
 
  
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println("not support");
    continue;
  }
  
  
  for (byte i = 0,nuidPICC2 = 0,numwei = 32; i < 4; i++,idsnum++) {
    nuidPICC[i] = rfid.uid.uidByte[i];
    ids[idsnum] = nuidPICC[i];
    Serial.println(ids[idsnum],HEX);
  }
  strncpy(&(names2[1][0]), &rname_BUF[0], strlen(rname_BUF)); 
  Serial.println(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"cardid\",\"text\":\"regit ok!\"}>ET"));
  delay(2000);
  Serial.println(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"cardid\",\"text\":\"\"}>ET"));
  Serial.println(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"edit\",\"widget\":\"edit1\",\"text\":\"\"}>ET"));
    Serial.println(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"edit\",\"widget\":\"edit2\",\"text\":\"\"}>ET"));
  
  
  rfid.PICC_HaltA();
  rfid.PCD_StopCrypto1();

        }

    
}
}

видеодемонстрация

https://www.youtube.com/watch?v=k2oEEy4Xijg

kakaxi
Offline
Зарегистрирован: 20.07.2021

Неправильная схема подключения, вот картинка, когда я делал это с ESP32. Вот схема подключения, когда я использую Arduino.

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

не код, а ник ТС. 

b707
Онлайн
Зарегистрирован: 26.05.2017

хм, это точно Уно?

byte nuidPICC[4];
byte nuidPICC2[4];
unsigned char RX1_BUF[50];
unsigned char RX3_BUF[10];
unsigned char names[30][10] = {"zbw",0};
unsigned char names2[30][10] = {"zbw",0};
unsigned char ids[50]={0x13,0xA5,0x5D,0x04};
unsigned char password1[30][20]={"zbw3366",0};
unsigned char admin[2][5]={"yyds",0};

примерно 1400 байт только в этих массивах...

Афтар, пиши ищо

renoshnik
Offline
Зарегистрирован: 11.04.2013
kakaxi
Offline
Зарегистрирован: 20.07.2021

Это uno, у меня только одна плата arduino.

kakaxi
Offline
Зарегистрирован: 20.07.2021

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