mirror of
https://github.com/node-red/node-red-nodes.git
synced 2023-10-10 13:36:58 +02:00
Add Shift modes to neopixel node
This commit is contained in:
parent
4ed955cecf
commit
d38c152983
@ -2,14 +2,15 @@ node-red-node-pi-neopixel
|
||||
=========================
|
||||
|
||||
A <a href="http://nodered.org" target="_new">Node-RED</a> node to drive a strip
|
||||
of Neopixel or WS2812 LEDs.
|
||||
of Neopixel or WS2812 LEDs from a Raspberry Pi.
|
||||
|
||||
Pre-requisites
|
||||
--------------
|
||||
|
||||
The Unicorn HAT python drivers need to be pre-installed... This is the easiest way to get the neopixel driver installed... see the
|
||||
<a "href=http://learn.pimoroni.com/tutorial/unicorn-hat/getting-started-with-unicorn-hat">
|
||||
Pimorini Getting Started with Unicorn HAT</a> page.
|
||||
The Neopixel python driver need to be pre-installed... The easiest way to get
|
||||
the driver installed is to use the Unicorn HAT drivers install script... see the
|
||||
<a href="http://learn.pimoroni.com/tutorial/unicorn-hat/getting-started-with-unicorn-hat" target="_new">
|
||||
Pimoroni Getting Started with Unicorn HAT</a> page.
|
||||
|
||||
curl -sS get.pimoroni.com/unicornhat | bash
|
||||
|
||||
@ -21,22 +22,29 @@ Usually this is `~/.node-red`
|
||||
|
||||
npm install node-red-node-pi-neopixel
|
||||
|
||||
The data pin of the pixels should be connected to physical pin 12 - GPIO 18 of the Pi.
|
||||
*Note:* this may conflict with audio playback.
|
||||
|
||||
Usage
|
||||
-----
|
||||
|
||||
Defaults to a bar chart style mode using configured foreground and background colours.
|
||||
|
||||
It can accept a number in **msg.payload** that can be either the number of pixels, or a percentage of the total length.
|
||||
It can accept a number in **msg.payload** that can be either the number of pixels,
|
||||
or a percentage of the total length.
|
||||
|
||||
If you want to change the foregound colour, you can set **msg.payload** to a comma separated string of `html_colour,length`.
|
||||
If you want to change the foreground colour, you can set **msg.payload** to a
|
||||
comma separated string of `html_colour,length` or `length,html_colour`
|
||||
|
||||
To set the background just set **msg.payload** `html_colour` name.
|
||||
To set the background just set **msg.payload** to an `html_colour` name.
|
||||
<a href="http://html-color-codes.info/color-names/" target="_top">Here
|
||||
is a list</a> of html_colour names.
|
||||
|
||||
The `nth` pixel is set by **msg.payload** with a CSV string `n,r,g,b`
|
||||
You can also select shift modes where a single colour pixel is added to either
|
||||
the start or the end of the strip, shifting all the others along by one.
|
||||
|
||||
The `nth` pixel can be set by **msg.payload** with a CSV string `n,r,g,b` ,
|
||||
where r, g and b are 0-255.
|
||||
|
||||
A range of pixels from `x` to `y` can be set by **msg.payload**
|
||||
with a CSV string `x,y,r,g,b`
|
||||
|
||||
The pixels data line should be connected to Pi physical pin 12 - GPIO 18. *Note:* this may conflict with audio playback.
|
||||
|
@ -32,6 +32,13 @@ if sys.version_info >= (3,0):
|
||||
|
||||
LED_COUNT = int(sys.argv[1])
|
||||
WAIT_MS = int(sys.argv[2])
|
||||
MODE = sys.argv[3]
|
||||
|
||||
def getRGBfromI(RGBint):
|
||||
blue = RGBint & 255
|
||||
green = (RGBint >> 8) & 255
|
||||
red = (RGBint >> 16) & 255
|
||||
return red, green, blue
|
||||
|
||||
# Define functions which animate LEDs in various ways.
|
||||
def setPixel(strip, i, color):
|
||||
@ -53,6 +60,24 @@ def colorWipe(strip, color, wait_ms=30):
|
||||
strip.show()
|
||||
time.sleep(wait_ms/1000.0)
|
||||
|
||||
def shiftUp(strip, color, wait_ms=30):
|
||||
"""Shift all pixels one way."""
|
||||
for i in range(strip.numPixels()):
|
||||
strip.setPixelColor(LED_COUNT-i, strip.getPixelColor(LED_COUNT-i-1))
|
||||
strip.show()
|
||||
time.sleep(wait_ms/1000.0)
|
||||
strip.setPixelColor(0,color)
|
||||
strip.show()
|
||||
|
||||
def shiftDown(strip, color, wait_ms=30):
|
||||
"""Shift all pixels the other way."""
|
||||
for i in range(strip.numPixels()):
|
||||
strip.setPixelColor(i, strip.getPixelColor(i+1))
|
||||
strip.show()
|
||||
time.sleep(wait_ms/1000.0)
|
||||
strip.setPixelColor(LED_COUNT-1,color)
|
||||
strip.show()
|
||||
|
||||
def wheel(pos):
|
||||
"""Generate rainbow colors across 0-255 positions."""
|
||||
if pos < 85:
|
||||
@ -103,12 +128,18 @@ if __name__ == '__main__':
|
||||
data = raw_input()
|
||||
bits = data.split(',')
|
||||
if len(bits) == 3:
|
||||
if MODE == "shiftu":
|
||||
shiftUp(strip, Color(int(bits[0]), int(bits[1]), int(bits[2])), WAIT_MS)
|
||||
elif MODE == "shiftd":
|
||||
shiftDown(strip, Color(int(bits[0]), int(bits[1]), int(bits[2])), WAIT_MS)
|
||||
else:
|
||||
colorWipe(strip, Color(int(bits[0]), int(bits[1]), int(bits[2])), WAIT_MS)
|
||||
if len(bits) == 4:
|
||||
if (MODE[0] == 'p' and len(bits) == 4):
|
||||
setPixel(strip, int(bits[0]), Color(int(bits[1]), int(bits[2]), int(bits[3]) ))
|
||||
if len(bits) == 5:
|
||||
if (MODE[0] == 'p' and len(bits) == 5):
|
||||
setPixels(strip, int(bits[0]), int(bits[1]), Color(int(bits[2]), int(bits[3]), int(bits[4]) ), WAIT_MS)
|
||||
except (EOFError, SystemExit): # hopefully always caused by us sigint'ing the program
|
||||
sys.exit(0)
|
||||
except Exception as ex:
|
||||
print "bad data: "+data
|
||||
print ex
|
||||
|
@ -32,6 +32,8 @@
|
||||
<select id="node-input-mode" style="width:73%">
|
||||
<option value="pcent">Percent of length</option>
|
||||
<option value="pixels">Number of pixels</option>
|
||||
<option value="shiftu">Add pixel to start</option>
|
||||
<option value="shiftd">Add pixel to end</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
@ -53,6 +55,7 @@
|
||||
<p>To set the background just send an <i>html colour</i> name.
|
||||
<a href="http://html-color-codes.info/color-names/" target="_top">Here
|
||||
is a list</a> of html colour names.<p>
|
||||
<p>You can also select shift modes where a single colour pixel is added to either the start or the end of the strip.</p>
|
||||
<p>The <i>nth</i> pixel is set by <b>msg.payload</b> with a CSV string <i>n,r,g,b</i>
|
||||
<!-- <p>The whole strip is set by <b>msg.payload</b> with a CSV string <i>r,g,b</i> -->
|
||||
<p>A range of pixels from <i>x</i> to <i>y</i> can be set by <b>msg.payload</b>
|
||||
|
@ -94,7 +94,7 @@ module.exports = function(RED) {
|
||||
}
|
||||
}
|
||||
|
||||
node.child = spawn(piCommand, [node.pixels, node.wipe]);
|
||||
node.child = spawn(piCommand, [node.pixels, node.wipe, node.mode]);
|
||||
node.status({fill:"green",shape:"dot",text:"ok"});
|
||||
|
||||
node.on("input", inputlistener);
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name" : "node-red-node-pi-neopixel",
|
||||
"version" : "0.0.1",
|
||||
"version" : "0.0.2",
|
||||
"description" : "A Node-RED node to output to a neopixel (ws2812) string of LEDS from a Raspberry Pi.",
|
||||
"dependencies" : {
|
||||
},
|
||||
|
Loading…
Reference in New Issue
Block a user