MinecraftOrb/firmware/PLANNING.md
Giorgio Gilestro 28c36c51f6 Initial commit: Minecraft Orb project
ESP32-C3 firmware for interactive treasure hunt device with RFID,
OLED display, LED effects, buzzer, and touch input.
Includes 3D printable STL files for the enclosure.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 18:43:15 +01:00

182 lines
5.5 KiB
Markdown

# Minecraft Orb - Firmware
## Project Overview
ESP32-C3 SuperMini-based RFID reader with OLED display, designed for the Minecraft Orb project (Giulio Hunt 2025).
## Hardware
### Microcontroller
- **Board**: ESP32-C3 SuperMini
- **Form factor**: Two rows of 8 pins, USB-C connector
- **Framework**: Arduino (via PlatformIO)
- **Power**: ESP32-C3 SuperMini Expansion Board with 3.7V LiPo battery (USB charging via TP4056)
### Connected Components
| Component | Interface | Description |
|-----------|-----------|-------------|
| SSD1306 OLED | I2C | 128x64 pixel display |
| RC522 | SPI | RFID/NFC reader (13.56 MHz) |
| White LED | GPIO | Status indicator (100 ohm resistor) |
| Piezo Buzzer | GPIO/PWM | Audio feedback (passive) |
| TTP223 | GPIO | Capacitive touch sensor |
### Pin Configuration
```
ESP32-C3 SuperMini Pinout (Top View, USB-C facing down)
Left Side Right Side
--------- ----------
GPIO5 <- Touch 5V
GPIO6 <- RC522 SDA GND
GPIO7 <- RC522 SCK 3V3
GPIO8 <- RC522 MOSI GPIO4 <- LED
GPIO9 <- RC522 MISO GPIO3 <- LCD SCL
GPIO10 <- RC522 RST GPIO2 <- LCD SDA
GPIO20 (FREE) GPIO1 (FREE)
GPIO21 (FREE) GPIO0 <- Buzzer
```
### Detailed Wiring
| Component | Component Pin | GPIO | Notes |
|-----------|---------------|------|-------|
| SSD1306 | SDA | GPIO 2 | I2C Data |
| SSD1306 | SCL | GPIO 3 | I2C Clock |
| SSD1306 | VCC | 3V3 | 3.3V power |
| SSD1306 | GND | GND | Ground |
| RC522 | SDA (CS) | GPIO 6 | Chip Select |
| RC522 | SCK | GPIO 7 | SPI Clock |
| RC522 | MOSI | GPIO 8 | SPI Data Out |
| RC522 | MISO | GPIO 9 | SPI Data In |
| RC522 | RST | GPIO 10 | Reset |
| RC522 | VCC | 3V3 | 3.3V power |
| RC522 | GND | GND | Ground |
| White LED | Anode (+) | GPIO 4 | Via 100 ohm resistor |
| White LED | Cathode (-) | GND | Ground |
| Buzzer | + (Signal) | GPIO 0 | Passive piezo buzzer |
| Buzzer | - (GND) | GND | Ground |
| TTP223 | I/O (Signal) | GPIO 5 | Touch output (HIGH when touched, GPIO0-5 required for deep sleep wake) |
| TTP223 | VCC | 3V3 | 3.3V power |
| TTP223 | GND | GND | Ground |
## Software Architecture
### File Structure
```
firmware/
├── platformio.ini # PlatformIO configuration
├── PLANNING.md # This file
├── include/
│ ├── pins.h # Pin definitions
│ ├── config.h # WiFi credentials & constants
│ └── cards.h # Card database structures
└── src/
├── main.cpp # Main firmware
└── cards.cpp # Card database (NVS storage)
```
### Dependencies
- `Adafruit SSD1306` - OLED display driver
- `Adafruit GFX Library` - Graphics primitives
- `MFRC522` - RC522 RFID reader driver
- `WiFi` - ESP32 WiFi (built-in, currently disabled)
- `Preferences` - ESP32 NVS storage (built-in)
### Operating Modes
1. **Auth Mode** (startup): 5 players must scan AUTH cards in ascending ID order
2. **Programming Mode**: Write/read quest data to MIFARE cards via serial
3. **Normal Mode**: Scan cards to display clues; handles MORSE, INPUT, AUTH command cards
### Event Loop
`setup()` initializes all hardware then enters auth mode. `loop()` calls:
1. `checkSerial()` - Process serial commands
2. `breatheLED()` - LED animation (normal mode only)
3. `checkRFID()` - Poll for RFID cards
4. `checkTouch()` - Poll touch sensor for activity
5. `checkPowerSave()` - Display timeout and deep sleep
## Building & Flashing
### Prerequisites
- PlatformIO CLI or VS Code with PlatformIO extension
### Commands
```bash
pio run # Build firmware
pio run --target upload # Upload to board
pio device monitor # Monitor serial output
```
## Serial Programming Mode
Connect via serial (115200 baud) and use these commands:
| Command | Description |
|---------|-------------|
| `PROG` | Enter programming mode |
| `EXIT` | Exit programming mode |
| `SCAN` | Scan card and read contents |
| `ADD <name>\|<clue>` | Write quest data to card |
| `HELP` | Show help |
Quest data is written directly to MIFARE Classic 1K cards (not stored in ESP32 flash).
### Card Data Layout
| Sector | Blocks | Content |
|--------|--------|---------|
| 1 | 4-5 | Name (32 bytes) |
| 2 | 8-10 | Clue part 1 (48 bytes) |
| 3 | 12-14 | Clue part 2 (48 bytes) |
| 4 | 16-18 | Clue part 3 (48 bytes) |
Total capacity: 32 byte name + 144 byte clue
### Command Cards
Special card names trigger commands instead of displaying clues:
| Name | Clue Format | Description |
|------|-------------|-------------|
| `MORSE` | `<message>` | Play clue as Morse code |
| `INPUT` | `<answer>\|<message>` | Touch input puzzle (1-10) |
### Example Usage
```
PROG
ADD Quest 1|Go to the old oak tree near the lake
<scan card>
EXIT
```
## Power Management (Battery Operation)
Powered via ESP32-C3 SuperMini expansion board with 3.7V LiPo battery (USB charging via TP4056).
| Feature | Timeout | Behavior |
|---------|---------|----------|
| Display auto-off | 3 min inactivity | OLED turned off, touch/card/serial wakes it |
| Deep sleep | 10 min inactivity | All peripherals off, ~uA draw |
| Wake from sleep | Touch sensor press | Full reboot through setup() |
Timeouts configured in `include/config.h` (`DISPLAY_TIMEOUT_MS`, `SLEEP_TIMEOUT_MS`).
Touch sensor must be on GPIO0-5 for deep sleep wake support (ESP32-C3 limitation).
## Future Development
- [x] Write quest data directly to MIFARE cards
- [x] WiFi connectivity
- [x] Command cards (MORSE, INPUT)
- [x] Deep sleep for battery operation
- [ ] Custom animations on display
- [ ] OTA firmware updates