A self-contained, physical two-player LED scoreboard built around an ESP32-S3 and a 128×64 P2 RGB HUB75 matrix. The scoreboard is complete and working; scores are controlled by three illuminated panel-mount buttons, with no phone or network connection required.

Physical build: complete and working.
The original BLE firmware was uploaded and tested with all five scoring commands, the physical controls, and reconnection. The native iPhone controller was installed on a physical iPhone and verified in both scoring directions. The physical controls continue to work independently.
| Control | Short press | Long press (≥600 ms) |
|---|---|---|
| Player One | +1 | −1 |
| Player Two | +1 | −1 |
| Reset | No action | Reset both scores |
Player names are intentionally isolated at the top of the production sketch:
const char* PLAYER_ONE_NAME = "PLAYER 1";
const char* PLAYER_TWO_NAME = "PLAYER 2";
The rest of the firmware uses generic Player One / Player Two variables so future BLE control can replace the hard-coded names without rewriting the scoring logic.

.
├── README.md
├── docs/
│ ├── bill-of-materials.md
│ ├── bringup-and-hardware.md
│ ├── hardware.md
│ ├── project-history.md
│ ├── software.md
│ ├── wiring.md
│ └── images/
│ └── final/
└── firmware/
├── bringup/
└── scoreboard/
└── scoreboard.ino
The production sketch is firmware/scoreboard/scoreboard.ino.
It uses:
ESP32-HUB75-MatrixPanel-I2S-DMAFreeSansBold9pt7bINPUT_PULLUP button inputsSee docs/software.md for the complete software configuration.
The final working pin map, power topology, button wiring and physical construction are documented in:
The project originally started with a much denser P1.53 208×104 / 1:52-scan commercial-signage module. Although it used a HUB75-family connector, it was not a straightforward match for the ESP32 direct-drive approach. The final build moved to a conventional 128×64 P2 / 1:32 panel and was successfully driven directly from the ESP32-S3.
That failed path is retained in docs/project-history.md because it is useful information for anyone trying to reproduce the project.
Use the BLE sketch for wireless control.
Install on the Mac: open ios/ScoreboardController/ScoreboardController.xcodeproj, choose your signing Team, select your iPhone, and Run. Disconnect nRF Connect before connecting the new app. The controller can score with the earlier BLE firmware. Name editing requires the current BLE sketch.
See the BLE/nRF Connect guide for protocol details and the iPhone setup guide for installation.
Additional files:
firmware/scoreboard_ble/ # Tested BLE sketch
firmware/reference/panel_bringup/ # Panel bring-up sketch
ios/ScoreboardController/ # Xcode app + protocol tests
No license has been selected yet.