RFID Access Control v1.0.0
RFID Access Control v1.0.0
First stable release of the standalone ESP32-S3 RFID access controller. Runs fully offline (no PC required); a Python CLI is included for administration.
Hardware
- ESP32-S3 dev board (8MB Octal PSRAM, 16MB Flash)
- PN532 NFC/RFID module, hardware SPI mode
- 16x2 I2C LCD (PCA8574 backpack, address
0x27or0x3F) - Passive buzzer on GPIO 6 (PWM tone feedback)
- Wi-Fi (2.4GHz) for NTP time sync
Core Features
- User database up to 10,000 entries, PSRAM-backed allocator
- Expiration checking against NTP-synced clock (
registered+valid_days) - Fail-safe behavior: every card denied with "No Time Sync" if NTP hasn't synced
- Admin badges: no expiration, work even without NTP sync
- Audible feedback: ascending tone on grant, descending tone on deny
- Anti-brute-force lockout after
MAX_CONSECUTIVE_DENIALSconsecutive denials, configurableLOCKOUT_DURATION_MS - Wi-Fi provisioning and timezone (offset + DST) configurable at runtime via CLI, no reflash needed
- Newline-delimited JSON serial protocol at 921600 baud
Python CLI (17 subcommands)
- User management:
add,remove(incl.--force,--except),rename,find,list - Batch import/export (JSON or CSV), with
--dry-runand--clear - Automatic timestamped backup before any destructive operation
- Tag renewal mode:
tag-renewwith quota control - UID scan mode:
scan,scan --infinite - Device diagnostics:
status,netstatus,ntp-time,ntp-sync - Port auto-detection with manual override (
--port,list-ports)
Storage
- LittleFS + newline-delimited JSON
- Custom 16MB partition layout, 12MB LittleFS cap
Requirements
- Arduino IDE 2.x, ESP32 board package v3.x
- Libraries: Adafruit PN532, LiquidCrystal I2C, ArduinoJson v7.x
- Python 3.9+ for the CLI