diff --git a/boards/PIMORONI_TINYFX/frozen_libs/pimoroni.py b/boards/PIMORONI_TINYFX/frozen_libs/pimoroni.py index 9fe1d4d..c5e047c 100644 --- a/boards/PIMORONI_TINYFX/frozen_libs/pimoroni.py +++ b/boards/PIMORONI_TINYFX/frozen_libs/pimoroni.py @@ -142,47 +142,6 @@ def is_pressed(self): return self.raw() -class RGBLED: - def __init__(self, r, g, b, invert=True, gamma=1): - self._gamma = gamma - self.led_r = PWM(Pin(r), freq=1000, duty_u16=0, invert=invert) - self.led_g = PWM(Pin(g), freq=1000, duty_u16=0, invert=invert) - self.led_b = PWM(Pin(b), freq=1000, duty_u16=0, invert=invert) - - def _rgb(self, r, g, b): - self.led_r.duty_u16(int(pow(r, self._gamma) * 65535 + 0.5)) - self.led_g.duty_u16(int(pow(g, self._gamma) * 65535 + 0.5)) - self.led_b.duty_u16(int(pow(b, self._gamma) * 65535 + 0.5)) - - def set_rgb(self, r, g, b): - r = min(255, max(0, r)) - g = min(255, max(0, g)) - b = min(255, max(0, b)) - self._rgb(r / 255, g / 255, b / 255) - - def set_hsv(self, h, s, v): - if s == 0.0: - self._rgb(v, v, v) - else: - i = int(h * 6.0) - f = (h * 6.0) - i - p, q, t = v * (1.0 - s), v * (1.0 - s * f), v * (1.0 - s * (1.0 - f)) - - i = i % 6 - if i == 0: - self._rgb(v, t, p) - elif i == 1: - self._rgb(q, v, p) - elif i == 2: - self._rgb(p, v, t) - elif i == 3: - self._rgb(p, q, v) - elif i == 4: - self._rgb(t, p, v) - elif i == 5: - self._rgb(v, p, q) - - # A simple class for handling Proportional, Integral & Derivative (PID) control calculations class PID: def __init__(self, kp, ki, kd, sample_rate): @@ -246,25 +205,3 @@ def read(self): def is_set(self, mask): return self.read() & mask == mask - - -# A basic wrapper for PWM with regular on/off and toggle functions from Pin -# Intended to be used for driving LEDs with brightness control & compatibility with Pin -class PWMLED: - def __init__(self, pin, invert=False, gamma=1): - self._gamma = gamma - self._led = PWM(Pin(pin), freq=1000, duty_u16=0, invert=invert) - - def brightness(self, brightness): - brightness = min(1.0, max(0.0, brightness)) - self._brightness = brightness - self._led.duty_u16(int(pow(brightness, self._gamma) * 65535 + 0.5)) - - def on(self): - self.brightness(1) - - def off(self): - self.brightness(0) - - def toggle(self): - self.brightness(1 - self._brightness) diff --git a/examples/tiny_fx/lib/tiny_fx.py b/examples/tiny_fx/lib/tiny_fx.py index e7b2591..b3a7f34 100644 --- a/examples/tiny_fx/lib/tiny_fx.py +++ b/examples/tiny_fx/lib/tiny_fx.py @@ -3,8 +3,8 @@ # SPDX-License-Identifier: MIT from machine import ADC, Pin -from pimoroni import PWMLED, RGBLED from pimoroni_i2c import PimoroniI2C +from picofx import PWMLED, RGBLED class TinyFX: diff --git a/picofx/__init__.py b/picofx/__init__.py index da0002b..8babb4a 100644 --- a/picofx/__init__.py +++ b/picofx/__init__.py @@ -2,7 +2,70 @@ # # SPDX-License-Identifier: MIT -from machine import Timer +from machine import Pin, PWM, Timer + + +# A basic wrapper for PWM with regular on/off and toggle functions from Pin +# Intended to be used for driving LEDs with brightness control & compatibility with Pin +class PWMLED: + def __init__(self, pin, invert=False, gamma=1): + self._gamma = gamma + self._led = PWM(Pin(pin), freq=1000, duty_u16=0, invert=invert) + + def brightness(self, brightness): + brightness = min(1.0, max(0.0, brightness)) + self._brightness = brightness + self._led.duty_u16(int(pow(brightness, self._gamma) * 65535 + 0.5)) + + def on(self): + self.brightness(1) + + def off(self): + self.brightness(0) + + def toggle(self): + self.brightness(1 - self._brightness) + + +class RGBLED: + def __init__(self, r, g, b, invert=True, gamma=1): + self._gamma = gamma + self.led_r = PWM(Pin(r), freq=1000, duty_u16=0, invert=invert) + self.led_g = PWM(Pin(g), freq=1000, duty_u16=0, invert=invert) + self.led_b = PWM(Pin(b), freq=1000, duty_u16=0, invert=invert) + + def _rgb(self, r, g, b): + self.led_r.duty_u16(int(pow(r, self._gamma) * 65535 + 0.5)) + self.led_g.duty_u16(int(pow(g, self._gamma) * 65535 + 0.5)) + self.led_b.duty_u16(int(pow(b, self._gamma) * 65535 + 0.5)) + + def set_rgb(self, r, g, b): + r = min(255, max(0, r)) + g = min(255, max(0, g)) + b = min(255, max(0, b)) + self._rgb(r / 255, g / 255, b / 255) + + def set_hsv(self, h, s, v): + if s == 0.0: + self._rgb(v, v, v) + else: + i = int(h * 6.0) + f = (h * 6.0) - i + p, q, t = v * (1.0 - s), v * (1.0 - s * f), v * (1.0 - s * (1.0 - f)) + + i = i % 6 + if i == 0: + self._rgb(v, t, p) + elif i == 1: + self._rgb(q, v, p) + elif i == 2: + self._rgb(p, v, t) + elif i == 3: + self._rgb(p, q, v) + elif i == 4: + self._rgb(t, p, v) + elif i == 5: + self._rgb(v, p, q) class Updatable: