diff --git a/oled-display/LICENSE b/oled-display/LICENSE new file mode 100644 index 0000000..929ff3b --- /dev/null +++ b/oled-display/LICENSE @@ -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. diff --git a/oled-display/README.md b/oled-display/README.md new file mode 100644 index 0000000..eda4ed2 --- /dev/null +++ b/oled-display/README.md @@ -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 ``` + diff --git a/oled-display/display-ip.py b/oled-display/display-ip.py new file mode 100644 index 0000000..d4c6857 --- /dev/null +++ b/oled-display/display-ip.py @@ -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() diff --git a/oled-display/display-ip.service b/oled-display/display-ip.service new file mode 100644 index 0000000..621f6cf --- /dev/null +++ b/oled-display/display-ip.service @@ -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