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

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

код
011 | MFRC522 rfid(SS_PIN, RST_PIN); |
016 | unsigned char RX1_BUF[50]; |
018 | unsigned char RX3_BUF[10]; |
031 | unsigned char names[30][10] = { "zbw" ,0}; |
032 | unsigned char names2[30][10] = { "zbw" ,0}; |
033 | unsigned char ids[50]={0x13,0xA5,0x5D,0x04}; |
034 | unsigned char password1[30][20]={ "zbw3366" ,0}; |
035 | unsigned char admin[2][5]={ "yyds" ,0}; |
040 | void password_regit(); |
041 | void printHex( byte *buffer, byte bufferSize); |
045 | Serial .begin(115200); |
048 | pinMode(clocks, OUTPUT); |
054 | while ( Serial .available()) |
056 | RX1_BUF[count_i]= Serial .read(); |
057 | Serial .println(RX1_BUF[count_i]); |
062 | if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 1)) |
065 | Serial .println( "button" ); |
066 | for (tag=0;tag<RX1_BUF[6]-1;tag++) |
068 | RX3_BUF[tag]=RX1_BUF[tag+7]; |
071 | memset(RX1_BUF,0,count_i); |
074 | if (((strcmp( "card2" ,( const char *)RX3_BUF))==0)){ |
075 | memset(RX3_BUF,0,count_i); |
077 | card_read(( const char *)*names2, 100, 10); |
079 | else if (((strcmp( "password2" ,( const char *)RX3_BUF))==0)){ |
080 | memset(RX3_BUF,0,count_i); |
082 | Serial .println(count_i); |
083 | password_read(( const char *)*names, 100, 10, ( const char *)*password1, 100, 20); |
085 | else if (((strcmp( "password1" ,( const char *)RX3_BUF))==0)){ |
086 | memset(RX3_BUF,0,count_i); |
088 | Serial .println(count_i); |
089 | password_regit(( const char *)*admin, 2, 2, *names); |
091 | else if (((strcmp( "card1" ,( const char *)RX3_BUF))==0)){ |
092 | memset(RX3_BUF,0,count_i); |
094 | Serial .println(count_i); |
095 | card_regit(( const char *)*admin, 2, 2); |
100 | void card_read( char *namess, int n, int m){ |
101 | Serial .println( "card_read" ); |
106 | while ( Serial .available()) |
108 | RX1_BUF[count_i]= Serial .read(); |
109 | Serial .println(RX1_BUF[count_i]); |
112 | if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 1)) |
115 | Serial .println( "button" ); |
116 | for (tag=0;tag<RX1_BUF[6]-1;tag++) |
118 | RX3_BUF[tag]=RX1_BUF[tag+7]; |
121 | memset(RX1_BUF,0,count_i); |
124 | if (((strcmp( "back3" ,( const char *)RX3_BUF))==0)){ |
125 | Serial .println( "back_home" ); |
130 | if ( ! rfid.PICC_IsNewCardPresent()) |
134 | if ( ! rfid.PICC_ReadCardSerial()) |
137 | MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); |
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" ); |
148 | for ( byte i = 0,nuidPICC2 = 0,numwei = 32; i < 4; i++) { |
150 | nuidPICC[i] = rfid.uid.uidByte[i]; |
151 | Serial .println(nuidPICC[i],HEX); |
158 | Serial .println(&(*(namess+1*10))); |
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])) |
169 | if (((strcmp( "" ,&(*(namess+(id_num/4)*10))))==0)) break ; |
171 | Serial .print(id_num); |
172 | Serial .print( "UID:" ); |
173 | Serial .print(F( "ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"cardname1\",\"text\":\"" )); |
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" )); |
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" )); |
197 | void printHex( byte *buffer, byte bufferSize) { |
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); |
204 | Serial .print(F( "\"}>ET" )); |
207 | void password_read( char *namess, int n, int m, char *passwords, int o, int p){ |
210 | unsigned char RX5_BUF[20] = {0}; |
213 | int password_true = 0; |
216 | Serial .println( "password_read" ); |
221 | while ( Serial .available()) |
223 | RX1_BUF[count_i]= Serial .read(); |
224 | Serial .println(RX1_BUF[count_i]); |
227 | if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 1)) |
230 | Serial .println( "button" ); |
231 | for (tag=0;tag<RX1_BUF[6]-1;tag++) |
233 | RX3_BUF[tag]=RX1_BUF[tag+7]; |
236 | RX3_BUF[tag+1] = NULL; |
237 | RX3_BUF[tag+2] = NULL; |
240 | else if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 112)) |
243 | Serial .println( "edit" ); |
244 | for (name_s = 0; name_s < RX1_BUF[6]-8; name_s++) |
246 | RX5_BUF[name_s] = RX1_BUF[name_s+15]; |
248 | RX5_BUF[name_s] = NULL; |
249 | RX5_BUF[name_s+1] = NULL; |
250 | RX5_BUF[name_s+2] = NULL; |
252 | Serial .println((( const char *)RX5_BUF)); |
253 | if (RX1_BUF[12]==53){ |
256 | if (strcmp(&(*(namess + i*10 )),( const char *)RX5_BUF)==0) |
261 | if (name_true == 1) break ; |
265 | else if (RX1_BUF[12]==54){ |
268 | if (strcmp(&(*(passwords + i*20 )),( const char *)RX5_BUF)==0) |
273 | if (name_true == 1) break ; |
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" )); |
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; |
291 | memset(RX1_BUF,0,count_i); |
294 | if (((strcmp( "back4" ,( const char *)RX3_BUF))==0)){ |
295 | Serial .println( "back_home" ); |
299 | void password_regit( char *admins, int w, int e, char *namess){ |
301 | unsigned char RX6_BUF[20] = {0}; |
302 | unsigned char rname_BUF[10] = {0}; |
303 | unsigned char rpass_BUF[20] = {0}; |
306 | int password1_true = 0; |
310 | Serial .println( "password_regit" ); |
315 | while ( Serial .available()) |
317 | RX1_BUF[count_i]= Serial .read(); |
318 | Serial .println(RX1_BUF[count_i]); |
321 | if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 1)) |
324 | Serial .println( "button" ); |
325 | for (tag=0;tag<RX1_BUF[6]-1;tag++) |
327 | RX3_BUF[tag]=RX1_BUF[tag+7]; |
330 | RX3_BUF[tag+1] = NULL; |
331 | RX3_BUF[tag+2] = NULL; |
333 | else if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 112)) |
336 | Serial .println( "edit" ); |
337 | for (name_s = 0; name_s < RX1_BUF[6]-8; name_s++) |
339 | RX6_BUF[name_s] = RX1_BUF[name_s+15]; |
342 | Serial .println((( const char *)RX6_BUF)); |
345 | memcpy(rname_BUF,RX6_BUF,name_s); |
347 | rname_BUF[name_s] = NULL; |
348 | rname_BUF[name_s+1] = NULL; |
349 | rname_BUF[name_s+2] = NULL; |
351 | else if (RX1_BUF[12]==52) |
353 | memcpy(rpass_BUF,RX6_BUF,name_s); |
355 | rpass_BUF[name_s] = NULL; |
356 | rpass_BUF[name_s+1] = NULL; |
357 | rpass_BUF[name_s+2] = NULL; |
359 | else if (RX1_BUF[12]==55) |
361 | if (strcmp(&(*(admins)),( const char *)RX6_BUF)==0) |
365 | Serial .println(name1_true); |
366 | Serial .println(password1_true); |
367 | Serial .println(admin1_true); |
369 | Serial .println(( const char *)rname_BUF); |
370 | Serial .println(( const char *)rpass_BUF); |
372 | if ((name1_true == 1)&&(password1_true == 1)&&(admin1_true == 1)) |
376 | strncpy(&(names[names_nums][0]), &rname_BUF[0], strlen(rname_BUF)); |
377 | strncpy(&(password1[names_nums][0]), &rpass_BUF[0], strlen(rpass_BUF)); |
379 | name1_true = password1_true = admin1_true = 0; |
385 | memset(RX1_BUF,0,count_i); |
387 | if (((strcmp( "back2" ,( const char *)RX3_BUF))==0)){ |
388 | Serial .println( "back_home" ); |
394 | void card_regit( char *admins, int w, int e){ |
396 | unsigned char RX7_BUF[20] = {0}; |
397 | unsigned char rname_BUF[10] = {0}; |
398 | unsigned char rpass_BUF[20] = {0}; |
400 | int password1_true = 0; |
404 | Serial .println( "card_regit" ); |
409 | while ( Serial .available()) |
411 | RX1_BUF[count_i]= Serial .read(); |
412 | Serial .println(RX1_BUF[count_i]); |
415 | if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 1)) |
418 | Serial .println( "button" ); |
419 | for (tag=0;tag<RX1_BUF[6]-1;tag++) |
421 | RX3_BUF[tag]=RX1_BUF[tag+7]; |
424 | RX3_BUF[tag+1] = NULL; |
425 | RX3_BUF[tag+2] = NULL; |
428 | else if ((RX1_BUF[3] == 16)&&(RX1_BUF[4] == 112)) |
431 | Serial .println( "edit" ); |
432 | for (name_s = 0; name_s < RX1_BUF[6]-8; name_s++) |
434 | RX7_BUF[name_s] = RX1_BUF[name_s+15]; |
437 | Serial .println((( const char *)RX7_BUF)); |
440 | memcpy(rname_BUF,RX7_BUF,name_s); |
442 | rname_BUF[name_s] = NULL; |
443 | rname_BUF[name_s+1] = NULL; |
444 | rname_BUF[name_s+2] = NULL; |
446 | else if (RX1_BUF[12]==50) |
448 | if (strcmp(&(*(admins)),( const char *)RX7_BUF)==0) |
452 | Serial .println(name1_true); |
453 | Serial .println(admin1_true); |
454 | Serial .println(&(*(admins))); |
462 | memset(RX1_BUF,0,count_i); |
464 | if (((strcmp( "back1" ,( const char *)RX3_BUF))==0)){ |
465 | Serial .println( "back_home" ); |
468 | if ((name1_true == 1)&&(admin1_true == 1)) |
471 | if (set_label == 0) Serial .println(F( "ST<{\"cmd_code\":\"set_text\",\"type\":\"label\",\"widget\":\"cardid\",\"text\":\"please place card!\"}>ET" )); |
473 | if ( ! rfid.PICC_IsNewCardPresent()) |
477 | if ( ! rfid.PICC_ReadCardSerial()) |
480 | MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); |
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" ); |
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); |
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" )); |
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" )); |
505 | rfid.PCD_StopCrypto1(); |
видеодемонстрация
https://www.youtube.com/watch?v=k2oEEy4Xijg
Неправильная схема подключения, вот картинка, когда я делал это с ESP32. Вот схема подключения, когда я использую Arduino.
не код, а ник ТС.
хм, это точно Уно?
1
byte
nuidPICC[4];
2
byte
nuidPICC2[4];
3
unsigned
char
RX1_BUF[50];
4
unsigned
char
RX3_BUF[10];
5
unsigned
char
names[30][10] = {
"zbw"
,0};
6
unsigned
char
names2[30][10] = {
"zbw"
,0};
7
unsigned
char
ids[50]={0x13,0xA5,0x5D,0x04};
8
unsigned
char
password1[30][20]={
"zbw3366"
,0};
9
unsigned
char
admin[2][5]={
"yyds"
,0};
примерно 1400 байт только в этих массивах...
Афтар, пиши ищо
Интеллектуальный контроль доступа на основе ESP32 и ЖК-дисплея
http://forum.arduino.ua/viewtopic.php?id=2576
https://www.developpez.net/forums/d2116482/general-developpement/programmation-systeme/embarque/arduino/controle-d-acces-intelligent-base-esp32/
Это uno, у меня только одна плата arduino.
Да, я начал с esp32, но потом мне понадобилась версия для ардуино, и я немного изменил предыдущий код, чтобы применить его к ардуино.