Как написать свою программу
Мини-инструкции для самостоятельного изменения встроенного программного обеспечения, написанного на MicroPython
Считыватель можно запрограммировать несколькими способами.
  • 1
    WEB-интерфейс
    Для устройств со встроенным web-редактором.
    Самый быстрый и удобный способ изменить программу. В Web-интерфейсе устройства пользователю доступен редактор для написания пользовательского кода.
  • 2
    Программа UPYloader
    Наша программа для записи, удаления и редактирования файлов на встроенной файловой системе. Работает через USB или UART. В отличие от первого способа позволяет не ограничиваться одним файлом для редактирования.
  • 3
    Консоль MicroPython
    Самый тяжелый для начала, но самый подходящий для отладки сложного кода: Python REPL.
Модуль rfid_utils
Модуль rfid_utils упрощает работу с rfid устройствами.

Включает в себя следующие объекты и классы:
Объект GLED - зелёный светодиод (класс MicroPython - Pin)
Объект RLED - красный светодиод (класс MicroPython - Pin)
Объект OUT - выходной канал (класс MicroPython - Pin)Объект IN - входной канал (класс MicroPython - Pin)
Класс Buzzer - звукогенератор
Класс СardFilter - инструмент для защиты от повторного прикладывания
Класс RFID - инструмент для упрощения работы с картами
Класс RFID
Класс упрощает работу с RFID считывателем.
Конструктор имеет следующие параметры (gain=rfid.G_33dB, key=None, typ=None, ul=None)
gain - мощность излучателя.
key - ключ шифрования: None или объект типа bytes, bytearray
typ - тип ключа шифрования A/B: b'A' или b'B'`
ul - ключ Ultralight для карт Mifare Ultralight

Класс имеет следующие методы:
  • read(fmt='hU*', key=None, typ=None, ul=None) - прочитать карту согласно строке форматирования fmt. По-умолчанию UID в HEX.
  • write(num, data, key=None, typ=None, ul=None) - запись данных, где num - номер блока, data - данные в формате bytearray, размер должен точно совпадать с размером блока метки. Перед write нужно разово сделать scan().
  • scan() - включает считыватель и сканирует первую карту. Если находит возвращает uid, иначе None.
Пример:

from rfid_utils import RFID 

rfid = RFID() 
rfid.read('B2%1:3', key=b'\x99\x99\x99\x99\x99\x99', typ=b'A') 
Класс Buzzer
Класс Buzzer упрощает работу со звуковым излучателем.
Имеет следующие методы:
  • on() - включить генератор
  • off() - выключить генератор
  • beeps(timeout) - запустить генератор на timeout миллисекунд.
  • beep(timeout) - запустить генератор на timeout миллисекунд async версия.
Класс CardFilter
Класс CardFilter создает кэш поднесённых карт для исключения повторного срабатывания.
Инициализация класса CardFilter(lifetime), где lifetime - время нахождения записи в фильтре в секундах. Класс при инициализации использует значение из time.time(), поэтому при использовании внешней синхронизации время должно быть уже установлено.
Имеет следующие методы:
  • append(data) - добавить данные
  • clean(ts) - провести чистку, где ts - текущее time.time()

Для корректной работы объекта класса, необходимо периодически вызывать clean, чтобы сбрасывать устаревшие записи.

Для начала сделаем программу, которая при поднесении любой карты зажигает один светодиод и печатает UID в консоль .

Данные примеры для простоты написаны без использования uasyncio.

import pyb
from rfid_utils import RFID, GLED

print("User code started")
rfid = RFID()
while 1:
        pyb.delay(100)
        uid = rfid.read()
        if uid:
            print(uid)
            GLED.on()
            pyb.delay(300)
            GLED.off()
Простой дверной RFID замок на 24 строки
Удалим всё в main.py и запишем:

from binascii import hexlify
import pyb
from rfid_utils import RFID, GLED, RLED, OUT, Buzzer

settings = {"USER_LIST" : {"030e873e": "user1", "11111111": "user2", "11111112" : "user3"}}

rfid = RFID()
buzz = Buzzer()
OUT.on()

while 1:
    uid = rfid.read()
    if hexlify(uid).decode() in settings['USER_LIST']:
        OUT.off()
        GLED.on()
        buzz.beeps(50)
        GLED.off()
        pyb.delay(3000)
        OUT.on()
    else:
        RLED.on()
        buzz.beeps(500)
        RLED.off()
        pyb.delay(1500)
Пример использования фильтра карт
Пример использования

from time import time
import pyb
from rfid_utils import RFID, CardFilter, GLED


def run():
    print("User code started")
    rfid = RFID()
    c_filter = CardFilter(15)
    while 1:
        pyb.delay(500)
        c_filter.clean(time())
        uid = rfid.read()
        if uid and uid not in c_filter:
            GLED.on()
            print(uid)
            c_filter.append(uid)
            GLED.off()
    
Класс DataBase
Модуль database - класс DataBase

По-умолчанию, класс использует в качестве хранилища бинарный файл upy.db.
Чтобы использовать другой файл, необходимо указать его имя при создании класса

from database import DataBase
mydb = DataBase(filename='myfile.db')

Класс предоставляет следующие методы для работы с БД:
* add(key, data):
key: уникальный ключ, который идентифицирует хранящиеся в БД данные (data)

* remove(key):
удалить из БД данные, соответствующие ключу key
возвращает True если данные удалены, False если в БД нет такого ключа

* get(key):
получить из БД данные, соответствующие ключу key. Тип возвращаемых данных: bytes.

* pop(key):
вызывает последовательно методы get(key) и remove(key). Возвращает данные (см. метод get)

* contains(key):
возвращает True или False если ключ key есть / отсутствует в базе

* clean():
удаляет все данные из БД
Дополнительные ресуры
  1. Общая инструкция в PDF,
  2. Техподдержка,
  3. Руководство по языку MicroPython,
  4. UPYMon - программа для записи и редактирования файлов.