I have the Breakout Garden Mini, SPI and i2c. In that I have the 0.96 Color LCD a BME280 and RV3208 RTC. Same display used on the Enviro +, which also uses a BME280. So I thought why not modify the Enviro examples to run on my setup, so I did.
I took the all in one mini example and modified it to run on my Breakout garden setup. I took out the light sensor stuff and the CPU temp compensation code. For the moment the mode is set manually via the mode = line in the py file. mode = 0 gets you the temperature display. It shows the current temp at the top and graphs the readings over time. If I did my math correctly, taking a reading every 22.5 seconds will show 1 hours worth of readings across the width of the screen.
60 minutes times 60 seconds divided by the screen width of 160 pixels.
Anyway here is what I came up with.
#!/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(22.5)
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(22.5)
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(22.5)