Интеллектуальный контроль доступа на основе 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. Имя пользователя и пароль для разблокировки электронного замка.
 
Схема подключения

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

код

001#include <SPI.h>
002#include <MFRC522.h>
003//#include <ArduinoJson.h>
004//#include <SoftwareSerial.h>
005  
006#define SS_PIN 10
007#define RST_PIN 9
008 
009#define clocks 7
010  
011MFRC522 rfid(SS_PIN, RST_PIN);
012  
013 
014byte nuidPICC[4];
015byte nuidPICC2[4];
016unsigned char RX1_BUF[50];
017 
018unsigned char RX3_BUF[10];
019 
020uint8_t count_i=0;
021uint8_t tag=0;
022 
023int idsnum = 4;
024 
025//uint32_t nuidPICC2=0;
026 
027//int numwei = 32;
028//unsigned char names[100]={'a',"lbw"};
029//unsigned char names[100]={"zbw","lbw"};
030//unsigned char *cnames=names[0];
031unsigned char names[30][10] = {"zbw",0};
032unsigned char names2[30][10] = {"zbw",0};
033unsigned char ids[50]={0x13,0xA5,0x5D,0x04};
034unsigned char password1[30][20]={"zbw3366",0};
035unsigned char admin[2][5]={"yyds",0};
036int names_nums = 0;
037 
038void card_read();
039void password_read();
040void password_regit();
041void printHex(byte *buffer, byte bufferSize);
042 
043void setup()
044{
045   Serial.begin(115200);
046   SPI.begin();
047  rfid.PCD_Init();
048  pinMode(clocks, OUTPUT);
049 
050}
051 
052void loop(){
053 
054 while (Serial.available())
055  {
056    RX1_BUF[count_i]=Serial.read();
057    Serial.println(RX1_BUF[count_i]);
058    count_i++;
059    }
060    //memcpy(RX2_BUF,RX1_BUF,count_i);
061     
062    if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 1))
063  {
064    Serial.println();
065    Serial.println("button");
066    for(tag=0;tag<RX1_BUF[6]-1;tag++)
067        {
068          RX3_BUF[tag]=RX1_BUF[tag+7];
069        }
070    }
071    memset(RX1_BUF,0,count_i);
072     
073 
074    if(((strcmp("card2",(const char *)RX3_BUF))==0)){
075    memset(RX3_BUF,0,count_i);
076    count_i=0;
077    card_read((const char*)*names2, 100, 10);
078    }
079    else if(((strcmp("password2",(const char *)RX3_BUF))==0)){
080    memset(RX3_BUF,0,count_i);
081    count_i=0;
082    Serial.println(count_i);
083    password_read((const char*)*names, 100, 10, (const char*)*password1, 100, 20);
084    }
085    else if(((strcmp("password1",(const char *)RX3_BUF))==0)){
086    memset(RX3_BUF,0,count_i);
087    count_i=0;
088    Serial.println(count_i);
089    password_regit((const char*)*admin, 2, 2, *names);
090    }
091    else if(((strcmp("card1",(const char *)RX3_BUF))==0)){
092    memset(RX3_BUF,0,count_i);
093    count_i=0;
094    Serial.println(count_i);
095    card_regit((const char*)*admin, 2, 2);
096    }
097    count_i=0;
098}
099 
100void card_read(char *namess, int n, int m){
101  Serial.println("card_read");
102  count_i=0;
103 
104  while(1){
105 
106    while (Serial.available())
107  {
108    RX1_BUF[count_i]=Serial.read();
109    Serial.println(RX1_BUF[count_i]);
110    count_i++;
111    }
112    if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 1))
113  {
114    Serial.println();
115    Serial.println("button");
116    for(tag=0;tag<RX1_BUF[6]-1;tag++)
117        {
118          RX3_BUF[tag]=RX1_BUF[tag+7];
119        }
120    }
121    memset(RX1_BUF,0,count_i);
122    count_i=0;
123 
124    if(((strcmp("back3",(const char *)RX3_BUF))==0)){
125    Serial.println("back_home");
126    return;
127    }
128 
129   
130  if ( ! rfid.PICC_IsNewCardPresent())
131    continue;
132  
133   
134  if ( ! rfid.PICC_ReadCardSerial())
135    continue;
136  
137  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
138  
139   
140  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && 
141    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
142    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
143    Serial.println("not support");
144    continue;
145  }
146   
147   
148  for (byte i = 0,nuidPICC2 = 0,numwei = 32; i < 4; i++) {
149    //Serial.println(rfid.uid.uidByte[i]);
150    nuidPICC[i] = rfid.uid.uidByte[i];
151    Serial.println(nuidPICC[i],HEX);
152    //nuidPICC2 = rfid.uid.uidByte[i];
153    //nuidPICC2 = nuidPICC2 << (numwei-8);
154  }
155 
156  Serial.println();
157 
158  Serial.println(&(*(namess+1*10)));
159 
160   
161  rfid.PICC_HaltA();
162  
163   
164  rfid.PCD_StopCrypto1();
165  for (int id_num = 0;id_num < 100; id_num++){
166  if ((nuidPICC[0] == ids[id_num])&&(nuidPICC[1] == ids[id_num+1])&&(nuidPICC[2] == ids[id_num+2])&&(nuidPICC[3] == ids[id_num+3]))
167  {
168    //cnames = names[id_num];
169    if(((strcmp("",&(*(namess+(id_num/4)*10))))==0))break;
170    //if(&(*(namess+(id_num/4)*10)) == "")break;
171    Serial.print(id_num);
172    Serial.print("UID:");
173    Serial.print(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"cardname1\",\"text\":\""));
174    //for(int id_nums = 0;id_nums < 10;id_nums++)
175    //{
176   // Serial.print(&(*(namess + id_num + id_nums - 1)));
177    //Serial.print(&(*(namess + id_num + id_nums - 1)));
178    //}
179    Serial.print(&(*(namess + (id_num/4)*10 )));
180    Serial.print(F("\"}>ET"));
181    printHex(rfid.uid.uidByte, rfid.uid.size);
182    digitalWrite(clocks, HIGH);
183    Serial.println(F("ST<{\"cmd_code\":\"set_visible\",\"type\":\"widget\",\"widget\":\"gif4\",\"visible\":true}>ET"));
184    delay(3000);
185    digitalWrite(clocks, LOW);
186    Serial.println(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"cardid1\",\"text\":\"\"}>ET"));
187    Serial.println(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"cardname1\",\"text\":\"\"}>ET"));
188    Serial.println(F("ST<{\"cmd_code\":\"set_visible\",\"type\":\"widget\",\"widget\":\"gif4\",\"visible\":false}>ET"));
189    //nuidPICC2 = 0;
190    break;
191  }
192  //nuidPICC2 = 0;
193  }
194}
195}
196 
197void printHex(byte *buffer, byte bufferSize) {
198  Serial.println();
199  Serial.print(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"cardid1\",\"text\":\""));
200  for (byte i = 0; i < bufferSize; i++) {
201    Serial.print(buffer[i] < 0x10 ? "0" : "");
202    Serial.print(buffer[i], HEX);
203  }
204  Serial.print(F("\"}>ET"));
205}
206 
207void password_read(char *namess, int n, int m, char *passwords, int o, int p){
208   
209//  unsigned char RX4_BUF[10] = {0};
210  unsigned char RX5_BUF[20] = {0};
211//  unsigned char RX6_BUF[20] = {0};
212  int name_true = 0;
213  int password_true = 0;
214  int i, j;
215  int name_s = 0;
216  Serial.println("password_read");
217   
218 
219  while(1){
220 
221    while (Serial.available())
222  {
223    RX1_BUF[count_i]=Serial.read();
224    Serial.println(RX1_BUF[count_i]);
225    count_i++;
226    }
227    if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 1))
228  {
229    Serial.println();
230    Serial.println("button");
231    for(tag=0;tag<RX1_BUF[6]-1;tag++)
232        {
233          RX3_BUF[tag]=RX1_BUF[tag+7];
234        }
235        RX3_BUF[tag] = NULL;
236        RX3_BUF[tag+1] = NULL;
237        RX3_BUF[tag+2] = NULL;
238    //Serial.println(((const char *)RX3_BUF));
239    }
240    else if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 112))
241  {
242    Serial.println();
243    Serial.println("edit");
244    for(name_s = 0; name_s < RX1_BUF[6]-8; name_s++)
245    {
246      RX5_BUF[name_s] = RX1_BUF[name_s+15];
247    }
248        RX5_BUF[name_s] = NULL;
249        RX5_BUF[name_s+1] = NULL;
250        RX5_BUF[name_s+2] = NULL;
251     
252        Serial.println(((const char *)RX5_BUF));
253        if (RX1_BUF[12]==53){
254    for (i=0;i<100;i++){
255      for (j=0;j<10;j++){
256        if (strcmp(&(*(namess + i*10 )),(const char*)RX5_BUF)==0)
257        {name_true = 1;
258        break;
259        }
260      }
261      if(name_true == 1)break;
262    }
263        }
264 
265        else if (RX1_BUF[12]==54){
266          for (;i<100;i++){
267      for (j=0;j<20;j++){
268        if (strcmp(&(*(passwords + i*20 )),(const char*)RX5_BUF)==0)
269        {password_true = 1;
270        break;
271        }
272      }
273      if(name_true == 1)break;
274    }
275        }
276    Serial.println(name_true);
277    Serial.println(password_true);
278    Serial.println(&(*(namess + 1*10 )));
279    Serial.println(&(*(passwords + 1*20 )));
280    if ((name_true == 1)&&(password_true == 1)){
281    digitalWrite(clocks, HIGH);
282    Serial.println(F("ST<{\"cmd_code\":\"set_visible\",\"type\":\"widget\",\"widget\":\"lock2\",\"visible\":true}>ET"));
283    delay(3000);
284    digitalWrite(clocks, LOW);
285    Serial.println(F("ST<{\"cmd_code\":\"set_visible\",\"type\":\"widget\",\"widget\":\"lock2\",\"visible\":false}>ET"));
286    Serial.println(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"edit\",\"widget\":\"edit5\",\"text\":\"\"}>ET"));
287    Serial.println(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"edit\",\"widget\":\"edit6\",\"text\":\"\"}>ET"));
288    name_true = password_true = 0;
289    }
290    }
291    memset(RX1_BUF,0,count_i);
292    count_i=0;
293 
294    if(((strcmp("back4",(const char *)RX3_BUF))==0)){
295    Serial.println("back_home");
296    return;
297 
298 
299void password_regit(char *admins, int w, int e,char *namess){
300 
301  unsigned char RX6_BUF[20] = {0};
302  unsigned char rname_BUF[10] = {0};
303  unsigned char rpass_BUF[20] = {0};
304//  unsigned char RX6_BUF[20] = {0};
305  int name1_true = 0;
306  int password1_true = 0;
307  int admin1_true = 0;
308  int name_s;
309  //int n, p;
310  Serial.println("password_regit");
311   
312 
313  while(1){
314 
315    while (Serial.available())
316  {
317    RX1_BUF[count_i]=Serial.read();
318    Serial.println(RX1_BUF[count_i]);
319    count_i++;
320    }
321    if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 1))
322  {
323    Serial.println();
324    Serial.println("button");
325    for(tag=0;tag<RX1_BUF[6]-1;tag++)
326        {
327          RX3_BUF[tag]=RX1_BUF[tag+7];
328        }
329        RX3_BUF[tag] = NULL;
330        RX3_BUF[tag+1] = NULL;
331        RX3_BUF[tag+2] = NULL;
332    }
333    else if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 112))
334  {
335    Serial.println();
336    Serial.println("edit");
337    for(name_s = 0; name_s < RX1_BUF[6]-8; name_s++)
338    {
339      RX6_BUF[name_s] = RX1_BUF[name_s+15];
340    }
341     
342        Serial.println(((const char *)RX6_BUF));
343        if (RX1_BUF[12]==51)
344        {
345          memcpy(rname_BUF,RX6_BUF,name_s);
346          name1_true = 1;
347          rname_BUF[name_s] = NULL;
348          rname_BUF[name_s+1] = NULL;
349          rname_BUF[name_s+2] = NULL;
350        }
351        else if (RX1_BUF[12]==52)
352        {
353          memcpy(rpass_BUF,RX6_BUF,name_s);
354          password1_true = 1;
355          rpass_BUF[name_s] = NULL;
356          rpass_BUF[name_s+1] = NULL;
357          rpass_BUF[name_s+2] = NULL;
358        }
359        else if (RX1_BUF[12]==55)
360        {
361          if (strcmp(&(*(admins)),(const char*)RX6_BUF)==0)
362          admin1_true = 1;
363        }
364         
365        Serial.println(name1_true);
366        Serial.println(password1_true);
367        Serial.println(admin1_true);
368//        Serial.println(&(*(admins)));
369        Serial.println((const char*)rname_BUF);
370        Serial.println((const char*)rpass_BUF);
371 
372        if ((name1_true == 1)&&(password1_true == 1)&&(admin1_true == 1))
373        {
374          names_nums++;
375 
376          strncpy(&(names[names_nums][0]), &rname_BUF[0], strlen(rname_BUF));
377          strncpy(&(password1[names_nums][0]), &rpass_BUF[0], strlen(rpass_BUF));
378 
379          name1_true = password1_true = admin1_true = 0;
380        }
381 
382     
383   
384}
385    memset(RX1_BUF,0,count_i);
386    count_i=0;
387    if(((strcmp("back2",(const char *)RX3_BUF))==0)){
388    Serial.println("back_home");
389    return;
390  }
391}
392}
393 
394void card_regit(char *admins, int w, int e){
395 
396  unsigned char RX7_BUF[20] = {0};
397  unsigned char rname_BUF[10] = {0};
398  unsigned char rpass_BUF[20] = {0};
399  int name1_true = 0;
400  int password1_true = 0;
401  int admin1_true = 0;
402  int name_s;
403  int set_label = 0;
404  Serial.println("card_regit");
405   
406 
407  while(1){
408 
409    while (Serial.available())
410  {
411    RX1_BUF[count_i]=Serial.read();
412    Serial.println(RX1_BUF[count_i]);
413    count_i++;
414    }
415    if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 1))
416  {
417    Serial.println();
418    Serial.println("button");
419    for(tag=0;tag<RX1_BUF[6]-1;tag++)
420        {
421          RX3_BUF[tag]=RX1_BUF[tag+7];
422        }
423        RX3_BUF[tag] = NULL;
424        RX3_BUF[tag+1] = NULL;
425        RX3_BUF[tag+2] = NULL;
426    //Serial.println(((const char *)RX3_BUF));
427    }
428    else if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 112))
429  {
430    Serial.println();
431    Serial.println("edit");
432    for(name_s = 0; name_s < RX1_BUF[6]-8; name_s++)
433    {
434      RX7_BUF[name_s] = RX1_BUF[name_s+15];
435    }
436     
437        Serial.println(((const char *)RX7_BUF));
438        if (RX1_BUF[12]==49)
439        {
440          memcpy(rname_BUF,RX7_BUF,name_s);
441          name1_true = 1;
442          rname_BUF[name_s] = NULL;
443          rname_BUF[name_s+1] = NULL;
444          rname_BUF[name_s+2] = NULL;
445        }
446        else if (RX1_BUF[12]==50)
447        {
448          if (strcmp(&(*(admins)),(const char*)RX7_BUF)==0)
449          admin1_true = 1;
450        }
451         
452        Serial.println(name1_true);
453        Serial.println(admin1_true);
454        Serial.println(&(*(admins)));
455 
456         
457 
458     
459   
460}
461 
462    memset(RX1_BUF,0,count_i);
463    count_i=0;
464    if(((strcmp("back1",(const char *)RX3_BUF))==0)){
465    Serial.println("back_home");
466    return;
467  }
468if ((name1_true == 1)&&(admin1_true == 1))
469        {
470           
471          if (set_label == 0)Serial.println(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"cardid\",\"text\":\"please place card!\"}>ET"));
472          set_label = 1;
473          if ( ! rfid.PICC_IsNewCardPresent())
474    continue;
475  
476   
477  if ( ! rfid.PICC_ReadCardSerial())
478    continue;
479  
480  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
481  
482   
483  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && 
484    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
485    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
486    Serial.println("not support");
487    continue;
488  }
489   
490   
491  for (byte i = 0,nuidPICC2 = 0,numwei = 32; i < 4; i++,idsnum++) {
492    nuidPICC[i] = rfid.uid.uidByte[i];
493    ids[idsnum] = nuidPICC[i];
494    Serial.println(ids[idsnum],HEX);
495  }
496  strncpy(&(names2[1][0]), &rname_BUF[0], strlen(rname_BUF));
497  Serial.println(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"cardid\",\"text\":\"regit ok!\"}>ET"));
498  delay(2000);
499  Serial.println(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"cardid\",\"text\":\"\"}>ET"));
500  Serial.println(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"edit\",\"widget\":\"edit1\",\"text\":\"\"}>ET"));
501    Serial.println(F("ST<{\"cmd_code\":\"set_text\",\"type\":\"edit\",\"widget\":\"edit2\",\"text\":\"\"}>ET"));
502   
503   
504  rfid.PICC_HaltA();
505  rfid.PCD_StopCrypto1();
506 
507        }
508 
509     
510}
511}

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

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

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

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

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

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

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

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

1byte nuidPICC[4];
2byte nuidPICC2[4];
3unsigned char RX1_BUF[50];
4unsigned char RX3_BUF[10];
5unsigned char names[30][10] = {"zbw",0};
6unsigned char names2[30][10] = {"zbw",0};
7unsigned char ids[50]={0x13,0xA5,0x5D,0x04};
8unsigned char password1[30][20]={"zbw3366",0};
9unsigned 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, но потом мне понадобилась версия для ардуино, и я немного изменил предыдущий код, чтобы применить его к ардуино.