Bird
Raised Fist0
Raspberry Piprogramming~7 mins

Displaying sensor readings on OLED in Raspberry Pi

Choose your learning style10 modes available
Introduction

We use OLED screens to show sensor data so we can see real-time information easily without a computer screen.

You want to show temperature or humidity readings from a sensor on a small screen.
You need a portable display for sensor data in a project like a weather station.
You want to check sensor values quickly without connecting to a computer.
You are building a gadget that shows live data like air quality or light levels.
You want to learn how to connect sensors and displays on a Raspberry Pi.
Syntax
Raspberry Pi
import board
import busio
from adafruit_ssd1306 import SSD1306_I2C
import adafruit_dht

i2c = busio.I2C(board.SCL, board.SDA)
oled = SSD1306_I2C(128, 32, i2c)
dhtDevice = adafruit_dht.DHT22(board.D4)

try:
    temperature = dhtDevice.temperature
    humidity = dhtDevice.humidity
    oled.fill(0)
    oled.text(f"Temp: {temperature:.1f} C", 0, 0, 1)
    oled.text(f"Humidity: {humidity:.1f}%", 0, 16, 1)
    oled.show()
except RuntimeError as error:
    print(error.args[0])

This example uses the Adafruit DHT22 sensor and SSD1306 OLED display libraries.

Make sure your sensor and OLED are connected to the correct Raspberry Pi pins.

Examples
Shows a simple text message on the OLED screen.
Raspberry Pi
oled.text("Hello, OLED!", 0, 0, 1)
oled.show()
Reads temperature and humidity from the sensor and prints to the console.
Raspberry Pi
temperature = dhtDevice.temperature
humidity = dhtDevice.humidity
print(f"Temp: {temperature} C, Humidity: {humidity} %")
Clears the OLED screen and displays formatted temperature and humidity readings.
Raspberry Pi
oled.fill(0)
oled.text(f"Temp: {temperature:.1f} C", 0, 0, 1)
oled.text(f"Humidity: {humidity:.1f}%", 0, 16, 1)
oled.show()
Sample Program

This program reads temperature and humidity from a DHT22 sensor every 2 seconds and shows the values on a 128x32 OLED screen. If the sensor has an error, it prints the error message to the console.

Raspberry Pi
import board
import busio
from adafruit_ssd1306 import SSD1306_I2C
import adafruit_dht
import time

i2c = busio.I2C(board.SCL, board.SDA)
oled = SSD1306_I2C(128, 32, i2c)
dhtDevice = adafruit_dht.DHT22(board.D4)

while True:
    try:
        temperature = dhtDevice.temperature
        humidity = dhtDevice.humidity
        oled.fill(0)  # Clear the screen
        oled.text(f"Temp: {temperature:.1f} C", 0, 0, 1)
        oled.text(f"Humidity: {humidity:.1f}%", 0, 16, 1)
        oled.show()
    except RuntimeError as error:
        print(f"Sensor error: {error.args[0]}")
    time.sleep(2)
OutputSuccess
Important Notes

Use the correct pins for your sensor and OLED connections on the Raspberry Pi.

OLED screens usually need to be cleared before drawing new text to avoid overlapping.

Sensor readings can sometimes fail; handle errors to avoid crashes.

Summary

OLED screens let you see sensor data directly on your Raspberry Pi project.

Use libraries to read sensors and control the OLED easily.

Update the display regularly to show fresh sensor readings.

Practice

(1/5)
1. What is the main purpose of using an OLED screen with a Raspberry Pi when working with sensors?
easy
A. To increase the sensor's accuracy
B. To store sensor data permanently
C. To display sensor readings clearly and in real-time
D. To power the sensors automatically

Solution

  1. Step 1: Understand OLED screen function

    OLED screens are used to show information visually, such as text or images.
  2. Step 2: Relate to sensor data usage

    Displaying sensor readings on OLED helps users see live data clearly and quickly.
  3. Final Answer:

    To display sensor readings clearly and in real-time -> Option C
  4. Quick Check:

    OLED shows sensor data live = A [OK]
Hint: OLED screens show live sensor data visually [OK]
Common Mistakes:
  • Thinking OLED stores data permanently
  • Confusing display with sensor accuracy
  • Assuming OLED powers sensors
2. Which Python library is commonly used to control an SSD1306 OLED display on a Raspberry Pi?
easy
A. Adafruit_SSD1306
B. matplotlib
C. pygame
D. numpy

Solution

  1. Step 1: Identify libraries for OLED control

    Adafruit_SSD1306 is a popular Python library designed to control SSD1306 OLED displays.
  2. Step 2: Exclude unrelated libraries

    matplotlib and pygame are for graphics but not specific to OLED control; numpy is for math operations.
  3. Final Answer:

    Adafruit_SSD1306 -> Option A
  4. Quick Check:

    Use Adafruit_SSD1306 for SSD1306 OLED [OK]
Hint: Use Adafruit_SSD1306 library for SSD1306 OLED screens [OK]
Common Mistakes:
  • Choosing matplotlib which is for plotting graphs
  • Selecting pygame meant for game development
  • Picking numpy which is for numerical calculations
3. What will be the output on the OLED if the following Python code runs successfully?
import Adafruit_SSD1306
from PIL import Image, ImageDraw, ImageFont

# Initialize display
disp = Adafruit_SSD1306.SSD1306_128_64(rst=None)
disp.begin()
disp.clear()
disp.display()

# Create blank image for drawing
width = disp.width
height = disp.height
image = Image.new('1', (width, height))
draw = ImageDraw.Draw(image)

# Draw text
font = ImageFont.load_default()
draw.text((0, 0), 'Temp: 25C', font=font, fill=255)

# Display image
disp.image(image)
disp.display()
medium
A. The OLED will show a white screen with no text
B. The OLED will remain blank
C. The code will cause a syntax error
D. The OLED will show the text 'Temp: 25C' at the top-left corner

Solution

  1. Step 1: Analyze text drawing commands

    The code draws 'Temp: 25C' at position (0,0) using a default font on a blank image.
  2. Step 2: Understand display update

    Calling disp.image(image) and disp.display() sends the image to the OLED, showing the text.
  3. Final Answer:

    The OLED will show the text 'Temp: 25C' at the top-left corner -> Option D
  4. Quick Check:

    Text drawn and displayed = A [OK]
Hint: Text drawn at (0,0) appears top-left on OLED [OK]
Common Mistakes:
  • Assuming display stays blank without disp.display()
  • Confusing image creation with display output
  • Thinking code has syntax errors
4. Identify the error in this code snippet meant to update an OLED with sensor data:
disp = Adafruit_SSD1306.SSD1306_128_64(rst=None)
disp.begin()
disp.clear()

image = Image.new('1', (disp.width, disp.height))
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()

sensor_value = 30

draw.text((0, 0), f'Temp: {sensor_value}C', font=font, fill=255)

# Missing disp.image(image) here

disp.display()
medium
A. Missing disp.image(image) before disp.display()
B. Incorrect font loading method
C. Image size does not match display size
D. disp.clear() should be called after disp.display()

Solution

  1. Step 1: Check display update sequence

    To update OLED, image must be sent with disp.image(image) before disp.display().
  2. Step 2: Identify missing command

    The code misses disp.image(image), so display shows old or blank content.
  3. Final Answer:

    Missing disp.image(image) before disp.display() -> Option A
  4. Quick Check:

    disp.image(image) needed before disp.display() [OK]
Hint: Always call disp.image(image) before disp.display() [OK]
Common Mistakes:
  • Forgetting to send image to display
  • Calling disp.clear() too late
  • Using wrong font loading method
5. You want to continuously display live temperature readings from a sensor on an OLED screen using Python. Which approach correctly updates the display every second without flickering?
import time
while True:
    temp = read_sensor()
    image = Image.new('1', (disp.width, disp.height))
    draw = ImageDraw.Draw(image)
    draw.text((0, 0), f'Temp: {temp}C', font=font, fill=255)
    disp.image(image)
    disp.display()
    time.sleep(1)

What is the best improvement to reduce flicker?
hard
A. Clear the display before drawing each new image
B. Create the image and draw objects once outside the loop and reuse them
C. Remove time.sleep(1) to update faster
D. Use disp.clear() after disp.display() inside the loop

Solution

  1. Step 1: Understand flicker cause

    Creating new image and draw objects each loop causes flicker due to redraw overhead.
  2. Step 2: Optimize by reusing objects

    Creating image and draw once outside loop and clearing draw area inside loop reduces flicker.
  3. Final Answer:

    Create the image and draw objects once outside the loop and reuse them -> Option B
  4. Quick Check:

    Reuse image/draw objects to reduce flicker [OK]
Hint: Create image/draw once outside loop to avoid flicker [OK]
Common Mistakes:
  • Recreating image each loop causing flicker
  • Removing sleep causing too fast updates
  • Calling disp.clear() after display has no effect
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard