So, having a display is all well and good, but now you need something to display.
The Pimoroni BME680 breakout board has a Bosch BME680 temperature, pressure, humidity and air quality sensor.
The following code assumes you have the BME680 and the SH1106 OLED display on the default I2C addresses.
import os
import time
import datetime
import sys
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw
import bme680
from luma.core.interface.serial import i2c
from luma.oled.device import sh1106
from luma.core.render import canvas
TEMPERATURE_UPDATE_INTERVAL = 0.1 # in seconds
# Temperature offset
TEMP_OFFSET = 0.0
print("Temperature/pressure monitor - OLED")
print("Initialising")
# Instantiate object for SH1106 OLED display
oled = sh1106(i2c(port=1, address=0x3C), rotate=2, height=128, width=128)
# Instantiate object to read BME680 sensor
sensor = bme680.BME680()
# Set up the sensors
sensor.set_humidity_oversample(bme680.OS_2X)
sensor.set_pressure_oversample(bme680.OS_4X)
sensor.set_temperature_oversample(bme680.OS_8X)
sensor.set_filter(bme680.FILTER_SIZE_3)
sensor.set_temp_offset(TEMP_OFFSET)
# Build the fonts
rr_path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'fonts',
'Roboto-Regular.ttf'))
rb_path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'fonts',
'Roboto-Black.ttf'))
rr_24 = ImageFont.truetype(rr_path, 24)
rb_20 = ImageFont.truetype(rb_path, 20)
rr_15 = ImageFont.truetype(rr_path, 15)
rr_40 = ImageFont.truetype(rr_path, 40)
# Get sensor data first so that device settings take effect
sensor.get_sensor_data()
# Get the initial date/time and max/min temperature
low_temp = sensor.data.temperature
high_temp = sensor.data.temperature
curr_date = datetime.date.today().day
last_checked = time.time()
# Main loop
while True:
if sensor.get_sensor_data():
temp = sensor.data.temperature
press = sensor.data.pressure
humidity =sensor.data.humidity
if datetime.datetime.today().day == curr_date:
if temp < low_temp:
low_temp = temp
elif temp > high_temp:
high_temp = temp
else:
curr_date = datetime.datetime.today().day
low_temp = temp
high_temp = temp
# Write data to canvas
with canvas(oled) as draw:
draw.text((65, 55), u"{0:4.0f}".format(press), fill="white", font=rb_20)
draw.text((1, 55), u"{0:2.1f}%".format(humidity), fill="white", font=rb_20)
draw.text((1, 1), u"{0:2.0f}°".format(temp), fill="white", font=rr_40)
draw.text((65, 4), u"max: {0:2.0f}°".format(high_temp), fill="white", font=rr_15)
draw.text((65, 30), u"min: {0:2.0f}°".format(low_temp), fill="white", font=rr_15)
if int(time.time()) % 2 == 0:
draw.text((14, 78), datetime.datetime.now().strftime("%H:%M"),
fill="white", font=rr_40)
else:
draw.text((14, 78), datetime.datetime.now().strftime("%H %M"),
fill="white", font=rr_40)
time.sleep(TEMPERATURE_UPDATE_INTERVAL)
And this is the result.
There is a potential issue with the temperature. The temperature sensor is directly above the Raspberry Pi Zero, and more importantly close to being above the processor. This does mean that the heat from the processor may well be affecting the temperature being sensed and hence displayed.
Dealing with that is for the next instalment.