Using the Enviro Hat display

Hi,

 I just recently bought the Enviro Hat and have been trying to get the 0.96" display to work. When I tested the display through the all-in-one example code, I got the error: AttributeError: 'SpiDev' object has no attribute 'xfer3'. Does this mean my version of SpiDev is outdated? Is there an error in the example code? Or does is the hat not compatible with raspberry pi 3B+? Any help would be great.

Thank you,
David

Give this a go from terminal.
sudo apt-get update
sudo apt-get install python-rpi.gpio python-spidev python-pip python-imaging python-numpy
sudo apt-get install python3-rpi.gpio python3-spidev python3-pip python3-imaging python3-numpy

Thanks for the help. For python3, python3-imaging doesn’t work. Will python3-pillow work?

I have the stand alone version of that display.


and the bigger one

I ran what I posted above for both, Raspbian with desktop. I don’t remember seeing any errors when I ran them. Most came back as already installed.

With 0.96 display I’ve only got as far as running the scrolling-text.py example from here
I ran it from ilde3 / python 3 and it uses Pil.

EDIT: I have mine in a Breakout Garden Mini with a BME280. I have plans to try and run some of the Enviro + python examples on it in the next couple of days. I’ll have to modify them somewhat as I don’t have the other sensors and the display uses a slightly different pinout on the Breakout Garden versus the Enviro.

Are you running Pi OS Lite or the With desktop?
Also are just running the version of Python that is installed by default?

I tried running the all in one mini but got some errors. mode = stuff from my modifications.
I am going to try some new code tomorrow some time. I will post back how that goes.
I’m not seeing your error though.

Do you have the Enviro or Enviro +? I ask because I think they use different displays?
I got this running on my setup, it just cycles through the readings at 5 second intervals.

#!/usr/bin/env python3

import time
import colorsys
import os
import sys
import ST7735

from bme280 import BME280

from subprocess import PIPE, Popen
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
from fonts.ttf import RobotoMedium as UserFont
import logging

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=ST7735.BG_SPI_CS_FRONT,  # BG_SPI_CSB_BACK or BG_SPI_CS_FRONT
    dc=9,
    backlight=19, # 18 for back BG slot, 19 for front BG slot
    rotation=90,
    spi_speed_hz=10000000
)

# Initialize display
st7735.begin()

WIDTH = st7735.width
HEIGHT = st7735.height

# 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 = "{}: {:.1f} {}".format(variable[:4], data, 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))
    st7735.display(img)

last_page = 0
light = 1

# Create a values dict to store the data
variables = ["temperature",
             "humidity",
             "pressure"]

values = {}

for v in variables:
    values[v] = [1] * WIDTH

# The main loop

mode = 0

while True:
 
    if mode == 0:
        mode %= len(variables)
        last_page = time.time()
        # variable = "temperature"
        unit = "C"
        data = bme280.get_temperature()
        display_text(variables[mode], data, unit)
        time.sleep(5)
        mode += 1

    if mode == 1:
        mode %= len(variables)
        last_page = time.time()
        # variable = "humidity"
        unit = "%"
        data = bme280.get_humidity()
        display_text(variables[mode], data, unit)
        time.sleep(5)
        mode += 1

    if mode == 2:
        mode %= len(variables)
        last_page = time.time()
        # variable = "pressure"
        unit = "hPa"
        data = bme280.get_pressure()
        display_text(variables[mode], data, unit)
        time.sleep(5)
        mode = 0