Loading files…
The Cyber Saiyan community modified the special WHY 2025 badge to bring to EMF Camp 2026. This year we don't have our own tent — find us hanging around the Milliways village, where we'll have a few badges on showcase to play with. Come say hi!
The badge has several simple features to enhance your camp experience:
Once powered on, the badge is assigned an ID from 1 to 7 and begins advertising itself via BLE.
Change Screens: Long-press (at least 1 second) either Dial Wheel Switch.
You can interact with the screen by short pressing (up or down) one of the two Dial Wheel Switch.
The Cyber Saiyan EMF2026 logo
The EMF Camp 2026 talks schedule. Use the 5th screen to update it.
The badge radar, showing nearby badges in a Dragon Ball style.
The badge's list, you can see all the badges around in a table view
The Wi-Fi functionalities
Start the AP mode (move up the Dial Wheel Switch) and connect from your PC/phone to the badge AP using SSID and PASS shown; after that you can navigate to http://192.168.4.1 in order to explore more functionalities (hey Harry, can you play tetris?) and change configurations (saiyan is the pwd)
Start the SYNC mode (move down the Dial Wheel Switch) in order to update the schedule; the badge connects to the EMF Wi-Fi and downloads the latest talks schedule from emfcamp.org
Have fun while playing Snake! 🐍
Space Invaders! 👾 Roll a Dial Wheel UP to move the laser cannon left and DOWN to move it right, and press both wheels together to FIRE at the descending invaders. Your score and the all-time high score (saved on the badge) are shown at the top. Short-press a wheel to play again after game over.
Rainbow loop! 🌈 A continuous LED animation across all 7 front RGB LEDs — great for walking around camp and showing off some lights at night. It starts the moment you arrive on this screen and stops the moment you leave it. Short press either wheel to cycle through 5 animations: Rainbow Chase, Color Wave, Strobe Party, Twinkle Sparkle, and Comet Spin. The screen shows which one is currently playing.
The ESP32-C3 chip is the MCU at the core of the EMF Camp 2026 Badge, it integrates multiple peripherals to enable communication with the outside world. The number of available pins is limited to keep the chip package size small. To route all the incoming and outgoing signals a set of software programmable registers controls the pin multiplexer.
There are 16 programmable GPIO pins available for:
The EMF Camp 2026 Badge is equipped with a 2.8 inch TFT color LCD screen with 240 x 320 pixels, using the ST7789 display controller. This display integrates a resistive touchscreen a white LEDs backlight and features an 18-pin standard FPC cable to interface the MCU with a 4-wire SPI bus.
The SPI bus signals are available on the connector labeled "SPI" at the top of the badge:
| pin | function |
|---|---|
| 1 | GND |
| 2 | MOSI |
| 3 | CS |
| 4 | DC |
| 5 | CLK |
| 6 | MISO |
The current firmware version does not support touchscreen functionality, but the Badge still features the TSC2007 I2C Resistive Touch Screen Controller.
The front RGB LEDs are intelligent, individually addressable WS2812B chips that communicate with each other and the microcontroller via a single data line. The data transfer protocol uses a single NZR communication mode. The signal from the DOUT port of the last LED on the badge is available on the "1W" pin of the connector, labeled "I2C."
The I2C bus signals are available on the connector labeled "I2C" at the top of the badge:
| pin | function |
|---|---|
| 1 | GND |
| 2 | SCL |
| 3 | SDA |
| 4 | 1W |
The display backlight is controlled by 4 pins on the AW9523B LED driver and GPIO controller with I2C interface while the other 12 pins on the I/O ports can be configured as LED drive mode or GPIO mode and are available on the connector labeled "RGB*".
The I/O signals from AW9523B are available on the connector labeled "RGB*" at the left of the badge:
| RGB0 | function |
|---|---|
| 1 | GND |
| 2 | P0_0 |
| 3 | P0_1 |
| 4 | P0_2 |
| RGB1 | function |
|---|---|
| 1 | GND |
| 2 | P0_3 |
| 3 | P0_4 |
| 4 | P0_5 |
| RGB2 | function |
|---|---|
| 1 | GND |
| 2 | P0_6 |
| 3 | P0_7 |
| 4 | P1_4 |
| RGB3 | function |
|---|---|
| 1 | GND |
| 2 | P1_5 |
| 3 | P1_6 |
| 4 | P1_7 |
The badge's main input interface consists of two Dial Wheel Switches. These switches can be rotated up or down for short and long presses to navigate and interact with the UI. Pressing the center of the left switch results in the same effect as rotating the wheel UP, while pressing the center of the right switch results in the same effect as rotating the wheel DOWN.
Note: push the left switch (or rotating the wheel UP) during boot to put the MCU in Joint Download Boot mode to download binary files into flash using UART0 or USB interface. To reset/restart the MCU push the micro switch labeled "RST" on the top left of the badege.
If a badge is stuck in a boot loop (serial log repeats esp_image: invalid segment length 0xffffffff / Factory app partition is not bootable), the firmware image itself is corrupt — most likely from a flash that got interrupted. Fix by reflashing over USB:
pio run -e emf2026-badge -t upload
pio run -e emf2026-badge -t uploadfs
(upload fixes the corrupted firmware; uploadfs refreshes the filesystem — settings/high scores regenerate from defaults on next boot.)The badge's native USB-JTAG interface will normally re-enumerate on its own after the flash; if pio can't find the port automatically, pass it explicitly, e.g. --upload-port /dev/cu.usbmodemXXXX (find it with pio device list).
During the boot process, the messages by the ROM code can be printed to (Default) UART0 and USB Serial/JTAG controller.
The UART interface and the Strapping (button pin) signals are available on the connector labeled "RS232" at the top of the badge:
| pin | function |
|---|---|
| 1 | GND |
| 2 | TX |
| 3 | RX |
| 4 | button B |
| 5 | button A |
The USB-C connector's D+/D- pins are connected to the default USB Serial/JTAG Controller and the USB power is routed to the LiPo battery charger and the voltage regulators.
There is the MT3608 step-up converter intended for power the WS2812 with up to 5V and the MT3410LB step-down DC-DC 3.3V regulator, capable of delivering up to 1.3A output current to the MCU and all the other IC.
In case of low power and low noise applications it's possible to disable the MT3410LB by removing two 0 ohm resistors labeled SW_ON/SW_OUT and enable the RT9080 low-dropout (LDO) 3.3 voltage regulator by shorting two resistors pads labeled LDO_ON/LDO_OUT
The power lines are available on the connector labeled "POW" at the top of the badge:
| pin | function |
|---|---|
| 1 | GND |
| 2 | +3.3V |
| 3 | +4.75V |
The battery is charged using a TP4054 single-charge LiPo charger with a constant current/voltage algorithm and a DW01 protection IC designed to protect the battery from damage due to over-discharge and/or over-current. The charging circuit and voltage regulators are always powered by the USB port. A toggle switch for turning the badge on and off via the battery is located on the bottom of the badge.
For a detailed reference of the firmware — boot flow, FreeRTOS tasks, screens, BLE / Wi-Fi, the streaming schedule-sync pipeline, config & storage, the build/flash workflow and the non-obvious gotchas — see SKILL.md.
It is written as a Claude Code
skill: copy it to .claude/skills/badge-architecture/SKILL.md in your clone and
Claude Code will load it automatically when you work on the badge.
Install Visual Studio Code as development environment:
Install PlatformIO extension on Visual Studio Code:
Please follow to the official documentation PlatformIO IDE for VSCode.
If you get a No module named pkg_resources error, open the PlatformIO Core CLI and run:
pip install setuptoolsPrerequisites:
Use NPM to Install required Packages:
npm install node-minify node-sass./www-build.sh
docker build --pull --rm -f "Dockerfile" -t emf2026badge:latest "."docker run -it -v $(pwd)/public:/public -v $(pwd)/data/www:/output emf2026badgedocker run -it -v ${PWD}/public:/public -v ${PWD}/data/www:/output emf2026badgeIn order to upload the filesystem to the badge you need to plugin the badge using USB. In the "Project Tasks" view of PIO navigate to:
emf2026-badge
Platform
Build Filesystem ImageUpload Filesystem ImageIn order to upload the firmware to the badge you need to plugin the badge using USB. In the "Project Tasks" view of PIO navigate to:
emf2026-badge
General
BuildUploadCheck GitHub issue tracker
The Wi-Fi SSID for connecting to an external Access Point (AP) is limited to 20 characters.
No comments yet. Be the first to ask about this board.