123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # Copyright (c) 2017-18 Richard Hull and contributors
- # See LICENSE.rst for details.
- #
- # Based on https://github.com/pimoroni/blinkt/blob/master/examples/larson_hue.py
- import math
- import time
- import colorsys
- from luma.led_matrix.device import apa102
- from luma.core.render import canvas
- device = apa102(width=8, height=1)
- FALLOFF = 1.9
- SCAN_SPEED = 4
- def main():
- start_time = time.time()
- while True:
- delta = (time.time() - start_time)
- # Offset is a sine wave derived from the time delta
- # we use this to animate both the hue and larson scan
- # so they are kept in sync with each other
- offset = (math.sin(delta * SCAN_SPEED) + 1) / 2
- # Use offset to pick the right colour from the hue wheel
- hue = int(round(offset * 360))
- # Now we generate a value from 0 to 7
- offset = int(round(offset * 7))
- with canvas(device) as draw:
- for x in range(8):
- sat = 1.0
- val = 7 - (abs(offset - x) * FALLOFF)
- val /= 7.0 # Convert to 0.0 to 1.0
- val = max(val, 0.0) # Ditch negative values
- xhue = hue # Grab hue for this pixel
- xhue += (1 - val) * 10 # Use the val offset to give a slight colour trail variation
- xhue %= 360 # Clamp to 0-359
- xhue /= 360.0 # Convert to 0.0 to 1.0
- r, g, b = [int(c * 255) for c in colorsys.hsv_to_rgb(xhue, sat, val)]
- draw.point((x, 0), fill=(r, g, b, int(val * 256)))
- time.sleep(0.001)
- if __name__ == "__main__":
- try:
- main()
- except KeyboardInterrupt:
- pass
|