Skip to content
Snippets Groups Projects
cpu_rainbow.py 1.65 KiB
#!/usr/bin/env python

import colorsys
import time
from gpiozero import CPUTemperature
from PIL import Image, ImageDraw, ImageFont
import unicornhathd

print("""Unicorn HAT HD: CPU Temperature

Displays the CPU Temperature on your Unicorn HAT HD, in fancy rainbow colours!
Should the temperature exceed 55Degrees Celsius, the text will be coloured red to get your attention!

Exit with CTRL + C!
""")

FONT = ('/usr/share/fonts/truetype/piboto/PibotoCondensed-Regular.ttf', 12)

unicornhathd.rotation(270)
unicornhathd.brightness(0.3)

width, height = unicornhathd.get_shape()
text_x = 0
text_y = 0
font_file, font_size = FONT
font = ImageFont.truetype(font_file, font_size)
degree_sign= u'\N{DEGREE SIGN}'
warning = 55 #Temperature at which alarms go off

try:
	while True:
		cpu = CPUTemperature()
		TEXT = (str(int(cpu.temperature))+degree_sign)
		text_width, text_height = font.getsize(TEXT)
		text_width += width + text_x
		image = Image.new('RGB', (text_width, max(height, text_height)), (0, 0, 0))
		draw = ImageDraw.Draw(image)
		draw.text((text_x, text_y), TEXT, fill=(255, 255, 255), font=font)
		for scroll in range(text_width - width+ 90):
			for x in range(width):
				if int(cpu.temperature) <= warning:
					hue = (x + scroll) / float(text_width)
				else:
					hue = 0.0 #red
				br, bg, bb = [int(n * 255) for n in colorsys.hsv_to_rgb(hue, 1.0, 1.0)]
				for y in range(height):
					pixel = image.getpixel((x, y))
					r, g, b = [float(n / 255.0) for n in pixel]
					r = int(br * r)
					g = int(bg * g)
					b = int(bb * b)
					unicornhathd.set_pixel(width -1 -x, y, r, g, b)
			unicornhathd.show()
			time.sleep(0.02)

except KeyboardInterrupt:
	unicornhathd.off()