Issue No. 037 · Boulder, CO
How to make a portable display with a 0.95 inch 96x64 OLED?
How to Make a Portable Display with a 0.95 inch 96x64 OLED
To build a portable display using a 0.95 inch 96x64 OLED, you need to pair the screen with a microcontroller like an ESP32 or an STM32, a small battery, and a custom PCB or breakout board. The 0.95 inch 96x64 color oled display is a solid choice because it draws only about 20mA at full brightness, has a 1.2mm thick glass substrate, and supports SPI communication at up to 10MHz. This gives you a refresh rate of roughly 60 frames per second for static images, and around 30 fps for animations with 16-bit color depth. The display itself measures 25.3mm x 14.7mm x 1.45mm, making it one of the smallest full-color OLEDs you can buy off the shelf. The active area is 20.14mm x 13.42mm, with a pixel pitch of 0.21mm, which is sharp enough for text at 6-point font size.
For the portable aspect, you need a power source that can drive the OLED and the microcontroller for at least a few hours. A 100mAh LiPo battery at 3.7V works well, giving you about 2.5 hours of continuous use if the display is on full brightness and the MCU is running at 80MHz. If you drop the brightness to 50% and use sleep modes, you can stretch that to 8 hours. The OLED driver IC, typically the SSD1331, has a built-in DC-DC converter that generates the 12V to 15V needed for the organic pixels, so you don't need an external boost converter. But you do need a 3.3V regulator for the logic side, because the OLED runs on 3.3V for the digital interface. The SSD1331 supports 262k colors, but the actual color gamut is about 72% of NTSC, which is decent for icons and simple graphics. The contrast ratio is quoted at 10,000:1, which is typical for OLEDs, and the viewing angle is 170 degrees in both directions.
When designing the PCB, keep the SPI traces short—under 50mm—to avoid signal degradation at 10MHz. Use a 0.1uF decoupling capacitor right next to the VCC pin of the OLED, and another 10uF tantalum capacitor on the battery input. The OLED has 7 pins: VCC, GND, CS, DC, RES, SCLK, and MOSI. You can also use the 8-pin variant that includes a MISO pin, but that's not needed for most projects. The SPI interface is 4-wire, so you can drive it with any MCU that has a hardware SPI module. The ESP32 is a good choice because it has deep sleep mode that draws only 5uA, and it has built-in WiFi and Bluetooth, which you can use to update the display content wirelessly. For a purely portable display, you might skip the wireless and use an STM32F103C8T6, which draws 10mA in active mode and 2uA in sleep. The total power budget for the system is around 40mA at 3.3V when the display is active, and 10uA in sleep. That means a 100mAh battery gives you 2.5 hours of active use, or about 11,000 hours in sleep mode.
Mechanically, you need a housing that holds the OLED, the battery, and the PCB. A 3D-printed enclosure works well, with dimensions around 40mm x 30mm x 10mm. The OLED has a flex cable that is 15mm long, so you can mount it on a separate small board and connect it with a 0.5mm pitch FPC connector. The connector is a 7-pin, 0.5mm pitch, bottom-contact type, which is standard for these displays. The flex cable is delicate, so you might want to reinforce it with a dab of epoxy at the connector. The OLED itself is sensitive to moisture, so if you plan to use it outdoors, you need a conformal coating or a hydrophobic layer. The operating temperature range is -40°C to 85°C, but the contrast drops at low temperatures because the organic materials have lower mobility. At 0°C, the brightness drops by about 20%, and at -20°C, it drops by 40%. So for winter use, you might need to preheat the display with a small resistor.
For software, you need a library that supports the SSD1331. The Adafruit SSD1331 library works well, but it's written for Arduino. If you're using an ESP32, you can use the TFT_eSPI library, which is faster because it uses hardware SPI and DMA. The library supports 16-bit color mode, which gives you 65,536 colors, but the display actually supports 18-bit color internally, so you can also use 6-6-6 bit packing if you want better color accuracy. For a portable display, you want to minimize the data transfer to save power. One trick is to use the display's partial update mode, which only updates a rectangular region of the screen. This reduces the SPI data by up to 90% if you're just updating a small icon or a clock. The SSD1331 supports a hardware scroll function, which is useful for scrolling text without any CPU overhead. You can set the scroll speed from 0.1 seconds to 10 seconds per frame, which is handy for a ticker display.
Battery management is critical. Use a TP4056 charger module with a 100mAh LiPo cell. The TP4056 charges at 100mA, which is safe for small batteries. The charge current is set by a resistor on the module, so you can change it to 50mA if you want a slower charge. The OLED has a maximum input voltage of 3.6V on the VCC pin, so you need a 3.3V regulator. The AMS1117-3.3 is a common choice, but it has a dropout voltage of 1.1V, so it won't work with a battery that drops below 4.4V. Instead, use a TPS70933, which has a dropout of 300mV, so it works down to 3.6V input. That means you can use the battery down to 3.6V, which gives you about 80% of the capacity. The battery voltage should be monitored with an ADC pin on the MCU, and you should shut down the display when the battery drops below 3.4V to avoid deep discharge.
For the user interface, you can add a single button to toggle the display on and off, or to cycle through different screens. A momentary push button with a 10k pull-up resistor works fine. You can also add a capacitive touch pad using a copper pad on the PCB, which consumes less power than a mechanical button. The ESP32 has a touch sensor peripheral that can detect a finger touch with no extra components. The touch pad draws about 1uA in idle mode, which is negligible. For a more advanced portable display, you can add a microSD card slot for storing images or fonts. The SD card interface uses SPI as well, so you need to share the SPI bus with the OLED. Use a separate CS pin for the SD card, and make sure the OLED is deselected when you're writing to the SD card. The SD card draws about 50mA during write, which is a significant power hit, so use it sparingly.
The display's pixel structure is a 96x64 matrix, which is a 3:2 aspect ratio. For a clock display, you can show hours and minutes in a 24-point font, which takes about 40x30 pixels. For a weather display, you can show an icon and a temperature value. The OLED has a brightness of 100 cd/m² typical, which is readable indoors but not in direct sunlight. The polarizer is circular, so it works well with polarized sunglasses. The response time is 0.1ms, which is faster than any LCD, so there's no motion blur. The lifetime is rated at 50,000 hours to half brightness, which is about 5.7 years of continuous use. But the blue pixels degrade faster than red and green, so the color balance shifts over time. To mitigate this, you can use a color correction algorithm that reduces the blue channel intensity by 10% after 10,000 hours of use.
For the enclosure, you can use a two-part 3D printed case with a cutout for the OLED. The OLED has a viewing window that is 20.14mm x 13.42mm, so the cutout should be slightly larger, say 21mm x 14.5mm, to avoid obscuring the pixels. The OLED is glued to the case with a thin double-sided tape, preferably 3M 467MP, which is 0.05mm thick and holds well. The battery can be glued to the back of the PCB with a foam tape to prevent rattling. The total weight of the portable display is about 15 grams, including the battery and case. That's light enough to attach to a keychain or a lanyard. For a wrist-worn version, you can use a flexible PCB and a smaller battery, but the OLED itself is rigid, so the overall form factor is still a flat rectangle.
From a manufacturing perspective, the 0.95 inch OLED is available in both COG (chip-on-glass) and COF (chip-on-flex) versions. The COG version has the driver IC on the glass, which is cheaper but more fragile. The COF version has the driver on the flex cable, which is more robust but costs about $1 more. For a portable display, the COF version is better because the flex cable can be bent to fit into a tight enclosure. The display module itself costs around $8 to $12 in single quantities, and about $5 in volume of 1000 pieces. The total bill of materials for the portable display, including the MCU, battery, regulator, and PCB, is about $20 to $25 for a single unit. In production, the cost drops to around $10 to $12 per unit.
For testing, you should check the SPI communication at 10MHz with an oscilloscope. The clock signal should have a rise time under 10ns, and the data lines should be clean. The OLED's RES pin needs a low pulse of at least 10us to initialize the driver. After reset, you need to send the initialization commands: set the display off, set the multiplex ratio to 63, set the display start line to 0, set the segment remap to 0x51, set the COM scan direction to 0x60, set the contrast to 0x7F, set the master current to 0x0F, set the display on. The full initialization sequence takes about 10ms. For a portable display, you can skip the full initialization if you're just waking from sleep, and just send the display on command, which takes 1ms.
One common issue with portable OLED displays is the ghosting effect, where previous images linger for a few seconds. This is caused by the internal charge storage in the OLED pixels. The SSD1331 has a pre-charge feature that reduces ghosting, but you need to enable it by setting the pre-charge period to 2 clock cycles and the pre-charge voltage to 0.6V. Another issue is the uneven brightness across the display, which is caused by the IR drop in the VCC traces. To fix this, you can use a thicker copper pour on the PCB, or add a second VCC pin on the opposite side of the display. The OLED has two VCC pins on the flex cable, but only one is connected on the standard module. You can solder a wire to the second pad to improve the current distribution.
For a more advanced portable display, you can add a light sensor to adjust the brightness automatically. A photodiode like the TEMT6000 works well, and it draws only 0.1mA. The ADC reading from the sensor can be used to set the contrast register of the SSD1331. The contrast range is 0 to 255, where 0 is off and 255 is full brightness. You can map the ambient light level to a contrast value using a simple linear function. For example, if the ambient light is 100 lux, set the contrast to 100. If it's 1000 lux, set it to 200. This saves power in low light conditions and improves readability in bright light.
Finally, the portable display can be used as a smart badge, a mini weather station, a step counter display, or a notification screen for a smartphone. The small size and low power make it ideal for wearable applications. The 96x64 resolution is enough to show a 6-character text with a 16-pixel font, or a 4-character text with a 24-pixel font. For graphics, you can show a 32x32 pixel icon, which is common for app icons. The color depth is enough for 256 colors if you use 8-bit color mode, which reduces the SPI data by half compared to 16-bit mode. The trade-off is a slight color banding, but for most icons and text, it's not noticeable. The display can also be used in a monochrome mode, where each pixel is either on or off, which reduces the data to 1/16 of the full color mode. This is useful for low-power applications where you only need to show text.