Skip to content

Instantly share code, notes, and snippets.

@gregtap
Created February 11, 2019 19:52
Show Gist options
  • Save gregtap/969b8eebada45ab210fbac1e38555cde to your computer and use it in GitHub Desktop.
Save gregtap/969b8eebada45ab210fbac1e38555cde to your computer and use it in GitHub Desktop.
Doom fire /rpi-rgb-led-matrix test
from rgbmatrix import RGBMatrix, RGBMatrixOptions, graphics
import itertools as it
from time import sleep
import random
import colorsys
from PIL import Image
from PIL import ImageDraw
mode = 0
options = RGBMatrixOptions()
options.rows = 32
options.chain_length = 6
options.disable_hardware_pulsing = 0
options.gpio_slowdown = 1
options.brightness = 100
options.pwm_bits = 11
FIRE_WIDTH = 192
FIRE_HEIGHT = 32
COLORS = [
{"r": 7, "g": 7, "b": 7},
{"r": 31, "g": 7, "b": 7},
{"r": 47, "g": 15, "b": 7},
{"r": 71, "g": 15, "b": 7},
{"r": 87, "g": 23, "b": 7},
{"r": 103, "g": 31, "b": 7},
{"r": 119, "g": 31, "b": 7},
{"r": 143, "g": 39, "b": 7},
{"r": 159, "g": 47, "b": 7},
{"r": 175, "g": 63, "b": 7},
{"r": 191, "g": 71, "b": 7},
{"r": 199, "g": 71, "b": 7},
{"r": 223, "g": 79, "b": 7},
{"r": 223, "g": 87, "b": 7},
{"r": 223, "g": 87, "b": 7},
{"r": 215, "g": 95, "b": 7},
{"r": 215, "g": 95, "b": 7},
{"r": 215, "g": 103, "b": 15},
{"r": 207, "g": 111, "b": 15},
{"r": 207, "g": 119, "b": 15},
{"r": 207, "g": 127, "b": 15},
{"r": 207, "g": 135, "b": 23},
{"r": 199, "g": 135, "b": 23},
{"r": 199, "g": 143, "b": 23},
{"r": 199, "g": 151, "b": 31},
{"r": 191, "g": 159, "b": 31},
{"r": 191, "g": 159, "b": 31},
{"r": 191, "g": 167, "b": 39},
{"r": 191, "g": 167, "b": 39},
{"r": 191, "g": 175, "b": 47},
{"r": 183, "g": 175, "b": 47},
{"r": 183, "g": 183, "b": 47},
{"r": 183, "g": 183, "b": 55},
{"r": 207, "g": 207, "b": 111},
{"r": 223, "g": 223, "b": 159},
{"r": 239, "g": 239, "b": 199},
{"r": 255, "g": 255, "b": 255},
]
matrix = RGBMatrix(options=options)
print("Matrix initialized\n")
intensities = []
offscreen_canvas = matrix.CreateFrameCanvas()
image = Image.new("RGB", (192, 32))
# Fill up intensities
for i in range(0, FIRE_WIDTH * FIRE_HEIGHT):
intensities.append(0)
# Create fire source
for column in range(0, FIRE_WIDTH):
overflow_pixel_index = FIRE_WIDTH * FIRE_HEIGHT
index = (overflow_pixel_index - FIRE_WIDTH) + column
intensities[index] = 36 # max intensity
def update_pixel_intensity(pixel_index):
below_pixel_index = pixel_index + FIRE_WIDTH
# overflow ?
if below_pixel_index >= FIRE_WIDTH * FIRE_HEIGHT:
return
decay = random.randint(0, 2)
below_pixel_intensity = intensities[below_pixel_index]
new_intensity = (
below_pixel_intensity - decay if (below_pixel_intensity - decay) >= 0 else 0
)
intensities[pixel_index - decay] = new_intensity
def propagate():
for column in range(0, FIRE_WIDTH):
for row in range(0, FIRE_HEIGHT):
index = column + (FIRE_WIDTH * row)
update_pixel_intensity(index)
def burn():
propagate()
draw = ImageDraw.Draw(image)
for col in range(0, FIRE_WIDTH):
for row in range(0, FIRE_HEIGHT):
index = col + (FIRE_WIDTH * row)
color = COLORS[intensities[index]]
draw.point((col, row), (color["r"], color["g"], color["b"]))
matrix.Clear()
matrix.SetImage(image, 0, 0)
# diretly setting pixel is as slow
# matrix.SetPixel(i % FIRE_WIDTH, i / FIRE_WIDTH, color["r"], color["g"], color["b"])
while True:
burn()
# sleep(.01)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment