The following code demonstrates the use of the Pimoroni Explorer Kit as a desktop auto clock/calendar/weather station. I hope someone finds it useful.
Triangles used to be difficult but the latest version of picographics makes them easy to use. I really like the larger screen. It shows off the 320x240 pixels much better. The multi-sensor-stick is really easy to use.
# Pimoroni Explorer Demo
# Analog/ Digital clock - Tony Goodhew, Leicester UK - 6 Nov 2024
# Uses the Multi-Sensor Stick (BME280 + LTR559 + LSM6DS3)
from explorer import display, i2c, button_z, button_x, button_y, BLACK, WHITE, GREEN, RED, BLUE, YELLOW, CYAN
from breakout_bme280 import BreakoutBME280
from breakout_ltr559 import BreakoutLTR559
import math
import time
# Check sensor stick connected
try:
bme = BreakoutBME280(i2c, address=0x76)
ltr = BreakoutLTR559(i2c)
except RuntimeError:
display.set_layer(0)
display.set_pen(RED)
display.clear()
display.set_pen(WHITE)
display.text("Multi-Sensor Stick missing", 10, 95, 320, 3)
display.update()
WIDTH, HEIGHT = display.get_bounds()
# Get current time
year, month, day, h, m, s, wd, _ = time.localtime()
days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
# Used for minute and hour hands
def hand(ang, long):
ang = ang-90
ls = long/10
x0 = int(round(long * math.cos(math.radians(ang))))+cx
y0 = int(round(long * math.sin(math.radians(ang))))+cy
x1 = int(round(ls * math.cos(math.radians(ang+90))))+cx
y1 = int(round(ls * math.sin(math.radians(ang+90))))+cy
x2 = int(round(ls * math.cos(math.radians(ang-90))))+cx
y2 = int(round(ls * math.sin(math.radians(ang-90))))+cy
display.triangle(x0,y0,x1,y1,x2,y2)
display.circle(cx,cy,int(ls))
display.set_backlight(1.0)
display.set_layer(0)
display.set_pen(BLACK)
display.clear()
display.set_layer(1)
display.set_pen(BLACK)
display.clear()
cx = 199 # centre of clock
cy = 119
l = 110
# Draw clock face
display.set_pen(BLUE)
display.circle(cx,cy,110)
display.update()
ls = 94
display.set_pen(WHITE)
for angle in range(0,360,6):
xx = int(round(l * math.cos(math.radians(angle))))
yy = int(round(l * math.sin(math.radians(angle))))
display.line(cx,cy,cx+xx,cy+yy)
display.set_pen(BLACK)
display.circle(cx,cy,100)
display.set_pen(WHITE)
for angle in range(0,360,30):
xx = int(round(l * math.cos(math.radians(angle))))
yy = int(round(l * math.sin(math.radians(angle))))
display.line(cx,cy,cx+xx,cy+yy)
# Sensor titles
display.set_pen(WHITE)
display.text("Temperature",5,40,310,1)
display.text("Lux",5,80,300,1)
display.text("Rel Humidity",5,120,300,1)
display.text("Air Pressure",5,200,300,1)
# === Main Loop ======
while True:
# Draw face numbers
display.set_pen(BLACK)
display.circle(cx,cy,93) # Clear centre of clock face
display.set_pen(YELLOW)
display.text("9",118,108,320,3)
display.text("3",268,108,320,3)
display.text("10",128,70,320,3)
display.text("2",258,70,320,3)
display.text("1",230,45,320,3)
display.text("11",160,45,320,3)
display.text("12",190,37,320,3)
display.text("6",193,186,320,3)
display.text("7",156,176,320,3)
display.text("5",230,176,320,3)
display.text("4",258,150,320,3)
display.text("8",130,150,320,3)
# Draw hands
mang = int((m + s/60)* 6) # angle of minute hand
hang = int((h + m/60 )* 30 ) # angle of hour hand
display.set_pen(BLUE)
hand(mang,90)
display.set_pen(RED)
hand(hang,70)
sang = 6 * s - 90
xs = int(round(ls * math.cos(math.radians(sang))))
ys = int(round(ls * math.sin(math.radians(sang))))
display.set_pen(WHITE)
display.line(cx,cy,cx+xs,cy+ys)
display.circle(cx,cy,3)
# Assemble Digital time
ss = "0" + str(s)
lgs =len(ss)
ss = ss[lgs-2:lgs]
ms = "0" + str(m)
lgs = len(ms)
ms = ms[lgs-2:lgs]
hs = "0" + str(h)
lgs = len(hs)
hs = hs[lgs-2:lgs]
dt = hs+":"+ms+":"+ss
# Clear sensor text areas
display.set_pen(BLACK)
display.rectangle(5,10,127,18)
display.rectangle(5,50,90,18)
display.rectangle(5,90,80,18)
display.rectangle(5,130,80,18)
display.rectangle(5,210,115,18)
display.rectangle(5,163,90,28)
# Write digital time & sensor readings
display.set_pen(YELLOW)
display.text(dt,5,10,320,3)
# read the sensors
temperature, pressure, humidity = bme.read()
temp = round(temperature,1)
display.set_pen(GREEN)
display.text(str(temp)+" C",5,50,320,3)
# Convert pressure to hPa
pressurehpa = int(pressure / 100)
display.text(str(int(humidity)) +" %", 5,130,320,3)
display.text(str(pressurehpa)+" hPa",5,210,320,3)
prox, a, b, c, d, e, lux = ltr.get_reading()
lux = int(lux)
display.set_pen(CYAN)
display.text(str(lux),5,90,320,3)
# Update date/time
year, month, day, h, m, s, wd, _ = time.localtime()
display.text(days[wd],5,163,320,1)
display.text(str(day)+" "+months[month-1],5,173,320,2)
display.update()
time.sleep(0.1)
Video here: https://youtu.be/p8yvwJqr3u4
If you would like a tutorial on using the tilt aspects of the IMU, please leave a comment.