Показаны различия между двумя версиями страницы.
Следующая версия | Предыдущая версия | ||
products:laboratory_iot:exp38 [2020/05/23 10:20] – создано labuser29 | products:laboratory_iot:exp38 [2024/12/04 18:15] (текущий) – [Программный код эксперимента] labuser30 | ||
---|---|---|---|
Строка 2: | Строка 2: | ||
Создадим простейшую систему контроля доступа. В комплект конструктора (в версии MAXI) входит 2 RFID метки. Одна в виде пластиковой карты, вторая в виде брелока. На прошлом эксперименте мы собрали считыватель RFID меток, который выводил номер метки. Запиши номер одной из меток, он пригодится в этом эксперименте. Это будет номер карты, которой разрешен проход, | Создадим простейшую систему контроля доступа. В комплект конструктора (в версии MAXI) входит 2 RFID метки. Одна в виде пластиковой карты, вторая в виде брелока. На прошлом эксперименте мы собрали считыватель RFID меток, который выводил номер метки. Запиши номер одной из меток, он пригодится в этом эксперименте. Это будет номер карты, которой разрешен проход, | ||
+ | |||
+ | ==== Схема эксперимента ==== | ||
+ | Дополнительно подключим LCD дисплей и зуммер | ||
+ | {{ : | ||
+ | // | ||
+ | |||
+ | ==== Программный код эксперимента ==== | ||
+ | <file python Exp38.py[enable_line_numbers=" | ||
+ | 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), | ||
+ | lcd = I2cLcd(i2c, DEFAULT_I2C_ADDR, | ||
+ | lcd.backlight_on() | ||
+ | |||
+ | rdr = mfrc522.MFRC522(0, | ||
+ | |||
+ | allow_cards = [ | ||
+ | ' | ||
+ | ] | ||
+ | |||
+ | 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 = ' | ||
+ | print_lcd(card_number) | ||
+ | print(" | ||
+ | |||
+ | if (card_number in allow_cards): | ||
+ | print(' | ||
+ | signal_ok() | ||
+ | else: | ||
+ | print(' | ||
+ | signal_fail() | ||
+ | </ | ||
+ | |||
+ | Объявляем массив с номерами карт, которым доступен вход. В нашем списке одна карта. Замени этот номер на номер своей карты. Номера карт мы узнавали на [[products: | ||
+ | <code python[enable_line_numbers=" | ||
+ | allow_cards = [ | ||
+ | ' | ||
+ | ] | ||
+ | </ | ||
+ | |||
+ | В основном цикле, после определения номера считанной метки, проверяем входит ли она в число разрешенных | ||
+ | <code python[enable_line_numbers=" | ||
+ | if (card_number in allow_cards): | ||
+ | print(' | ||
+ | signal_ok() | ||
+ | else: | ||
+ | print(' | ||
+ | signal_fail() | ||
+ | </ | ||
+ | |||
+ | Если да, то выводим в терминал слово ' | ||
+ | |||
+ | В реальных условиях к схеме можно было бы добавить дополнительное исполнительное устройство, |