mirror of
				https://github.com/node-red/node-red-nodes.git
				synced 2025-03-01 10:37:43 +00:00 
			
		
		
		
	Add Shift modes to neopixel node
This commit is contained in:
		| @@ -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: | ||||||
|  |                 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) |                     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]) )) |                 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"  : { | ||||||
|     }, |     }, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user