The Origin: Why Is Raspberry Pi Called Raspberry Pi?
If you have ever wondered why is Raspberry Pi called Raspberry Pi, the answer is a two-part homage to 1980s microcomputing history and modern programming languages. When Eben Upton and the founding trustees were naming their new single-board computer in 2012, they deliberately chose a fruit to continue a decades-old industry tradition. The "Pi" suffix was originally intended to signal that the board would primarily run Python, reflecting its educational mission to teach software development.
The fruit-naming convention was a staple of the early personal computer boom. Companies chose friendly, approachable names to distance their machines from the intimidating, industrial branding of mainframe era computing. By naming their $35 board after a fruit, the Raspberry Pi Foundation was directly winking at the pioneers of the microcomputer revolution.
The Fruit & Flora Computing Heritage
Here is how the Raspberry Pi fits into the broader historical context of botanical computing brands:
| Company / Project | Year Founded | Namesake Origin | Current Status |
|---|---|---|---|
| Apple Computer | 1976 | Steve Jobs' fruitarian diet / Oregon commune visits | Active (Global tech giant) |
| Tangerine Computer Systems | 1979 | Named after the fruit to follow Apple's UK market trend | Defunct (Acquired by Acorn) |
| Apricot Computers | 1965 (as ACT) | Continued the British fruit-naming tradition in the 80s | Defunct (Mitsubishi buyout) |
| Blackberry (RIM) | 1984 (Brand 1999) | Keys on early PDA keyboards resembled berry drupelets | Defunct (Pivot to software) |
| Raspberry Pi | 2012 | Homage to fruit brands + Python ("Pi") | Active (Global standard for SBCs) |
Source: Historical data synthesized from the Raspberry Pi Official Documentation and computing archives.
Project Build: The "Heritage" I2C OLED Boot Monitor
To celebrate this history, we are going to build a custom I2C OLED boot monitor. This project displays a trivia splash screen about the Pi's name origin on startup, then seamlessly transitions into a live CPU temperature and voltage monitor. This is particularly useful for the Raspberry Pi 5 (8GB variant), which runs significantly hotter than the Pi 4 and benefits greatly from at-a-glance thermal monitoring without needing to SSH into the terminal.
Time Required: 30 minutes
Target Board: Raspberry Pi 5 (8GB RAM, SKU: SC1113) running Raspberry Pi OS Bookworm (64-bit).
Parts List
- Raspberry Pi 5 (8GB) (~$80) - The current flagship, featuring the BCM2712 SoC.
- 0.96" 128x64 SSD1306 I2C OLED Display (~$12) - Ensure it is the I2C variant (4 pins), not SPI (7 pins).
- Female-to-Female Dupont Jumper Wires (4-pack) - 20cm length ideal for keeping capacitance low.
- MicroSD Card (32GB, Class 10, SanDisk Extreme) - For the OS.
- 27W USB-C PD Power Supply - Official Raspberry Pi 27W PD supply to prevent brownout warnings under load.
Pin Mapping Table
The Raspberry Pi 5 maintains the standard 40-pin header layout, but be aware that the internal I2C pull-up resistors on the Pi 5 are 1.8kΩ (compared to the older 4.7kΩ standard). This is generally fine for short Dupont runs to an SSD1306.
| OLED Pin | Pi 5 40-Pin Header | GPIO / Function | Wire Color (Std) |
|---|---|---|---|
| GND | Pin 6 | Ground | Black |
| VCC | Pin 1 | 3.3V Power | Red |
| SCL | Pin 5 | GPIO 3 (I2C1 SCL) | Yellow |
| SDA | Pin 3 | GPIO 2 (I2C1 SDA) | Orange |
Wiring and Software Setup
- De-energize the board: Unplug the USB-C power supply before connecting any wires to the GPIO header.
- Connect the I2C lines: Wire the OLED to the Pi 5 exactly as specified in the pin mapping table above. Double-check that VCC goes to 3.3V (Pin 1). Warning: Sending 5V to the VCC pin of a 3.3V OLED will instantly fry the display controller.
- Boot and Enable I2C: Power on the Pi, open a terminal, and run
sudo raspi-config. Navigate to Interface Options > I2C and enable it. Reboot the Pi. - Verify the Hardware Address: Run
sudo i2cdetect -y 1. You should see3cin the grid. If you see3d, your OLED has a different address strapped via its PCB jumper. - Set up the Python Environment: Raspberry Pi OS Bookworm enforces PEP 668, meaning you cannot use
pip installglobally without breaking system packages. Create a virtual environment:mkdir ~/pi-monitor && cd ~/pi-monitor python3 -m venv venv source venv/bin/activate pip install luma.oled psutil
Complete Python Code with Error Handling
This script uses the robust luma.oled library to handle the display buffer. It includes a fallback mechanism for reading the Pi 5's CPU temperature, as the sysfs thermal zone paths occasionally shift between kernel versions.
#!/usr/bin/env python3
import time
import psutil
from luma.core.interface.serial import i2c
from luma.core.render import canvas
from luma.oled.device import ssd1306
from PIL import ImageFont
# --- Configuration ---
I2C_PORT = 1
I2C_ADDRESS = 0x3C
TRIVIA_TEXT = "Raspberry: 1980s fruit trend.\nPi: Python heritage."
def get_cpu_temp():
"""Reads CPU temp, handling Pi 5 sysfs fallbacks."""
try:
temps = psutil.sensors_temperatures()
if 'cpu_thermal' in temps:
return temps['cpu_thermal'][0].current
# Pi 5 fallback via sysfs
with open("/sys/class/thermal/thermal_zone0/temp", "r") as f:
return float(f.read()) / 1000.0
except Exception:
return 0.0
def main():
# Initialize I2C serial interface
serial = i2c(port=I2C_PORT, address=I2C_ADDRESS)
device = ssd1306(serial)
# Load default font
font = ImageFont.load_default()
# 1. Show Heritage Splash Screen
with canvas(device) as draw:
draw.text((0, 0), "Heritage Monitor", font=font, fill="white")
draw.text((0, 16), TRIVIA_TEXT, font=font, fill="white")
time.sleep(4)
# 2. Transition to Live Monitoring Loop
try:
while True:
temp = get_cpu_temp()
cpu_usage = psutil.cpu_percent(interval=0.1)
ram = psutil.virtual_memory().percent
with canvas(device) as draw:
draw.text((0, 0), f"CPU: {cpu_usage:5.1f}%", font=font, fill="white")
draw.text((0, 16), f"RAM: {ram:5.1f}%", font=font, fill="white")
# Highlight temp in red (via inversion block) if throttling threshold hit
if temp > 75.0:
draw.rectangle((0, 32, 128, 48), outline="white", fill="white")
draw.text((2, 34), f"TEMP: {temp:4.1f}C !", font=font, fill="black")
else:
draw.text((0, 32), f"TEMP: {temp:4.1f}C", font=font, fill="white")
time.sleep(1)
except KeyboardInterrupt:
device.cleanup()
print("Monitor stopped safely.")
if __name__ == "__main__":
try:
main()
except FileNotFoundError as e:
print(f"FATAL: {e}\nFix: I2C is not enabled. Run 'sudo raspi-config'.")
except PermissionError as e:
print(f"FATAL: {e}\nFix: Run script with sudo or add user to 'i2c' group.")
except OSError as e:
print(f"FATAL I2C Error: {e}\nFix: Check wiring, pull-ups, and i2cdetect address.")
Debugging: First Three Things to Check When It Fails
When working with raw I2C on the Pi 5, you will inevitably hit bus errors. Here is the exact decision path for the most common failure modes.
1. The "No such file" Boot Error
Exact Error String: FileNotFoundError: [Errno 2] No such file or directory: '/dev/i2c-1'
- Cause: The I2C kernel module is not loaded because the interface is disabled in the OS configuration.
- Fix: Run
sudo raspi-config, enable I2C under Interface Options, and reboot. Alternatively, edit/boot/firmware/config.txtand ensuredtparam=i2c_arm=onis present and uncommented.
2. The "Remote I/O" NACK Error
Exact Error String: OSError: [Errno 121] Remote I/O error
This is the most notorious I2C error. It means the Pi sent the address byte, but no device acknowledged (NACK) it on the bus.
- Check 1 (Address Mismatch): Run
i2cdetect -y 1. If your OLED shows up at3dinstead of3c, update theI2C_ADDRESSvariable in the Python script to0x3D. - Check 2 (Wiring/Capacitance): Dupont wires are notorious for loose internal crimps. Swap the SDA/SCL wires. If your wires are longer than 12 inches, the bus capacitance exceeds the Pi 5's 1.8kΩ pull-up drive capability. According to Texas Instruments I2C bus specifications, you must add external 4.7kΩ pull-up resistors to 3.3V on both SDA and SCL lines for long runs.
- Check 3 (Power Starvation): If the OLED backlight flickers before the error, the Pi's 3.3V rail might be sagging. Ensure you are using the official 27W USB-C PD power supply.
3. The PEP 668 Environment Error
Exact Error String: error: externally-managed-environment
- Cause: You tried to run
pip install luma.oledglobally on Raspberry Pi OS Bookworm. - Fix: Never use
--break-system-packages. Always use thepython3 -m venv venvmethod outlined in step 5 of the setup guide to isolate your project dependencies.
Extending and Simplifying the Build
Depending on your end goal, you can take this project in two different directions:
How to Simplify (The HAT Route)
If Dupont wires and I2C debugging are causing too much friction, eliminate the wiring entirely by using a plug-and-play HAT. The Adafruit PiOLED 128x32 or the Pimoroni OLED Breakout slide directly onto the first 6 pins of the GPIO header. They use the exact same SSD1306 controller and I2C bus, meaning the Python code above will work with zero modifications (though you may need to adjust the Y-axis coordinates in the draw.text calls to fit the 32-pixel height of the PiOLED).
How to Extend (The Environmental Route)
The I2C bus supports up to 112 devices. You can daisy-chain a Bosch BME280 environmental sensor (address 0x76) onto the exact same SDA/SCL pins used by the OLED. By adding the adafruit-circuitpython-bme280 library to your virtual environment, you can expand the OLED display to show ambient room temperature and humidity alongside the Pi's internal CPU thermals. This is an excellent setup for monitoring server closets or enclosed 3D-printer electronics bays where the Pi 5 is acting as a Klipper host.






