Improving the oled instructions and configuration file

This commit is contained in:
2026-08-28 10:01:43 +00:00
parent cc0b37af8b
commit 2ca5bc2dd2
4 changed files with 150 additions and 0 deletions
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2024 Marcel
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+38
View File
@@ -0,0 +1,38 @@
# cpsy-display-ip
Demonstrates the SSD1306 OLED by showing the IP address on the system boot.
Originally at https://github.com/mkyas/cpsy-display-ip and customized for Mechatronics 1 students.
This project contains the file `display-ip.py` that displays an IP
address on the SSD1306 OLED screen and the file `display-ip.service`
that executes the script on boot after the Raspberry Pi is connected
to a network.
To use the script, you first must connect the screen to the Pi's
I2C bus.
## Setup
Do the following steps on your Raspberry Pi.
1. Enable I2C in `raspi-config`
1. Go to your home directory: `cd ~`
1. Clone this repository to your raspberry pi `git clone https://gitea.cs.ru.is/RU-V207/rover-pi`
1. Install [pillow](https://python-pillow.org/), numpy, and venv:
> sudo apt install python3-venv python3-pil python3-numpy
1. Create a virtual environment, here called cpsy:
> python3 -m venv cpsy
1. Edit the generated `pyvenv.cfg` to set `include-system-site-packages = true`
1. Activate the environment `source cpsy/bin/activate`
1. Install the display driver: `pip install adafruit-circuitpython-ssd1306`
1. Edit `display-ip.service`:
- Replace `foley` with your user name on the Pi.
- the `WorkingDirectory` points to the directory containing `display-ip.py`
- the path to python points to your virtual environment
1. Copy the edited `display-ip.service` to `/etc/systemd/system`
```sudo cp display-ip.service /etc/systemd/system/.```
1. Enable the service `sudo systemctl enable display-ip.service`
1. Test by starting the service `sudo systemctl start display-ip.service` which should turn on the screen.
1. If nothing happens, check on the status with `sudo systemctl status display-ip` and look for error messages.
1. If you make additional changes to the service file, you may have to reload the `systemd`:
```sudo systemctl daemon-reload ```
+78
View File
@@ -0,0 +1,78 @@
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT
"""
This demo will fill the screen with white, draw a black box on top
and then print the device's IP address in the center of the display
This example is for use on (Linux) computers that are using CPython with
Adafruit Blinka to support CircuitPython libraries. CircuitPython does
not support PIL/pillow (python imaging library)!
"""
import board
import digitalio
from PIL import Image, ImageDraw, ImageFont
import adafruit_ssd1306
import socket
# Define the Reset Pin
oled_reset = None
try:
oled_reset = digitalio.DigitalInOut(board.D4)
except:
pass
# No reset pin
# Change these
# to the right size for your display!
WIDTH = 128
HEIGHT = 64
BORDER = 5
# Use for I2C.
i2c = board.I2C() # uses board.SCL and board.SDA
oled = adafruit_ssd1306.SSD1306_I2C(WIDTH, HEIGHT, i2c, addr=0x3C, reset=oled_reset)
# Clear display.
oled.fill(0)
oled.show()
# Create blank image for drawing.
# Make sure to create image with mode '1' for 1-bit color.
image = Image.new("1", (oled.width, oled.height))
# Get drawing object to draw on image.
draw = ImageDraw.Draw(image)
# Draw a white background
draw.rectangle((0, 0, oled.width, oled.height), outline=255, fill=255)
# Draw a smaller inner rectangle
draw.rectangle(
(BORDER, BORDER, oled.width - BORDER - 1, oled.height - BORDER - 1),
outline=0,
fill=0,
)
# Load default font.
font = ImageFont.load_default()
# Get the local IP address as a string.
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.connect(("8.8.8.8", 80))
text = s.getsockname()[0]
# Draw it into a box.
bbox = font.getbbox(text)
(font_width, font_height) = bbox[2] - bbox[0], bbox[3] - bbox[1]
draw.text(
(oled.width // 2 - font_width // 2, oled.height // 2 - font_height // 2),
text,
font=font,
fill=255,
)
# Display image
oled.image(image)
oled.show()
+13
View File
@@ -0,0 +1,13 @@
[Unit]
Description=display-ip
After=network-online.target
[Service]
Type=simple
User=foley
WorkingDirectory=/home/foley/rover-pi/oled-display
ExecStart=/home/foley/cpsy/bin/python3 display-ip.py
Restart=never
[Install]
WantedBy=multi-user.target