OLED display for an MMDVM hotspot: wiring and what it shows
A tiny 0.96″ screen turns a hotspot from a "box with blinking LEDs" into a real instrument: you can see the mode, who is being heard right now, the frequency and the IP address — no need to dig into the web dashboard to confirm the node is alive and working. It costs next to nothing and connects with four wires, but those four wires are exactly where people get stuck most often. Let's go through it honestly: what to solder, what to put in the config, what the screen actually shows and where the gotchas are.
Which display to get
The standard for hotspots is a monochrome OLED 128×64 on an SSD1306 controller with an I2C interface (four pins: VCC, GND, SCL, SDA). The most common size is 0.96″; there is also 1.3″, which is larger and readable from across the room.
- 0.96″ SSD1306, I2C — the sweet spot: cheap and supported out of the box.
- 1.3″ — larger, but here's the catch: many 1.3″ panels are not built on an SSD1306 but on a similar yet different controller, the SH1106. More on that below — it's reason #1 for a "wonky" screen.
- SPI version (6–7 pins) — these exist too, but for a hotspot get the I2C one: fewer wires and simpler.
I2C wiring: four wires
I2C is nice because there are only two lines — data SDA and clock SCL — plus power and ground. On the Raspberry Pi header these are adjacent pins at the start of the row:
| Display pin | Raspberry Pi pin (physical number) |
|---|---|
| VCC | Pin 1 — 3.3 V |
| SDA | Pin 3 — GPIO2 / SDA1 |
| SCL | Pin 5 — GPIO3 / SCL1 |
| GND | Pin 6 — GND |
A small subtlety: on some modules the pins are labeled in the order GND VCC SCL SDA, on others VCC GND SDA SCL. Don't solder "by position" — solder by the labels. Swapped GND and VCC are a common cause of a dead screen.
Check that the Pi sees the display
Before touching the hotspot config, make sure the board is even "visible" on the bus. Enable I2C (in Pi-Star / plain Raspberry Pi OS — via raspi-config → Interface → I2C → Enable), then:
sudo i2cdetect -y 1
The table should show a cell at 3c (more rarely 3d) — that's the display's address, usually 0x3C:
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
...
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
- Empty, nothing shows — check the SDA/SCL soldering, the power, and that I2C is actually enabled.
- You see 3d instead of 3c — a jumper/resistor on the module sets a different address. Remember it, you'll need it for the driver.
Enable the display in the config
The hotspot draws to the screen via MMDVMHost (the engine under the hood of any firmware). In classic Pi-Star the display is enabled in one click: Configuration → MMDVM Display Type → OLED → Apply Changes. "Under the hood" this edits the MMDVM.ini file:
[General]
Display=OLED
[OLED]
Type=3
Brightness=0
Invert=0
Rotate=0
The key parameter is Type. It sets the panel model:
| Type | What it is |
|---|---|
| 3 | I2C 128×64 — the regular 0.96″ SSD1306 (the default choice for a hotspot) |
| 6 | Panel on an SH1106 controller (often the "wonky" 1.3″ ones) |
| 2 | I2C 128×32 — narrow "stripe" display (different height) |
| 0–1 | SPI variants on 6 pins (different pinout, not used for a hotspot) |
The full list of Type values (0–6, including the Adafruit SPI variants and Seeed panels) is in the MMDVMHost documentation, but for the vast majority of I2C hotspots you only need 3 and 6.
What the screen actually shows
When idle (nobody transmitting) the display draws a status splash: the node's callsign/name, the mode (DMR), sometimes an antenna icon and the network state. As soon as someone keys up, the screen switches to a "live" view:
- Last heard — the callsign and DMR ID of whoever the hotspot is hearing right now (and afterwards, who spoke last).
- Talkgroup / slot — which talkgroup the traffic is on, TS1 or TS2.
- Mode — DMR (on a multimode setup, YSF/D-STAR etc. may also pop up).
- The hotspot's IP address on the local network — handy for opening the dashboard without scanning the network.
- BER (Bit Error Rate, %) during reception — an indicator of signal quality and whether the frequency has drifted. More in the article on calibration.
- Sometimes — the CPU temperature and uptime, if enabled in the firmware.
In other words, the OLED is essentially a local "air monitor": a glance at the screen tells you who's on and how they're being received, without opening a browser.
Common problems and how to fix them
- Screen is black, nothing there. Start with i2cdetect. No address — soldering/power/I2C is off. Address shows up but blank — almost always Display=OLED is not enabled in the config.
- Image shifted 2 pixels to the left / junk along the edge. This is the signature symptom: you have an SH1106, but the driver is set for an SSD1306. The SH1106 has 132 columns of RAM internally with 128 visible, so it needs a 2-pixel offset — set Type=6 (or SH1106 mode in the firmware).
- Image is upside down (the module was mounted the other way up). Fix with rotation: Rotate=1 in the [OLED] section, or the rotation option in the dashboard.
- I2C conflict. If something else with address 0x3C hangs on the bus, you get garbage. A hotspot usually has just one display, so simply don't put a second device on the same address.
- Display not soldered / cold joint. Buzz out the contacts, wiggle them — flicker and dropouts are almost always mechanical, not software.
A hotspot with a screen — into the DMRhub network
Built a node and want to see live network traffic on the display? Build an image for your board in the wizard — the node registers itself on the portal, and the OLED is enabled with a single checkbox in the dashboard.
Sources
- F5UII — installing an OLED SSD1306 on MMDVM/MMDVMHost: f5uii.net
- HamOperator — "MMDVM .96″ OLED Now Works" (Type 3/6, SSD1306 vs SH1106): wp.hamoperator.com
- Adafruit — wiring an SSD1306 OLED over I2C on a Raspberry Pi: learn.adafruit.com
- Universal-Solder — "random pixels": SSD1306 vs SH1106: universal-solder.ca