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
|
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
|
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
|
The Neopixel python driver need to be pre-installed... The easiest way to get
|
||||||
<a "href=http://learn.pimoroni.com/tutorial/unicorn-hat/getting-started-with-unicorn-hat">
|
the driver installed is to use the Unicorn HAT drivers install script... see the
|
||||||
Pimorini Getting Started with Unicorn HAT</a> page.
|
<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
|
curl -sS get.pimoroni.com/unicornhat | bash
|
||||||
|
|
||||||
@ -21,22 +22,29 @@ Usually this is `~/.node-red`
|
|||||||
|
|
||||||
npm install node-red-node-pi-neopixel
|
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
|
Usage
|
||||||
-----
|
-----
|
||||||
|
|
||||||
Defaults to a bar chart style mode using configured foreground and background colours.
|
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
|
<a href="http://html-color-codes.info/color-names/" target="_top">Here
|
||||||
is a list</a> of html_colour names.
|
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**
|
A range of pixels from `x` to `y` can be set by **msg.payload**
|
||||||
with a CSV string `x,y,r,g,b`
|
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])
|
LED_COUNT = int(sys.argv[1])
|
||||||
WAIT_MS = int(sys.argv[2])
|
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.
|
# Define functions which animate LEDs in various ways.
|
||||||
def setPixel(strip, i, color):
|
def setPixel(strip, i, color):
|
||||||
@ -53,6 +60,24 @@ def colorWipe(strip, color, wait_ms=30):
|
|||||||
strip.show()
|
strip.show()
|
||||||
time.sleep(wait_ms/1000.0)
|
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):
|
def wheel(pos):
|
||||||
"""Generate rainbow colors across 0-255 positions."""
|
"""Generate rainbow colors across 0-255 positions."""
|
||||||
if pos < 85:
|
if pos < 85:
|
||||||
@ -103,12 +128,18 @@ if __name__ == '__main__':
|
|||||||
data = raw_input()
|
data = raw_input()
|
||||||
bits = data.split(',')
|
bits = data.split(',')
|
||||||
if len(bits) == 3:
|
if len(bits) == 3:
|
||||||
colorWipe(strip, Color(int(bits[0]), int(bits[1]), int(bits[2])), WAIT_MS)
|
if MODE == "shiftu":
|
||||||
if len(bits) == 4:
|
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 (MODE[0] == 'p' and len(bits) == 4):
|
||||||
setPixel(strip, int(bits[0]), Color(int(bits[1]), int(bits[2]), int(bits[3]) ))
|
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)
|
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
|
except (EOFError, SystemExit): # hopefully always caused by us sigint'ing the program
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
except Exception as ex:
|
except Exception as ex:
|
||||||
print "bad data: "+data
|
print "bad data: "+data
|
||||||
|
print ex
|
||||||
|
@ -32,6 +32,8 @@
|
|||||||
<select id="node-input-mode" style="width:73%">
|
<select id="node-input-mode" style="width:73%">
|
||||||
<option value="pcent">Percent of length</option>
|
<option value="pcent">Percent of length</option>
|
||||||
<option value="pixels">Number of pixels</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>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
@ -53,6 +55,7 @@
|
|||||||
<p>To set the background just send an <i>html colour</i> name.
|
<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
|
<a href="http://html-color-codes.info/color-names/" target="_top">Here
|
||||||
is a list</a> of html colour names.<p>
|
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 <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>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>
|
<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.status({fill:"green",shape:"dot",text:"ok"});
|
||||||
|
|
||||||
node.on("input", inputlistener);
|
node.on("input", inputlistener);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name" : "node-red-node-pi-neopixel",
|
"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.",
|
"description" : "A Node-RED node to output to a neopixel (ws2812) string of LEDS from a Raspberry Pi.",
|
||||||
"dependencies" : {
|
"dependencies" : {
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user