Skip to content

Commit 65320ca

Browse files
authored
Merge pull request #1203 from firepixie/master
Ocean resin lightbox code
2 parents 5513343 + 0f615e2 commit 65320ca

File tree

7 files changed

+145
-0
lines changed

7 files changed

+145
-0
lines changed

Ocean_Resin_Lightbox/README.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Ocean_Resin_Lightbox
2+
3+
Code to accompany this tutorial:
4+
https://learn.adafruit.com/ocean-epoxy-resin-art-with-rgb-led-matrix-animations
5+
6+
Ocean Epoxy Resin LightBox with RGB LED Matrix Animations
7+
Adafruit invests time and resources providing this open source code.
8+
Please support Adafruit and open source hardware by purchasing
9+
products from Adafruit!
10+
Written by Jeff Epler, Erin St Blaine & Limor Fried for Adafruit Industries
11+
Copyright (c) 2020 Adafruit Industries
12+
Licensed under the MIT license.
13+
All text above must be included in any redistribution.

Ocean_Resin_Lightbox/code.py

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
"""
2+
RGB Matrix Ocean Scroller
3+
Adafruit invests time and resources providing this open source code.
4+
Please support Adafruit and open source hardware by purchasing
5+
products from Adafruit!
6+
Written by Jeff Epler & Limor Fried for Adafruit Industries
7+
Copyright (c) 2019-2020 Adafruit Industries
8+
Licensed under the MIT license.
9+
All text above must be included in any redistribution.
10+
"""
11+
12+
import math
13+
import time
14+
import random
15+
16+
import adafruit_imageload.bmp
17+
import board
18+
import displayio
19+
import framebufferio
20+
import rgbmatrix
21+
import ulab
22+
23+
displayio.release_displays()
24+
25+
class Reshader:
26+
'''reshader fades the image to mimic brightness control'''
27+
def __init__(self, palette):
28+
self.palette = palette
29+
ulab_palette = ulab.zeros((len(palette), 3))
30+
for i in range(len(palette)):
31+
rgb = int(palette[i])
32+
ulab_palette[i, 2] = rgb & 0xff
33+
ulab_palette[i, 1] = (rgb >> 8) & 0xff
34+
ulab_palette[i, 0] = rgb >> 16
35+
self.ulab_palette = ulab_palette
36+
37+
def reshade(self, brightness):
38+
'''reshader'''
39+
palette = self.palette
40+
shaded = ulab.array(self.ulab_palette * brightness, dtype=ulab.uint8)
41+
for i in range(len(palette)):
42+
palette[i] = tuple(shaded[i])
43+
44+
def do_crawl_down(image_file, *,
45+
speed=12, weave=4, pulse=.5,
46+
weave_speed=1/6, pulse_speed=1/7):
47+
# pylint:disable=too-many-locals
48+
'''function to scroll the image'''
49+
the_bitmap, the_palette = adafruit_imageload.load(
50+
image_file,
51+
bitmap=displayio.Bitmap,
52+
palette=displayio.Palette)
53+
54+
shader = Reshader(the_palette)
55+
56+
group = displayio.Group()
57+
tile_grid = displayio.TileGrid(bitmap=the_bitmap, pixel_shader=the_palette)
58+
group.append(tile_grid)
59+
display.show(group)
60+
61+
start_time = time.monotonic_ns()
62+
start_y = display.height # High enough to be "off the top"
63+
end_y = -the_bitmap.height # Low enough to be "off the bottom"
64+
65+
# Mix up how the bobs and brightness change on each run
66+
r1 = random.random() * math.pi
67+
r2 = random.random() * math.pi
68+
69+
y = start_y
70+
while y > end_y:
71+
now = time.monotonic_ns()
72+
y = start_y - speed * ((now - start_time) / 1e9)
73+
group.y = round(y)
74+
75+
# wave from side to side
76+
group.x = round(weave * math.cos(y * weave_speed + r1))
77+
78+
# Change the brightness
79+
if pulse > 0:
80+
shader.reshade((1 - pulse) + pulse * math.sin(y * pulse_speed + r2))
81+
82+
display.refresh(minimum_frames_per_second=0, target_frames_per_second=60)
83+
84+
def do_pulse(image_file, *, duration=4, pulse_speed=1/8, pulse=.5):
85+
'''pulse animation'''
86+
the_bitmap, the_palette = adafruit_imageload.load(
87+
image_file,
88+
bitmap=displayio.Bitmap,
89+
palette=displayio.Palette)
90+
91+
shader = Reshader(the_palette)
92+
93+
group = displayio.Group()
94+
tile_grid = displayio.TileGrid(bitmap=the_bitmap, pixel_shader=the_palette)
95+
group.append(tile_grid)
96+
group.x = (display.width - the_bitmap.width) // 2
97+
group.y = (display.height - the_bitmap.height) // 2
98+
display.show(group)
99+
100+
start_time = time.monotonic_ns()
101+
end_time = start_time + int(duration * 1e9)
102+
103+
now_ns = time.monotonic_ns()
104+
while now_ns < end_time:
105+
now_ns = time.monotonic_ns()
106+
current_time = (now_ns - start_time) / 1e9
107+
108+
shader.reshade((1 - pulse) - pulse
109+
* math.cos(2*math.pi*current_time*pulse_speed)**2)
110+
111+
display.refresh(minimum_frames_per_second=0, target_frames_per_second=60)
112+
113+
matrix = rgbmatrix.RGBMatrix(
114+
width=64, height=32, bit_depth=5,
115+
rgb_pins=[board.D6, board.D5, board.D9, board.D11, board.D10, board.D12],
116+
addr_pins=[board.A5, board.A4, board.A3, board.A2],
117+
clock_pin=board.D13, latch_pin=board.D0, output_enable_pin=board.D1)
118+
display = framebufferio.FramebufferDisplay(matrix, auto_refresh=False)
119+
120+
# Image playlist - set to run randomly. Set pulse from 0 to .5
121+
while True:
122+
show_next = random.randint(1, 5) #change to reflect how many images you add
123+
if show_next == 1:
124+
do_crawl_down("/ray.bmp")
125+
elif show_next == 2:
126+
do_crawl_down("/waves1.bmp", speed=7, weave=0, pulse=.35)
127+
elif show_next == 3:
128+
do_crawl_down("/waves2.bmp", speed=9, weave=0, pulse=.35)
129+
elif show_next == 4:
130+
do_pulse("/heart.bmp", duration=4, pulse=.45)
131+
elif show_next == 5:
132+
do_crawl_down("/dark.bmp")

Ocean_Resin_Lightbox/dark.bmp

2.25 KB
Binary file not shown.

Ocean_Resin_Lightbox/heart.bmp

2.25 KB
Binary file not shown.

Ocean_Resin_Lightbox/ray.bmp

3.99 KB
Binary file not shown.

Ocean_Resin_Lightbox/waves1.bmp

4.06 KB
Binary file not shown.

Ocean_Resin_Lightbox/waves2.bmp

4.06 KB
Binary file not shown.

0 commit comments

Comments
 (0)