Skip to content

Hardware and variants

Four boards wear the same cube. Confirm which one you have before you flash it, because they use different chips and flash differently. The screen is the same 1.54” 240×240 ST7789 IPS panel on all of them.

The GeekMagic SmallTV is a 45 × 35 × 40 mm cube with a 28 × 28 mm colour screen and a USB-C port for power. It sells for about 6 to 8 EUR on AliExpress. A second version of the hardware, sold under the same “smart weather clock” listing, swaps the ESP8266 for an ESP32-C2 but keeps the case and screen. A third device, the NMMiner NM-TV-154 BTC lottery miner, uses the same cube and screen with a classic ESP32 inside. And GeekMagic’s own upmarket model, the SmallTV Pro, pairs a classic ESP32 with 8 MB of flash.

Look at the board through the case vents, or open it (four clips, no glue).

  • SmallTV (ESP8266): an ESP8266 module, no separate USB-serial chip. Flashes over the air.
  • SmallTV (ESP32-C2): a bare ESP8684 chip (that is the ESP32-C2) plus a CH340C USB-serial chip next to the USB-C port. Flashes over USB-C.
  • NM-TV-154 (ESP32): the PCB reads NM-TV-Miner and carries an ESP32-WROOM-32E module. Sold as an NMMiner BTC lottery miner, not as a weather clock. Flashes over USB.
  • SmallTV Pro (ESP32): sold by GeekMagic as the SmallTV Pro, with a capacitive touch button on top of the case. A classic ESP32 with 8 MB flash. The USB-C port is power only (no USB-serial chip): flashes over the air from the stock web UI, or over an internal UART header.

The two chips on the ESP32-C2 board are the giveaway. The main SoC is marked ESP8684, and the small 16-pin chip by the USB-C port is the CH340C.

The ESP8684 (ESP32-C2) main chip on the ESP32-C2 board

The CH340C USB-serial chip next to the USB-C port

The SmallTV (ESP8266)

The “Ultra” units (branded Ultra-Vx.x.x) are this same ESP-12F board, just with different stock firmware and a different flash layout. They run this firmware fine, but the first install needs the loader step in Flashing.

Product photos show each unit running its stock firmware, not this one, and the on-screen style varies by model and firmware version (a weather clock, a ticker, and so on). Match your device’s screen and the tell-tale signs to identify the model before picking a binary.

MCUESP-12F (ESP8266), 4 MB flash
Display1.54” 240×240 IPS ST7789, hardware SPI
Body45 × 35 × 40 mm, USB-C power
Light sensoroptional LDR on A0 (not populated on all units)
WireGuard VPNnot available on this chip
Build envsmalltv, or smalltv_lean

Two images are published for this board. smalltv-mod-firmware.bin carries every feature. smalltv-mod-firmware-lean.bin is the same code with Home Assistant screens and the usage meter compiled out, which leaves the heap 8,732 bytes larger. That matters here and on no other board, because the ESP8266 shares one 80 KB arena between static allocations and the heap, and the radar and cash.ch fetches both refuse to start a TLS handshake when it runs short. Which release file to download covers when to pick which.

Hardware SPI on the ESP8266 uses fixed clock and data pins. The rest are the SmallTV wiring, confirmed from teardowns and the ESPHome and Tasmota communities.

SignalGPIONote
SPI CLK14hardware SPI (fixed)
SPI MOSI13hardware SPI (fixed)
DC0boot-strap pin
RST2boot-strap pin
CS15boot-strap pin
Backlight5PWM, active-low

The SmallTV (ESP32-C2)

MCUESP32-C2 (ESP8684), 4 MB embedded flash, RISC-V, 120 MHz
USB-serialCH340C on the USB-C port (auto-reset wired)
RegulatorAMS1117-3.3
Display1.54” 240×240 IPS ST7789V, SPI, RGB colour order
WireGuard VPNincluded
Build envsmalltv_c2

The ESP32-C2 has no native USB. The CH340C bridges the USB-C port to the chip’s UART, which is how it is flashed. Its auto-reset is wired, so esptool enters download mode on its own with no button to hold.

The ESP32-C2 routes SPI through the GPIO matrix, so the display pins are arbitrary GPIOs rather than fixed hardware-SPI pins. This map comes from a community ESPHome config for this exact board and is confirmed working.

SignalGPIONote
SPI CLK4
SPI MOSI6
DC5
RST1
CSGNDtied low on the panel, not driven
Backlight18PWM, active-low

The pins are set in src/board_esp32c2.h. Two panel quirks are worth knowing: the display needs SPI mode 3, and its colour order is RGB. Both are handled in src/Gfx.cpp. If red and blue look swapped on your unit, set “Colour order” to BGR in the Display tab; the board header’s TFT_BGR is only the default the web UI starts from.

The NM-TV-154 running its stock NMMiner firmware

MCUESP32-WROOM-32E (ESP32-D0WD-V3), 40 MHz crystal, 4 MB flash
Display1.54” 240×240 IPS ST7789, SPI, RGB colour order
Sold asNMMiner NM-TV-154 BTC lottery miner, PCB marked “NM-TV-Miner”
WireGuard VPNnot in the published image, no flash left for it
Build envsmalltv_esp32

The pin map comes from NMMiner’s own custom-firmware guide for the device and is confirmed working on hardware by a community tester in issue #1: display, colours, backlight PWM, and the 4 MB flash layout all check out.

SignalGPIONote
SPI CLK14
SPI MOSI13
DC2
RSTnot connectedpanel reset line is unwired
CS15
Backlight19PWM, active-low
Panel power21driven low at boot to power the display

The pins are set in src/board_esp32.h.

The GeekMagic SmallTV Pro running its stock firmware

MCUclassic ESP32, 8 MB flash
Display1.54” 240×240 IPS ST7789V, SPI, RGB colour order
Extrascapacitive touch button (GPIO 32, unused by this firmware)
WireGuard VPNincluded
Build envsmalltv_esp32_8mb

GeekMagic’s own higher-end model. Same cube and panel, but a classic ESP32 with 8 MB flash, which doubles the OTA app slots (2.125 MB each) and leaves about 3.7 MB for LittleFS. The partition layout matches the stock firmware’s, verified from a live device.

Unlike the ESP32-C2 board there is no USB-serial chip: the USB-C port is power only. The first install goes over the air from the stock web UI, and serial access means opening the case and wiring a 3.3 V USB-UART adapter to the internal header (see Flashing).

The pin map comes from the ESPHome SmallTV Pro community config and matches what the stock firmware uses. Confirmed working on a real device: display, colours, backlight PWM, and the 8 MB flash layout.

SignalGPIONote
SPI CLK18
SPI MOSI23
DC2
RST4
CSGNDtied low on the PCB, not driven
Backlight25PWM, active-low
Touch button32ESP32 T9 touch channel, unused

The pins are set in src/board_esp32_pro.h.

The pins are fixed to the SmallTV wiring and are not editable from the web UI. A few display symptoms have settings-level fixes:

  • Dark screen with backlight on: try toggling “Backlight is active-low” in the Display tab. All boards default to active-low.
  • Wrong orientation: change Orientation in the Display tab.
  • Red and blue swapped: set “Colour order” to BGR in the Display tab. The board headers still carry a TFT_BGR compile-time default per variant, but the web UI overrides it, so there is nothing to rebuild.
  • Colours look warm, cold, or tinted: the panels fitted to these units are not all the same part. Use the Red, Green, and Blue gain sliders in the Display tab’s Colour card to pull the cast out.
  • The screen looks like a negative: tick “Invert the panel” in the same card.

For a different board entirely, change the pins in the relevant src/board_*.h header.