Skip to content

Hardware and variants

Three 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.

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.

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)

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)
Build envsmalltv

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
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, flip TFT_BGR in the board header and reflash.

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”
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 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 TFT_BGR to 1 in your board’s src/board_*.h header, rebuild, and reflash.

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