I have a Pi Zero 2W with a 1.54" SPI Colour Square LCD (240x240) Breakout
1.54" SPI Colour Square LCD (240x240) Breakout
and a Multi-Sensor Stick (BME280 + LTR559 + LSM6DS3)
Multi-Sensor Stick (BME280 + LTR559 + LSM6DS3)
With the smaller 0.96" SPI Colour LCD (160x80) Breakout I can run the
all-in-one-enviro-mini.py file from the virtual enviroment with out issue.
enviroplus-python/examples/all-in-one-enviro-mini.py at main · pimoroni/enviroplus-python · GitHub
Having trouble getting it to work with the larger LCD though?
kyrie@enviro:~ $ source ~/.virtualenvs/pimoroni/bin/activate
(pimoroni) kyrie@enviro:~ $ python enviro-st7789-mini.py
2025-10-25 09:09:53.586 INFO all-in-one.py - Displays readings from all of Enviro plus" sensors
Press Ctrl+C to exit!
2025-10-25 09:09:54.050 INFO temp: 13.1 °C
Traceback (most recent call last):
File “/home/kyrie/enviro-st7789-mini.py”, line 165, in
display_text(variables[mode], data, unit)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/kyrie/enviro-st7789-mini.py”, line 112, in display_text
ST7789.display(img)
~~~~~~~~~~~~~~^^^^^
TypeError: ST7789.display() missing 1 required positional argument: ‘image’
(pimoroni) kyrie@enviro:~ $
#!/usr/bin/env python3
import colorsys
import os
import sys
import time
#import st7735
from st7789 import ST7789
# General
SPI_PORT = 0
SPI_CS = 1
SPI_DC = 9
#BACKLIGHT = 13
# Screen dimensions
WIDTH = 240
HEIGHT = 240
try:
# Transitional fix for breaking change in LTR559
from ltr559 import LTR559
ltr559 = LTR559()
except ImportError:
import ltr559
import logging
from subprocess import PIPE, Popen
from bme280 import BME280
from fonts.ttf import RobotoMedium as UserFont
from PIL import Image, ImageDraw, ImageFont
logging.basicConfig(
format="%(asctime)s.%(msecs)03d %(levelname)-8s %(message)s",
level=logging.INFO,
datefmt="%Y-%m-%d %H:%M:%S")
logging.info("""all-in-one.py - Displays readings from all of Enviro plus" sensors
Press Ctrl+C to exit!
""")
# BME280 temperature/pressure/humidity sensor
bme280 = BME280()
'''
# Create ST7735 LCD display class
st7735 = st7735.ST7735(
port=0,
cs=1,
dc="GPIO9",
backlight="GPIO12",
rotation=270,
spi_speed_hz=10000000
)
# Initialize display
st7735.begin()
WIDTH = st7735.width
HEIGHT = st7735.height
'''
display = ST7789(
port=SPI_PORT,
cs=SPI_CS,
dc=SPI_DC,
#backlight=BACKLIGHT,
#width=WIDTH,
#height=HEIGHT,
rotation=180,
spi_speed_hz=60 * 1000 * 1000,
)
# Set up canvas and font
img = Image.new("RGB", (WIDTH, HEIGHT), color=(0, 0, 0))
draw = ImageDraw.Draw(img)
path = os.path.dirname(os.path.realpath(__file__))
font_size = 20
font = ImageFont.truetype(UserFont, font_size)
message = ""
# The position of the top bar
top_pos = 25
# Displays data and text on the 0.96" LCD
def display_text(variable, data, unit):
# Maintain length of list
values[variable] = values[variable][1:] + [data]
# Scale the values for the variable between 0 and 1
vmin = min(values[variable])
vmax = max(values[variable])
colours = [(v - vmin + 1) / (vmax - vmin + 1) for v in values[variable]]
# Format the variable name and value
message = f"{variable[:4]}: {data:.1f} {unit}"
logging.info(message)
draw.rectangle((0, 0, WIDTH, HEIGHT), (255, 255, 255))
for i in range(len(colours)):
# Convert the values to colours from red to blue
colour = (1.0 - colours[i]) * 0.6
r, g, b = [int(x * 255.0) for x in colorsys.hsv_to_rgb(colour, 1.0, 1.0)]
# Draw a 1-pixel wide rectangle of colour
draw.rectangle((i, top_pos, i + 1, HEIGHT), (r, g, b))
# Draw a line graph in black
line_y = HEIGHT - (top_pos + (colours[i] * (HEIGHT - top_pos))) + top_pos
draw.rectangle((i, line_y, i + 1, line_y + 1), (0, 0, 0))
# Write the text at the top in black
draw.text((0, 0), message, font=font, fill=(0, 0, 0))
ST7789.display(img)
# Get the temperature of the CPU for compensation
def get_cpu_temperature():
process = Popen(["vcgencmd", "measure_temp"], stdout=PIPE, universal_newlines=True)
output, _error = process.communicate()
return float(output[output.index("=") + 1:output.rindex("'")])
# Tuning factor for compensation. Decrease this number to adjust the
# temperature down, and increase to adjust up
factor = 2.25
cpu_temps = [get_cpu_temperature()] * 5
delay = 0.5 # Debounce the proximity tap
mode = 0 # The starting mode
last_page = 0
light = 1
# Create a values dict to store the data
variables = ["temperature",
"pressure",
"humidity",
"light"]
values = {}
for v in variables:
values[v] = [1] * WIDTH
# The main loop
try:
while True:
proximity = ltr559.get_proximity()
# If the proximity crosses the threshold, toggle the mode
if proximity > 1500 and time.time() - last_page > delay:
mode += 1
mode %= len(variables)
last_page = time.time()
# One mode for each variable
if mode == 0:
# variable = "temperature"
unit = "°C"
cpu_temp = get_cpu_temperature()
# Smooth out with some averaging to decrease jitter
cpu_temps = cpu_temps[1:] + [cpu_temp]
avg_cpu_temp = sum(cpu_temps) / float(len(cpu_temps))
raw_temp = bme280.get_temperature()
data = raw_temp - ((avg_cpu_temp - raw_temp) / factor)
display_text(variables[mode], data, unit)
if mode == 1:
# variable = "pressure"
unit = "hPa"
data = bme280.get_pressure()
display_text(variables[mode], data, unit)
if mode == 2:
# variable = "humidity"
unit = "%"
data = bme280.get_humidity()
display_text(variables[mode], data, unit)
if mode == 3:
# variable = "light"
unit = "Lux"
if proximity < 10:
data = ltr559.get_lux()
else:
data = 1
display_text(variables[mode], data, unit)
# Exit cleanly
except KeyboardInterrupt:
sys.exit(0)