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.

Difficulty Rating: Beginner/Intermediate
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

  1. De-energize the board: Unplug the USB-C power supply before connecting any wires to the GPIO header.
  2. 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.
  3. 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.
  4. Verify the Hardware Address: Run sudo i2cdetect -y 1. You should see 3c in the grid. If you see 3d, your OLED has a different address strapped via its PCB jumper.
  5. Set up the Python Environment: Raspberry Pi OS Bookworm enforces PEP 668, meaning you cannot use pip install globally 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.txt and ensure dtparam=i2c_arm=on is 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 at 3d instead of 3c, update the I2C_ADDRESS variable in the Python script to 0x3D.
  • 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.oled globally on Raspberry Pi OS Bookworm.
  • Fix: Never use --break-system-packages. Always use the python3 -m venv venv method 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.