Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Additional colour and static examples #7

Merged
merged 1 commit into from
Oct 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions examples/tiny_fx/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ These are micropython examples for the Pimoroni [TinyFX](https://shop.pimoroni.c
- [Sensor Meter](#sensor-meter)
- [Voltage Meter](#voltage-meter)
- [Mono Effect Examples](#mono-effect-examples)
- [Static Brightness](#static-brightness)
- [Single Blink](#single-blink)
- [Single Flashing](#single-flashing)
- [Single Flicker](#single-flicker)
Expand All @@ -18,6 +19,9 @@ These are micropython examples for the Pimoroni [TinyFX](https://shop.pimoroni.c
- [Binary Counter](#binary-counter)
- [Traffic Light](#traffic-light)
- [Colour Effect Examples](#colour-effect-examples)
- [Static RGB](#static-rgb)
- [Static HSV](#static-hsv)
- [Blink](#blink)
- [Rainbow](#rainbow)
- [Random](#random)
- [Hue Step](#hue-step)
Expand Down Expand Up @@ -55,6 +59,12 @@ Use TinyFX's mono outputs as a bargraph to show the voltage that is powering the

## Mono Effect Examples

### Static Brightness
[effects/mono/static_brightness.py](examples/effects/mono/static_brightness.py)

Show a static brightness on one of TinyFX's outputs.


### Single Blink
[effects/mono/single_blink.py](examples/effects/mono/single_blink.py)

Expand Down Expand Up @@ -117,6 +127,23 @@ Play a traffic light sequence on TinyFX's outputs.

## Colour Effect Examples

### Static RGB
[effects/colour/static_rgb.py](examples/effects/colour/static_rgb.py)

Show a static colour on TinyFX's RGB output.


### Static HSV
[effects/colour/static_hsv.py](examples/effects/colour/static_hsv.py)

Show a static colour on TinyFX's RGB output, using HSV.


### Blink
[effects/colour/blink.py](examples/effects/colour/blink.py)
Play a blinking sequence effect on TinyFX's RGB output. Each blink in the sequence can be a different colour.


### Rainbow
[effects/colour/rainbow.py](examples/effects/colour/rainbow.py)

Expand Down
35 changes: 35 additions & 0 deletions examples/tiny_fx/examples/effects/colour/blink.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from tiny_fx import TinyFX
from picofx import ColourPlayer
from picofx.colour import RGBBlinkFX, RED, YELLOW, GREEN, CYAN, BLUE, MAGENTA

"""
Play a blinking sequence effect on TinyFX's RGB output. Each blink in the sequence can be a different colour.

Press "Boot" to exit the program.
"""

# Constants
COLOURS = [RED, YELLOW, GREEN, CYAN, BLUE, MAGENTA]

# Variables
tiny = TinyFX() # Create a new TinyFX object to interact with the board
player = ColourPlayer(tiny.rgb) # Create a new effect player to control TinyFX's RGB output


# Create and set up a rainbow effect to play
player.effects = RGBBlinkFX(colour=COLOURS, # The colour (or colours to blink in sequence)
speed=0.5) # The speed to cycle through colours at, with 1.0 being 1 second


# Wrap the code in a try block, to catch any exceptions (including KeyboardInterrupt)
try:
player.start() # Start the effects running

# Loop until the effect stops or the "Boot" button is pressed
while player.is_running() and not tiny.boot_pressed():
pass

# Stop any running effects and turn off all the outputs
finally:
player.stop()
tiny.shutdown()
34 changes: 34 additions & 0 deletions examples/tiny_fx/examples/effects/colour/static_hsv.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from tiny_fx import TinyFX
from picofx import ColourPlayer
from picofx.colour import HSVFX

"""
Show a static colour on TinyFX's RGB output, using HSV.

Press "Boot" to exit the program.
"""

# Constants
HUE = 0.0 # The colour's hue (from 0.0 to 1.0)
SAT = 1.0 # The colour's saturation (from 0.0 to 1.0)
VAL = 1.0 # The colour's value/brightness (from 0.0 to 1.0)

# Variables
tiny = TinyFX() # Create a new TinyFX object
player = ColourPlayer(tiny.rgb) # Create a new effect player to control TinyFX's RGB output

# Set up the colour effect to play
player.effects = HSVFX(HUE, SAT, VAL)

# Wrap the code in a try block, to catch any exceptions (including KeyboardInterrupt)
try:
player.start() # Start the effects running

# Loop until the effect stops or the "Boot" button is pressed
while player.is_running() and not tiny.boot_pressed():
pass

# Stop any running effects and turn off all the outputs
finally:
player.stop()
tiny.shutdown()
34 changes: 34 additions & 0 deletions examples/tiny_fx/examples/effects/colour/static_rgb.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from tiny_fx import TinyFX
from picofx import ColourPlayer
from picofx.colour import RGBFX

"""
Show a static colour on TinyFX's RGB output.

Press "Boot" to exit the program.
"""

# Constants
R = 255 # The amount of red (from 0 to 255)
G = 0 # The amount of green (from 0 to 255)
B = 0 # The amount of blue (from 0 to 255)

# Variables
tiny = TinyFX() # Create a new TinyFX object
player = ColourPlayer(tiny.rgb) # Create a new effect player to control TinyFX's RGB output

# Set up the colour effect to play
player.effects = RGBFX(R, G, B)

# Wrap the code in a try block, to catch any exceptions (including KeyboardInterrupt)
try:
player.start() # Start the effects running

# Loop until the effect stops or the "Boot" button is pressed
while player.is_running() and not tiny.boot_pressed():
pass

# Stop any running effects and turn off all the outputs
finally:
player.stop()
tiny.shutdown()
43 changes: 43 additions & 0 deletions examples/tiny_fx/examples/effects/mono/static_brightness.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
from tiny_fx import TinyFX
from picofx import MonoPlayer
from picofx.mono import StaticFX

"""
Show a static brightness on one of TinyFX's outputs.

Press "Boot" to exit the program.
"""

# Constants
BRIGHTNESS = 1.0 # The brightness (from 0.0 to 1.0)

# Variables
tiny = TinyFX() # Create a new TinyFX object to interact with the board
player = MonoPlayer(tiny.outputs) # Create a new effect player to control TinyFX's mono outputs


# Create and set up a blink effect to play
player.effects = [
StaticFX(BRIGHTNESS),

# No effects played on the rest of the outputs (unnecessary to list, but show for clarity)
None,
None,
None,
None,
None,
]


# Wrap the code in a try block, to catch any exceptions (including KeyboardInterrupt)
try:
player.start() # Start the effects running

# Loop until the effect stops or the "Boot" button is pressed
while player.is_running() and not tiny.boot_pressed():
pass

# Stop any running effects and turn off all the outputs
finally:
player.stop()
tiny.shutdown()
30 changes: 29 additions & 1 deletion picofx/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from machine import Pin, PWM, Timer


PICOFX_VERSION = "1.0.0"
PICOFX_VERSION = "1.0.1"


def rgb_from_hsv(h, s, v):
Expand Down Expand Up @@ -96,6 +96,34 @@ def reset(self):
self.__offset = 0


class CyclingAction(Updateable):
def __init__(self, speed):
self.speed = speed
self.__offset_ms = 0
self.__offset = 0

def next(self):
pass

def prev(self):
pass

def tick(self, delta_ms):
self.__offset_ms += int(delta_ms * self.speed)
if self.__offset_ms >= 1000:
self.__offset_ms -= 1000
self.next()
elif self.__offset_ms < 0:
self.__offset_ms += 1000
self.prev()

self.__offset = self.__offset_ms / 1000

def reset(self):
self.__offset_ms = 0
self.__offset = 0


class EffectPlayer:
DEFAULT_FPS = 100

Expand Down
4 changes: 3 additions & 1 deletion picofx/colour/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#
# SPDX-License-Identifier: MIT

from .blink import RGBBlinkFX
from .colour import RGBFX, HSVFX
from .rainbow import RainbowFX, RainbowWaveFX
from .step import HueStepFX
Expand All @@ -20,5 +21,6 @@
HSVFX,
RainbowFX,
RainbowWaveFX,
HueStepFX
HueStepFX,
RGBBlinkFX
]
48 changes: 48 additions & 0 deletions picofx/colour/blink.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# SPDX-FileCopyrightText: 2024 Christopher Parrott for Pimoroni Ltd
#
# SPDX-License-Identifier: MIT

from picofx import CyclingAction


# Derived from maltheim's example: https://forums.pimoroni.com/t/rgb-led-kit-for-tiny-fx-tutorial/25293/15
class RGBBlinkFX(CyclingAction):
"""
Blinks the RGB LED according to the speed, phase and duty cycle.

The colour argument is a single tuple of the form (R,G,B), or a
list of such tuples. A None colour argument defaults to red.

:param: colour an RGB tuple as the colour or colours of the blink
:param: speed the speed of the blink, where 1.0 is 1 second, 0.5 is 2 seconds, etc.
:param: phase the phase of the blink
:param: duty the duty cycle of the blink
"""
def __init__(self, colour=None, speed=1, phase=0.0, duty=0.5):
super().__init__(speed)
self.phase = phase
self.duty = duty
self.__colours = []
self.__index = 0
if colour is None:
self.__colours.append((255, 0, 0))
elif isinstance(colour, tuple) and len(colour) == 3:
self.__colours.append(colour)
elif isinstance(colour, list):
self.__colours.extend(colour)
else:
raise TypeError("colour is not a supported type. Expected a tuple of 3 numbers, a list of tuples, or None.")

def __call__(self):
percent = (self.__offset + self.phase) % 1.0
if percent < self.duty:
colour = self.__colours[self.__index]
return int(colour[0]), int(colour[1]), int(colour[2])
else:
return 0, 0, 0

def next(self):
self.__index = (self.__index + 1) % len(self.__colours)

def prev(self):
self.__index = (self.__index - 1) % len(self.__colours)