Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
products:laboratory_iot:exp38 [2020/05/23 10:20] – создано labuser29products:laboratory_iot:exp38 [2024/12/04 18:15] (текущий) – [Программный код эксперимента] labuser30
Строка 2: Строка 2:
  
 Создадим простейшую систему контроля доступа. В комплект конструктора (в версии MAXI) входит 2 RFID метки. Одна в виде пластиковой карты, вторая в виде брелока. На прошлом эксперименте мы собрали считыватель RFID меток, который выводил номер метки. Запиши номер одной из меток, он пригодится в этом эксперименте. Это будет номер карты, которой разрешен проход, а другим картам вход закрыт. Создадим простейшую систему контроля доступа. В комплект конструктора (в версии MAXI) входит 2 RFID метки. Одна в виде пластиковой карты, вторая в виде брелока. На прошлом эксперименте мы собрали считыватель RFID меток, который выводил номер метки. Запиши номер одной из меток, он пригодится в этом эксперименте. Это будет номер карты, которой разрешен проход, а другим картам вход закрыт.
 +
 +==== Схема эксперимента ====
 +Дополнительно подключим LCD дисплей и зуммер
 +{{ :products:esp-iot:exp17_mon.png?direct&600 |}}
 +//Рисунок 1. Монтажная схема эксперимента//
 +
 +==== Программный код эксперимента ====
 +<file python Exp38.py[enable_line_numbers="2", start_line_numbers_at="1"]>
 +import time
 +from machine import I2C, Pin
 +from esp8266_i2c_lcd import I2cLcd
 +import mfrc522
 +_init()
 +
 +buzzer = Pin(15, Pin.OUT)
 +
 +DEFAULT_I2C_ADDR = 0x3F # Или 0x27 в зависимости от модели микросхемы на плате
 +
 +i2c = I2C(scl=Pin(5), sda=Pin(4), freq=400000)
 +lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, 2, 16)
 +lcd.backlight_on()
 +
 +rdr = mfrc522.MFRC522(0, 2, 12, 13, 14) #sck, mosi, miso, rst, sda
 +
 +allow_cards = [
 +    '7982e1b3'
 +]
 +
 +def print_lcd(data):
 +    lcd.clear()
 +    lcd.putstr(str(data))
 +
 +def signal_ok():
 +    buzzer.on()
 +    time.sleep_ms(200)
 +    buzzer.off()
 +
 +def signal_fail():
 +    for i in range(3):
 +        buzzer.on()
 +        time.sleep_ms(100)
 +        buzzer.off()
 +        time.sleep_ms(100)
 +
 +while True:
 +    (stat, tag_type) = rdr.request(rdr.REQIDL)
 +
 +    if stat == rdr.OK:
 +        (stat, raw_uid) = rdr.anticoll()
 +
 +        if stat == rdr.OK:
 +            card_number = '{:x}{:x}{:x}{:x}'.format(raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
 +            print_lcd(card_number)
 +            print("Card detected: " + card_number)
 +
 +            if (card_number in allow_cards):
 +                print('OK')
 +                signal_ok()
 +            else:
 +                print('NO')
 +                signal_fail()
 +</file>
 +
 +Объявляем массив с номерами карт, которым доступен вход. В нашем списке одна карта. Замени этот номер на номер своей карты. Номера карт мы узнавали на [[products:laboratory_iot:exp37|прошлом эксперименте]].
 +<code python[enable_line_numbers="2", start_line_numbers_at="17"]>
 +allow_cards = [
 +    '7982e1b3'
 +]
 +</code>
 +
 +В основном цикле, после определения номера считанной метки, проверяем входит ли она в число разрешенных
 +<code python[enable_line_numbers="2", start_line_numbers_at="48"]>
 +            if (card_number in allow_cards):
 +                print('OK')
 +                signal_ok()
 +            else:
 +                print('NO')
 +                signal_fail()
 +</code>
 +
 +Если да, то выводим в терминал слово 'OK' и вызываем функцию генерации разрешительного звукового сигнала. Если нет, то выводим в терминал слово 'NO' и вызываем функцию генерации запретительного звукового сигнала.
 +
 +В реальных условиях к схеме можно было бы добавить дополнительное исполнительное устройство, например, электромагнит, который удерживает дверь. После обнаружения карты из списка разрешенных, такая схема могла бы отключать электромагнит и дверь можно было бы открыть.