I was tempted to just switch cases from my Raspberry Pi 4 to the Raspberry Pi 5, but look at it…
- 16×2 LCD display from an Arduino Starter Kit
- C++ program with the WiringPi library
- DIY case
I was really proud of it at the time and it was good learning back in 2020, but surely I could do better. Surely I could do a cool status panel!!
Components
- Raspberry Pi (probably compatible with any of them)
- OLED display (RGB 1.5 inch size is ideal)
- PCB prototype board
- Jumper cables
- Soldering iron
- Casing (3D printed or handcrafted)
Software config
I'll configure the Raspberry to interact with this display using python, with the Adafruit Circuitpython library for the SSD1351 display controller:
https://learn.adafruit.com/adafruit-1-5-color-oled-breakout-board/python-wiring-and-setup#setup-3042417
It's as simple as installing Circuitpython with the following command:
sudo pip3 install --upgrade click setuptools adafruit-python-shell build adafruit-circuitpython-rgb-display
If you find issues with your python version not finding a compatible circuit python version, include --break-system-packages at the end. (It wont break anything today, but don't get used to it...)
sudo pip3 install --upgrade click setuptools adafruit-python-shell build adafruit-circuitpython-rgb-display --break-system-packages
Wiring
Now wire your display according to the manufacturer guidance. Mine is this one from BuyDisplay:
https://www.buydisplay.com/full-color-1-5-inch-arduino-raspberry-pi-oled-display-module-128x128
OLED Display | Raspberry Pi (pin #) |
---|---|
GND | GND (20) |
VCC | 3V3 (17) |
SCL | SPI0 SCLK (23) |
SDA | SPI0 MOSI (19) |
RES | GPIO25 (22) |
DC | GPIO 24 (18) |
CS | SPI0 CE0 (24) |
Use a site like pinout.xyz to find a suitable wiring configuration.
You're ready to do some tests before making your final move to the PCB.
Script config
You can try Adafruit's demo script. Just make sure that you choose the right display and update any changes to the ping assignment (use IO numbers/names rather than physical pin numbers):
# Configuration for CS and DC pins (adjust to your wiring):
cs_pin = digitalio.DigitalInOut(board.CE0)
dc_pin = digitalio.DigitalInOut(board.D24)
reset_pin = digitalio.DigitalInOut(board.D25)
# Setup SPI bus using hardware SPI:
spi = board.SPI()
disp = ssd1351.SSD1351(spi, rotation=270, # 1.5" SSD1351
cs=cs_pin,
dc=dc_pin,
rst=reset_pin,
baudrate=BAUDRATE
)
Assembly
Here are the STL 3D files for this case design:
- Bottom:
rPi5_caseOLED_btm-v1.stl - Top:
rPi5_caseOLED_top-v2.stl - Display frame:
rPi5_caseOLED_frame-v1.stl - Display support:
rPi5_caseOLED_support-v1.stl
Now let's put it all together:
- Screw the frame to the display
- Solder the 7 pins of the display to 7 jumper cables across the PCB
- Wire all connections to the Raspberry Pi
- Screw the top and bottom pieces together
- Place the display on the support
Final result
I've shared the script you see on the images via github:
https://github.com/TheRoam/RaspberryPi-SSD1351-OLED
It currently displays:
- Time and date
- System stats (OS, disk usage and CPU temperature)
- Local weather from World Meteorological Organization (updated hourly)
And this is how it ends up looking. Much better right?
As always, enjoy your tinkering, and let me know any comments or issues on Twitter!