Эксперимент 38. Контроль доступа

Создадим простейшую систему контроля доступа. В комплект конструктора (в версии MAXI) входит 2 RFID метки. Одна в виде пластиковой карты, вторая в виде брелока. На прошлом эксперименте мы собрали считыватель RFID меток, который выводил номер метки. Запиши номер одной из меток, он пригодится в этом эксперименте. Это будет номер карты, которой разрешен проход, а другим картам вход закрыт.

Схема эксперимента

Дополнительно подключим LCD дисплей и зуммер Рисунок 1. Монтажная схема эксперимента

Программный код эксперимента

Exp38.py
  1. import time
  2. from machine import I2C, Pin
  3. from esp8266_i2c_lcd import I2cLcd
  4. import mfrc522
  5. _init()
  6.  
  7. buzzer = Pin(15, Pin.OUT)
  8.  
  9. DEFAULT_I2C_ADDR = 0x3F # Или 0x27 в зависимости от модели микросхемы на плате
  10.  
  11. i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000)
  12. lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16)
  13. lcd.backlight_on()
  14.  
  15. rdr = mfrc522.MFRC522(0, 2, 12, 13, 14) #sck, mosi, miso, rst, sda
  16.  
  17. allow_cards = [
  18. '7982e1b3'
  19. ]
  20.  
  21. def print_lcd(data):
  22. lcd.clear()
  23. lcd.putstr(str(data))
  24.  
  25. def signal_ok():
  26. buzzer.on()
  27. time.sleep_ms(200)
  28. buzzer.off()
  29.  
  30. def signal_fail():
  31. for i in range(3):
  32. buzzer.on()
  33. time.sleep_ms(100)
  34. buzzer.off()
  35. time.sleep_ms(100)
  36.  
  37. while True:
  38. (stat, tag_type) = rdr.request(rdr.REQIDL)
  39.  
  40. if stat == rdr.OK:
  41. (stat, raw_uid) = rdr.anticoll()
  42.  
  43. if stat == rdr.OK:
  44. card_number = '{:x}{:x}{:x}{:x}'.format(raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
  45. print_lcd(card_number)
  46. print("Card detected: " + card_number)
  47.  
  48. if (card_number in allow_cards):
  49. print('OK')
  50. signal_ok()
  51. else:
  52. print('NO')
  53. signal_fail()

Объявляем массив с номерами карт, которым доступен вход. В нашем списке одна карта. Замени этот номер на номер своей карты. Номера карт мы узнавали на прошлом эксперименте.

  1. allow_cards = [
  2. '7982e1b3'
  3. ]

В основном цикле, после определения номера считанной метки, проверяем входит ли она в число разрешенных

  1. if (card_number in allow_cards):
  2. print('OK')
  3. signal_ok()
  4. else:
  5. print('NO')
  6. signal_fail()

Если да, то выводим в терминал слово 'OK' и вызываем функцию генерации разрешительного звукового сигнала. Если нет, то выводим в терминал слово 'NO' и вызываем функцию генерации запретительного звукового сигнала.

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