From 11eac97d4f359125a0e28bc42612339b3c9bf361 Mon Sep 17 00:00:00 2001 From: blaz-r Date: Sun, 18 Jul 2021 14:10:49 +0200 Subject: [PATCH 1/5] Added support for HSV color --- neopixel.py | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/neopixel.py b/neopixel.py index 58ebddc..4070ef9 100644 --- a/neopixel.py +++ b/neopixel.py @@ -40,7 +40,7 @@ def sk6812(): # Class supports different order of individual colors (GRB, RGB, WRGB, GWRB ...). In order to achieve # this, we need to flip the indexes: in 'RGBW', 'R' is on index 0, but we need to shift it left by 3 * 8bits, # so in it's inverse, 'WBGR', it has exactly right index. Since micropython doesn't have [::-1] and recursive rev() -# isn't too efficient we simply do that by XORing (operand ^) each index with 3 (0b11) to make this flip. +# isn't too efficient we simply do that by XORing (operator ^) each index with 3 (0b11) to make this flip. # When dealing with just 'RGB' (3 letter string), this means same but reduced by 1 after XOR!. # Example: in 'GRBW' we want final form of 0bGGRRBBWW, meaning G with index 0 needs to be shifted 3 * 8bit -> # 'G' on index 0: 0b00 ^ 0b11 -> 0b11 (3), just as we wanted. @@ -117,6 +117,53 @@ class Neopixel: self.pixels[pixel_num] = white << pos['W'] | blue << pos['B'] | red << pos['R'] | green << pos['G'] + # Converts HSV color to rgb tuple and returns it + # Function accepts integer values for , and + # The logic is almost the same as in Adafruit NeoPixel library: + # https://github.com/adafruit/Adafruit_NeoPixel so all the credits for that + # go directly to them (license: https://github.com/adafruit/Adafruit_NeoPixel/blob/master/COPYING) + def colorHSV(self, hue, sat, val): + hue = (hue * 1530 + 32768) // 65536 + if hue < 510: + b = 0 + if hue < 255: + r = 255 + g = hue + else: + r = 510 - hue + g = 255 + elif hue < 1020: + r = 0 + if hue < 765: + g = 255 + b = hue - 510 + else: + g = 1020 - hue + b = 255 + elif hue < 1530: + g = 0 + if hue < 1275: + r = hue - 1020 + b = 255 + else: + r = 255 + b = 1530 - hue + else: + r = 255 + g = 0 + b = 0 + + v1 = 1 + val + s1 = 1 + sat + s2 = 255 - sat + + r = ((((r * s1) >> 8) + s2) * v1) >> 8 + g = ((((g * s1) >> 8) + s2) * v1) >> 8 + b = ((((b * s1) >> 8) + s2) * v1) >> 8 + + return r, g, b + + # Rotate pixels to the left def rotate_left(self, num_of_pixels): if num_of_pixels == None: From 05be57279b00db86a1e208d0592482db4e9d00ac Mon Sep 17 00:00:00 2001 From: blaz-r Date: Sun, 18 Jul 2021 14:56:04 +0200 Subject: [PATCH 2/5] Added HSV example --- examples/smoothRainbow.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 examples/smoothRainbow.py diff --git a/examples/smoothRainbow.py b/examples/smoothRainbow.py new file mode 100644 index 0000000..efe8baa --- /dev/null +++ b/examples/smoothRainbow.py @@ -0,0 +1,14 @@ +# Example showing use of HSV colors +import time +from neopixel import Neopixel + +numpix = 60 +strip = Neopixel(numpix, 0, 0, "GRB") + +hue = 0 +while(True): + color = strip.colorHSV(hue, 255, 150) + strip.fill(color) + strip.show() + + hue += 150 \ No newline at end of file From 14870677d42e768613b340f2e30760716ba787b8 Mon Sep 17 00:00:00 2001 From: blaz-r Date: Sun, 18 Jul 2021 15:03:30 +0200 Subject: [PATCH 3/5] Fixed function so the hue stays in 2^16 range --- neopixel.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/neopixel.py b/neopixel.py index 4070ef9..da2a886 100644 --- a/neopixel.py +++ b/neopixel.py @@ -123,6 +123,9 @@ class Neopixel: # https://github.com/adafruit/Adafruit_NeoPixel so all the credits for that # go directly to them (license: https://github.com/adafruit/Adafruit_NeoPixel/blob/master/COPYING) def colorHSV(self, hue, sat, val): + if hue >= 65536: + hue %= 65536 + hue = (hue * 1530 + 32768) // 65536 if hue < 510: b = 0 From a542384d0ac37e435dfcbcb48e2f3db4aa336208 Mon Sep 17 00:00:00 2001 From: blaz-r Date: Sun, 18 Jul 2021 15:04:40 +0200 Subject: [PATCH 4/5] Updated readme --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 70b865e..7ac1297 100644 --- a/README.md +++ b/README.md @@ -37,4 +37,13 @@ For new settings to take effect you write: pixels.show() ``` +Library also supports HSV colors. For example you can check [smoothRinbow.py](https://github.com/blaz-r/pi_pico_neopixel/blob/develop/examples/smoothRainbow.py) in examples folder. For more info about HSV colors you can check out [Adafruit NeoPixel library documentation](https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library-use) and scroll down to HSV section. +To use HSV colors, call colorHSV(hue, sat, val) function with hue, saturation and value as parameters. The function returns rgb tuple that you can then use in all other functions. + +``` +color = strip.colorHSV(32000, 255, 200) +strip.fill(color) +strip.show() +``` + Library is extended verison of https://github.com/blaz-r/pico_python_ws2812b, originally forked from https://github.com/benevpi/pico_python_ws2812b. \ No newline at end of file From 5461dbac505df2ef52007e399709e0b388eee443 Mon Sep 17 00:00:00 2001 From: blaz-r Date: Mon, 19 Jul 2021 09:19:15 +0200 Subject: [PATCH 5/5] Updated readme --- README.md | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 7ac1297..e9f911a 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ a library for using ws2812b and sk6812 leds (aka neopixels) with Raspberry Pi Pi You'll first need to save the neopixel.py file to your device (for example, open it in Thonny and go file > save as and select MicroPython device. Give it the same name). Once it's there, you can import it into your code. +## Initialization + You create an object with the parameters number of LEDs, state machine ID, GPIO number and mode (RGB or RGBW) in that order. So, to create a strip of 10 leds on state machine 0 and GPIO 0 in RGBW mode you use: ``` @@ -15,21 +17,25 @@ pixels = Neopixel(10, 0, 0, "RGBW") Mind that you can use whichever order of RGB / RGBW you want (GRB, WRGB, GRB, RGWB ...). This only represents order of data sent to led-strip, all functions still work with RGBW order. Exact order of leds should be on package of your led-strip. (My BTF-lights sk6812 has GRBW). +## Usage + This class has many methods, two main ones being show() which sends the data to the strip, and set_pixel which sets the color values for a particular LED. The parameters are LED number and a tuple of form (red, green blue) or (red, green, blue, white) with the colors taking values between 0 and 255. At the moment, this isn't working with the interpreter, so you have to run it from a file. Looks like it's running just too slow to keep up with the PIO buffer from the interpreter. The key methods are set_pixel(n (r,g,b)), set_pixel_line(p1, p2, (r, g, b)) which sets a row of pixels from pixel p1 to pixel p2 (inclusive), and fill((r,g,b)) which fills all the pixels with the color r, g, b. If you want to use the library for RGBW, each function works the same just with last parameter being "white": set_pixel(num, (r, g, b, w)) +## Examples + ``` pixels.set_pixel(5, (10, 0, 0)) pixels.set_pixel_line(5, 7, (0, 10, 0)) pixels.fill((20, 5, 0)) -rgb1 = (0, 0, 50, 0) -rgb2 = (50, 0, 0, 250) +rgbw1 = (0, 0, 50, 0) +rgbw2 = (50, 0, 0, 250) pixels.set_pixel(42, (0, 50, 0, 0)) -pixels.set_pixel_line(5, 7, rgb1) -pixels.set_pixel_line_gradient(0, 13, rgb1, rgb2) +pixels.set_pixel_line(5, 7, rgbw1) +pixels.set_pixel_line_gradient(0, 13, rgbw1, rgbw2) ``` For new settings to take effect you write: @@ -37,13 +43,19 @@ For new settings to take effect you write: pixels.show() ``` -Library also supports HSV colors. For example you can check [smoothRinbow.py](https://github.com/blaz-r/pi_pico_neopixel/blob/develop/examples/smoothRainbow.py) in examples folder. For more info about HSV colors you can check out [Adafruit NeoPixel library documentation](https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library-use) and scroll down to HSV section. +For more examples, check [examples folder](https://github.com/blaz-r/pi_pico_neopixel/tree/develop/examples). + +## HSV colors + +Library also supports HSV colors. For example you can look at [smoothRinbow.py](https://github.com/blaz-r/pi_pico_neopixel/blob/develop/examples/smoothRainbow.py). To use HSV colors, call colorHSV(hue, sat, val) function with hue, saturation and value as parameters. The function returns rgb tuple that you can then use in all other functions. +Hue should be between 0 and 65535. When it becomes larger it just rolls over (65536 -> 0). Saturation and value must be in range from 0 to 255. 255 saturation means just hue, and 255 value is maximum brightness. For more info about HSV colors you can check out [Adafruit NeoPixel library documentation](https://learn.adafruit.com/adafruit-neopixel-uberguide/arduino-library-use) and scroll down to HSV section. + ``` -color = strip.colorHSV(32000, 255, 200) -strip.fill(color) -strip.show() +color = pixels.colorHSV(32000, 255, 200) +pixels.fill(color) +pixels.show() ``` Library is extended verison of https://github.com/blaz-r/pico_python_ws2812b, originally forked from https://github.com/benevpi/pico_python_ws2812b. \ No newline at end of file