Fibre Optic Christmas Tree upgrade


Hi all

I had a cheap table top fibre optic christmas tree with R G B LEDs in the base, which stopped working during Christmas. I had been wondering what to do with my Unicorn Hat 8X8 RGB display, so it was great for it to come to the rescue. I modified one of the Pimoroni sample Python scripts to only light the central ones to keep the light under the fibre optics, and produce better colour patterns. A wifi dongle lets me play with the tree remotely using SSH. Most of the sample scripts produce nice lights on the tree. Next phase will be to substitute a PiZero for the B+ so I can leave it as a permanent project. There is one minor problem which someone might be able to help with - I am running the code in the background with a “&” at the end of the call. I find that after a few hours of operation, the wifi dongle stops working, so I can’t SSH into it again, until I remove the dongle and plug it in again - then all is OK without upsetting the tree lights.
BTW - it looks like the link to Dropbox is not allowing the video to be shown - anybody know how to make it work? So I have just uploaded a static picture for now.


Here is a video link to the tree working, and the code is below (based on

#!/usr/bin/env python
import unicornhat as unicorn
import time, colorsys
import numpy as np
import random as rnd
def make_gaussian(fwhm):
x = np.arange(0, 8, 1, float)
y = x[:, np.newaxis]
x0, y0 = 3.5, 3.5
fwhm = fwhm
gauss = np.exp(-4 * np.log(2) * ((x - x0) ** 2 + (y - y0) ** 2) / fwhm ** 2)
return gauss

while True:
h3 = rnd.random()
h1 = rnd.random()
h2 = rnd.random()
h4 = rnd.random()
h5 = rnd.random()
for z in range(600, 1400):

print z

	try: fwhm = 5.0/((z-1000)/100.0)
	except: fwhm = 500
	gauss = make_gaussian(fwhm)
	for y in range(2,6):
		for x in range(2,6):
			#h = 1.0/(x + y + 1.0)
			h = h3
			if x == 4 and y == 3: h = h1
			if x == 3 and y == 3: h = h2
			if x == 4 and y == 4: h = h4
			if x == 3 and y == 4: h = h5
			s = 0.8
			v = gauss[x,y]
			rgb = colorsys.hsv_to_rgb(h, s, v)
			r = int(rgb[0]*255.0)
			g = int(rgb[1]*255.0)
			b = int(rgb[2]*255.0)
			unicorn.set_pixel(x, y, r, g, b)