mirror of
https://github.com/danbee/unicorn
synced 2025-03-04 08:49:07 +00:00
107 lines
2.1 KiB
Python
107 lines
2.1 KiB
Python
from random import randint
|
|
import unicornhathd as unicorn
|
|
from time import sleep
|
|
|
|
width = 16
|
|
height = 16
|
|
rows = []
|
|
row_pointer = 0
|
|
|
|
colours = []
|
|
|
|
unicorn.brightness(1)
|
|
unicorn.rotation(0)
|
|
|
|
|
|
def init():
|
|
|
|
global rows
|
|
|
|
# create a buffer of <height> blank rows
|
|
for i in range(height):
|
|
rows.append(get_blank_row())
|
|
|
|
# add an initial source row
|
|
rows.append(get_source_row())
|
|
|
|
# generate an array of colours
|
|
for i in range(64):
|
|
r = i * 4
|
|
g = 0
|
|
b = 0
|
|
if i > 24:
|
|
g = (i - 24) * 6
|
|
if i > 48:
|
|
g = (i - 48) * 8
|
|
if i < 16:
|
|
b = 4 - (i / 4)
|
|
colours.append([r, g, b])
|
|
|
|
|
|
def get_blank_row():
|
|
|
|
# generate a blank row
|
|
return [0] * (width + 2)
|
|
|
|
|
|
def get_source_row():
|
|
|
|
# generate a source row with random white
|
|
new_row = []
|
|
for i in range(width + 2):
|
|
new_row.append(randint(0, 63))
|
|
return new_row
|
|
|
|
|
|
def update_rows():
|
|
|
|
# create fire
|
|
for h in range(height):
|
|
for w in range(width):
|
|
rows[h][w + 1] = (rows[h + 1][w] + rows[h + 1][w + 1] + rows[h + 1][w + 2]) / 3.3
|
|
|
|
|
|
def update_display():
|
|
|
|
# keep track of the row we are updating
|
|
for h in range(height):
|
|
for w in range(width):
|
|
# val is between 50 and 255
|
|
val = rows[h][w + 1]
|
|
|
|
# fetch the colour
|
|
colour = colours[int(round(val))]
|
|
|
|
# invert coordinates
|
|
unicorn.set_pixel((width - 1) - w, (height - 1) - h, colour[0], colour[1], colour[2])
|
|
|
|
unicorn.show()
|
|
|
|
|
|
def step():
|
|
global row_pointer
|
|
|
|
# add new row at current row pointer
|
|
# leave other rows the same, display will start from this one which overwrites the
|
|
# oldest existing row from the last time we updated the display
|
|
update_rows()
|
|
update_display()
|
|
|
|
if row_pointer % 2 == 0:
|
|
rows[height] = get_source_row()
|
|
|
|
# determine next row pointer, wrapping around if we went past zero
|
|
row_pointer -= 1
|
|
if row_pointer < 0:
|
|
row_pointer = height - 1
|
|
|
|
|
|
init()
|
|
try:
|
|
while True:
|
|
step()
|
|
sleep(0.025)
|
|
|
|
except KeyboardInterrupt:
|
|
unicorn.off()
|