FastLED / Neopixel (ws2811) Node, From Arduino code to Web page (with API)



  • This is running Dev 1.6.0 , so beware. You will have to convert it to 1.5.0 if you aren't running crazy like me!

    Edited: There was a bug in the code where it had an unroutable IP address along with a script hosted at Google. Fixed.

    Arduino Neopixel Node code

    //#define MY_DEBUG
    #define MY_RADIO_NRF24
    #define MY_NODE_ID 9
    #include <SPI.h>
    #include <MySensor.h>
    
    #include <Adafruit_NeoPixel.h>
    #include <avr/power.h>
    Adafruit_NeoPixel strip = Adafruit_NeoPixel(38, 3, NEO_GRB + NEO_KHZ800);
    
    unsigned int requestedMode = 0 ;
    unsigned int requestedSpeed = 0 ;
    unsigned int currentSpeed = 0 ;
    int messageType = 0 ;
    long hexColor = -1 ;
    
    unsigned long previousTime = 0 ;
    int j = 0 ;
    int q = 0 ;
    
    void setup() {
      Serial.begin(115200);
    
      strip.begin();
      strip.show();
      Serial.println("Neopixel Node device ready");
    }
    
    void presentation() {
      sendSketchInfo("Neopixel Node", "1.0");
      present(0, S_RGB_LIGHT, "Makes strip said color", true);
    }
    
    void loop() {
      
      switch (messageType) {
        case (1):
          Serial.print("Hex color override: "); Serial.println(hexColor);
          colorWipe(hexColor);
          messageType = 0 ;
        break;
    
        case (2):
        
          if ( (previousTime + (long) currentSpeed) < millis() ){
            if (requestedMode == 2) { 
              if (j > 256) { j = 0;}
              for(int i=0; i<strip.numPixels(); i++) {strip.setPixelColor(i, Wheel((i+j) & 255)) ; strip.show(); } 
              j++;
              if ( (j%255) == 0 ) { Serial.println("Rainbow  completed, continuing");}
            }
              
            if (requestedMode == 3) {
              if (j > 256) { j = 0;}
              for(int i=0; i<strip.numPixels(); i++) {strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255)); strip.show(); }
              j = j + 5; 
              if ( (j%255) == 0 ) { Serial.println("Rainbow cycle completed, continuing");}
            }
    
            if (requestedMode == 4) {
              if (j > 10) { j = 0;}
              if (q > 3) { q = 0;}
              for (int j=0; j<10; j++) {
                for (q=0; q < 3; q++) {
                  for (int i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, hexColor ); }
                  strip.show();
                  delay(50);
                  for (int i=0; i < strip.numPixels(); i=i+3) { strip.setPixelColor(i+q, 0); }
                }
              }
            }
            
            previousTime = millis();
          }
        break;
    
        case (3):   // Adjust timing of case 2 using non-blocking code (no DELAYs)
          Serial.print("Case 3 received. Speed set to: "); Serial.print(requestedSpeed * 10); Serial.println(" ms.");
          currentSpeed = requestedSpeed * 10;
          messageType = 2 ;
        break;
      }
    }
    
    
    
    void receive(const MyMessage &message) {
      Serial.println("Message received: ");
    
      if (message.type == V_RGB) { 
        messageType = 1 ;
        String hexstring = message.getString();
        Serial.print("RGB color: "); Serial.println(hexstring);
        hexColor = strtol( &hexstring[0], NULL, 16); 
        }
        
      if (message.type == V_VAR1) { 
        String junkString = message.getString();
        Serial.println(junkString);
        requestedMode = junkString.charAt(0) - 48;
        messageType = 2 ;
        Serial.print("Neo mode: "); Serial.println(requestedMode);
      }
    
      if (message.type == V_VAR2) { // This line is for the speed of said mode
        String junkString = message.getString();
        Serial.println(junkString);
        requestedSpeed = junkString.charAt(0) - 48;
        messageType = 3 ;
        Serial.print("Neo speed: "); Serial.println(requestedSpeed);
      }
    }
    
    
    
    //************* Neopixel subroutines, with DELAYs removed. ***************
    
    
    void rainbowCycle() {
      Serial.println("Rainbow Cycle loop");
      uint16_t i, j;
      for (j = 0; j < 256 * 5; j++) { // 5 cycles of all colors on wheel
        for (i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));}
        strip.show();
      }
    }
    
    void colorWipe(long number) {
      long r = hexColor >> 16;
      long g = hexColor >> 8 & 0xFF;
      long b = hexColor & 0xFF;
      for (uint16_t i = 0; i < strip.numPixels(); i++) {
        strip.setPixelColor(i, r,g,b);
        strip.show();
      }
    }
    
    uint32_t Wheel(byte WheelPos) {
      WheelPos = 255 - WheelPos;
      if (WheelPos < 85) {
        return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
      } else if (WheelPos < 170) {
        WheelPos -= 85;
        return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
      } else {
        WheelPos -= 170;
        return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
      }
    }
    
    

    Node-Red Neopixel Node subroutine
    neopixel subroutine.png

    [{"id":"5bb468f1.8ac468","type":"subflow","name":"Neopixel Node","info":"","in":[{"x":27,"y":212,"wires":[{"id":"b168409e.83cfa"}]}],"out":[{"x":721,"y":215,"wires":[{"id":"18fb6ecc.c732b9","port":0}]}]},{"id":"18fb6ecc.c732b9","type":"mysdecenc","z":"5bb468f1.8ac468","name":"","x":608,"y":214,"wires":[[]]},{"id":"d4cbf034.7f9f4","type":"mysencap","z":"5bb468f1.8ac468","name":"Solid RGB set","nodeid":"9","childid":0,"subtype":"40","internal":0,"ack":false,"msgtype":"1","presentation":false,"presentationtype":0,"presentationtext":"","fullpresentation":false,"firmwarename":"","firmwareversion":"","x":453,"y":175,"wires":[["18fb6ecc.c732b9"]]},{"id":"f841fa59.3ad42","type":"mysencap","z":"5bb468f1.8ac468","name":"Mode Call","nodeid":"9","childid":0,"subtype":"24","internal":0,"ack":false,"msgtype":"1","presentation":false,"presentationtype":0,"presentationtext":"","fullpresentation":false,"firmwarename":"","firmwareversion":"","x":446,"y":211,"wires":[["18fb6ecc.c732b9"]]},{"id":"43e75cfc.4fd6f4","type":"mysencap","z":"5bb468f1.8ac468","name":"Speed Call","nodeid":"9","childid":0,"subtype":"25","internal":0,"ack":false,"msgtype":"1","presentation":false,"presentationtype":0,"presentationtext":"","fullpresentation":false,"firmwarename":"","firmwareversion":"","x":451,"y":248,"wires":[["18fb6ecc.c732b9"]]},{"id":"78baceb2.c1add","type":"function","z":"5bb468f1.8ac468","name":"slash n","func":"msg.payload = msg.payload + \"\\n\";\nreturn msg;","outputs":1,"noerr":0,"x":315,"y":174,"wires":[["d4cbf034.7f9f4"]]},{"id":"4aa5e51d.b8370c","type":"function","z":"5bb468f1.8ac468","name":"slash n","func":"msg.payload = msg.payload + \"\\n\";\nreturn msg;","outputs":1,"noerr":0,"x":318,"y":210,"wires":[["f841fa59.3ad42"]]},{"id":"fdfcef4c.e51f8","type":"function","z":"5bb468f1.8ac468","name":"slash n","func":"msg.payload = msg.payload + \"\\n\";\nreturn msg;","outputs":1,"noerr":0,"x":320,"y":247,"wires":[["43e75cfc.4fd6f4"]]},{"id":"b168409e.83cfa","type":"function","z":"5bb468f1.8ac468","name":"","func":"var hexcolor = msg.payload.hexcolor;\nvar mode = msg.payload.mode;\nvar speed = msg.payload.speed;\n\nif (hexcolor !== undefined ){  // Pass the hexcolor down the path\n    msg.payload = hexcolor ;\n    return [msg, null, null];\n}\n\nif (mode !== undefined ){  // Pass the pattern mode down the path\n    msg.payload = mode ;\n    return [null, msg, null];\n}\n\nif (speed !== undefined ){  // Pass the speed down the path\n    msg.payload = speed ;\n    return [null, null, msg];\n}","outputs":"3","noerr":0,"x":166,"y":211,"wires":[["78baceb2.c1add"],["4aa5e51d.b8370c"],["fdfcef4c.e51f8"]]},{"id":"e2669ab0.c9db9","type":"subflow:5bb468f1.8ac468","z":"395349b4.bbb1be","name":"","x":529,"y":263,"wires":[["d34e424a.c3ba6"]]}]
    

    Node-Red Neopixel Web API
    Neopixel Web API.png

    [{"id":"57fddc52.c8549c","type":"serial-port","z":"395349b4.bbb1be","serialport":"/dev/ttyUSB0","serialbaud":"115200","databits":"8","parity":"none","stopbits":"1","newline":"\\n","bin":"false","out":"char","addchar":false},{"id":"5bb468f1.8ac468","type":"subflow","name":"Neopixel Node","info":"","in":[{"x":27,"y":212,"wires":[{"id":"b168409e.83cfa"}]}],"out":[{"x":721,"y":215,"wires":[{"id":"18fb6ecc.c732b9","port":0}]}]},{"id":"18fb6ecc.c732b9","type":"mysdecenc","z":"5bb468f1.8ac468","name":"","x":608,"y":214,"wires":[[]]},{"id":"d4cbf034.7f9f4","type":"mysencap","z":"5bb468f1.8ac468","name":"Solid RGB set","nodeid":"9","childid":0,"subtype":"40","internal":0,"ack":false,"msgtype":"1","presentation":false,"presentationtype":0,"presentationtext":"","fullpresentation":false,"firmwarename":"","firmwareversion":"","x":453,"y":175,"wires":[["18fb6ecc.c732b9"]]},{"id":"f841fa59.3ad42","type":"mysencap","z":"5bb468f1.8ac468","name":"Mode Call","nodeid":"9","childid":0,"subtype":"24","internal":0,"ack":false,"msgtype":"1","presentation":false,"presentationtype":0,"presentationtext":"","fullpresentation":false,"firmwarename":"","firmwareversion":"","x":446,"y":211,"wires":[["18fb6ecc.c732b9"]]},{"id":"43e75cfc.4fd6f4","type":"mysencap","z":"5bb468f1.8ac468","name":"Speed Call","nodeid":"9","childid":0,"subtype":"25","internal":0,"ack":false,"msgtype":"1","presentation":false,"presentationtype":0,"presentationtext":"","fullpresentation":false,"firmwarename":"","firmwareversion":"","x":451,"y":248,"wires":[["18fb6ecc.c732b9"]]},{"id":"78baceb2.c1add","type":"function","z":"5bb468f1.8ac468","name":"slash n","func":"msg.payload = msg.payload + \"\\n\";\nreturn msg;","outputs":1,"noerr":0,"x":315,"y":174,"wires":[["d4cbf034.7f9f4"]]},{"id":"4aa5e51d.b8370c","type":"function","z":"5bb468f1.8ac468","name":"slash n","func":"msg.payload = msg.payload + \"\\n\";\nreturn msg;","outputs":1,"noerr":0,"x":318,"y":210,"wires":[["f841fa59.3ad42"]]},{"id":"fdfcef4c.e51f8","type":"function","z":"5bb468f1.8ac468","name":"slash n","func":"msg.payload = msg.payload + \"\\n\";\nreturn msg;","outputs":1,"noerr":0,"x":320,"y":247,"wires":[["43e75cfc.4fd6f4"]]},{"id":"b168409e.83cfa","type":"function","z":"5bb468f1.8ac468","name":"","func":"var hexcolor = msg.payload.hexcolor;\nvar mode = msg.payload.mode;\nvar speed = msg.payload.speed;\n\nif (hexcolor !== undefined ){  // Pass the hexcolor down the path\n    msg.payload = hexcolor ;\n    return [msg, null, null];\n}\n\nif (mode !== undefined ){  // Pass the pattern mode down the path\n    msg.payload = mode ;\n    return [null, msg, null];\n}\n\nif (speed !== undefined ){  // Pass the speed down the path\n    msg.payload = speed ;\n    return [null, null, msg];\n}","outputs":"3","noerr":0,"x":166,"y":211,"wires":[["78baceb2.c1add"],["4aa5e51d.b8370c"],["fdfcef4c.e51f8"]]},{"id":"944f576d.f793c8","type":"http in","z":"395349b4.bbb1be","name":"","url":"/neopixel","method":"get","swaggerDoc":"","x":84,"y":182,"wires":[["f7981706.1d0b08"]]},{"id":"512f4e11.a571b8","type":"template","z":"395349b4.bbb1be","name":"Prints data ","field":"payload","format":"handlebars","template":"Hexcolor: {{payload.hexcolor}} \nMode: {{payload.mode}} \nSpeed: {{payload.speed}}","x":528,"y":164,"wires":[["98fabd8f.db8f8"]]},{"id":"e2669ab0.c9db9","type":"subflow:5bb468f1.8ac468","z":"395349b4.bbb1be","name":"","x":529,"y":263,"wires":[["d34e424a.c3ba6"]]},{"id":"98fabd8f.db8f8","type":"http response","z":"395349b4.bbb1be","name":"","x":731,"y":164,"wires":[]},{"id":"2e9eb2d7.d49bfe","type":"debug","z":"395349b4.bbb1be","name":"","active":true,"console":"false","complete":"false","x":536,"y":73,"wires":[]},{"id":"5b91c6df.ea9e18","type":"http in","z":"395349b4.bbb1be","name":"","url":"/neopixel","method":"post","swaggerDoc":"","x":82,"y":145,"wires":[["f7981706.1d0b08"]]},{"id":"9c565a2d.52db08","type":"comment","z":"395349b4.bbb1be","name":"Valid commands ~readme~","info":"hexcolor:000000~ffffff\n    First 2 are red, second 2 are green, last 2 are blue. \n    Just like standard HTML hexcolors without #\nmode:2~4\n    2 is slow rainbow\n    3 is fast rainbow\n    4 is theater chase. Must set a hexcolor before doing this\nspeed:0~9\n    0 is fastest, as 0 ms (0*10 ms) per loop\n    9 is slowest, as 90 ms (9*10 ms) per loop","x":124,"y":266,"wires":[]},{"id":"d34e424a.c3ba6","type":"serial out","z":"395349b4.bbb1be","name":"","serial":"57fddc52.c8549c","x":743,"y":263,"wires":[]},{"id":"f7981706.1d0b08","type":"function","z":"395349b4.bbb1be","name":"Combine Post/Get","func":"return msg;","outputs":1,"noerr":0,"x":298,"y":163,"wires":[["2e9eb2d7.d49bfe","512f4e11.a571b8","e2669ab0.c9db9"]]}]
    

    Node-Red Neopixel Web interface
    Neopixel Node Web Interface.png

    [{"id":"9d9299f7.ff826","type":"http in","z":"163c57ed.326588","name":"","url":"/index.html","method":"get","swaggerDoc":"","x":173,"y":84,"wires":[["8b6f494e.e388b8"]]},{"id":"8b6f494e.e388b8","type":"template","z":"163c57ed.326588","name":"index.html","field":"payload","format":"html","template":"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\" />\n\t<title>Neopixel MySensors Configuration</title>\n\t<script src=\"/jquery.min.js\"></script>\n\t\n\t<script type=\"text/javascript\">\n        $(document).ready(function(){\n            $(\"button[name='rainbow']\").click(function(){ $.post(\"/neopixel\",{ mode: \"2\"}, function() {} ); });\n        });\n    </script>\n    \n    <script type=\"text/javascript\">\n        $(document).ready(function(){\n            $(\"button[name='fastrainbow']\").click(function(){ $.post(\"/neopixel\",{ mode: \"3\"}, function() {} ); });\n        });\n    </script>\n    \n    <script type=\"text/javascript\">\n        $(document).ready(function(){\n            $(\"button[name='chase']\").click(function(){ $.post(\"/neopixel\",{ mode: \"4\"}, function() {} ); });\n        });\n    </script>\n    \n    \n\n</head>\n<body>\n\n<div align=\"center\">\n<canvas width=\"550\" height=\"450\" id=\"canvas_picker\"></canvas>\n<div id=\"hex\">HEX: <input type=\"text\"></input></div>\n\n<button name=\"rainbow\">Rainbow</button>\n<button name=\"fastrainbow\">Fast Rainbow</button>\n<button name=\"chase\">Chase</button><br><br>\n0 (fast) <input type=\"range\"  min=\"0\" max=\"10\" onchange=\"emitValue(this.value)\"/> (slow) 10\n</div>\n\n<script type=\"text/javascript\">\n\tvar canvas = document.getElementById('canvas_picker').getContext('2d');\n\n\t// create an image object and get it’s source\n\tvar img = new Image();\n\timg.src = '/colorwheel3.png';\n\n\t// copy the image to the canvas\n\t$(img).load(function(){ canvas.drawImage(img,0,0); });\n\n\t// http://www.javascripter.net/faq/rgbtohex.htm\n\tfunction rgbToHex(R,G,B) {return toHex(R)+toHex(G)+toHex(B)}\n\tfunction toHex(n) {\n\t  n = parseInt(n,10);\n\t  if (isNaN(n)) return \"00\";\n\t  n = Math.max(0,Math.min(n,255));\n\t  return \"0123456789ABCDEF\".charAt((n-n%16)/16)  + \"0123456789ABCDEF\".charAt(n%16);\n\t}\n\t$('#canvas_picker').click(function(event){\n\t  // getting user coordinates\n\t  var x = event.pageX - this.offsetLeft;\n\t  var y = event.pageY - this.offsetTop;\n\t  // getting image data and RGB values\n\t  var img_data = canvas.getImageData(x, y, 1, 1).data;\n\t  var R = img_data[0];\n\t  var G = img_data[1];\n\t  var B = img_data[2];  var rgb = R + ',' + G + ',' + B;\n\t  // convert RGB to HEX\n\t  var hex = rgbToHex(R,G,B);\n\t  // making the color the value of the input\n\t  $('#rgb input').val(rgb);\n\t  $('#hex input').val(hex);\n\t  $.post( \"/neopixel\", { hexcolor: hex } );  }\n\t  );\n</script>\n\n<script type=\"text/javascript\">\nfunction emitValue(newValue)\n    { $.post(\"/neopixel\",{ speed: newValue}, function() {} ); }\n</script>\n\n\n</body>\n</html>","x":373,"y":82,"wires":[["bf09f135.39cec8"]]},{"id":"fa066d3a.ea6ff8","type":"http in","z":"163c57ed.326588","name":"","url":"/colorwheel3.png","method":"get","swaggerDoc":"","x":153,"y":134,"wires":[["eafd1d33.cc13b8"]]},{"id":"eafd1d33.cc13b8","type":"file in","z":"163c57ed.326588","name":"","filename":"/home/josh/colorwheel3.png","format":"","x":388,"y":134,"wires":[["bf09f135.39cec8"]]},{"id":"bf09f135.39cec8","type":"http response","z":"163c57ed.326588","name":"","x":638,"y":103,"wires":[]},{"id":"5e929b72.ba9364","type":"http in","z":"163c57ed.326588","name":"","url":"/jquery.min.js","method":"get","swaggerDoc":"","x":175,"y":186,"wires":[["521c39b0.344748"]]},{"id":"521c39b0.344748","type":"file in","z":"163c57ed.326588","name":"","filename":"/home/josh/jquery.min.js","format":"","x":397,"y":184,"wires":[["bf09f135.39cec8"]]}]
    
    

    Location for the jquery.min.js : https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js

    Image for Color-Wheel: colorwheel3.png

    Results:

    screenshot.png



  • I am looking at an Arduino code rewrite using FastLED. But for right now, this works and works well.

    I think I might have found a bug in the 1.6.0 beta MySensors. I need to confirm it's not my coding, but because of that, expect Speed call to change internally. Ideally, the API will stay the same, or be added to.

    I will replicate with my ServoActuator to see if it's my coding or the beta.



  • FastLED Arduino sketch is done, along with appropriate Node-red subflow and website.

    And it was surprisingly easy! FastLED is a cinch to work with 🙂

    I'll probably call it ws2811 (Neopixel/FastLED) Node

    Arduino code:

    //#define MY_DEBUG
    #define MY_RADIO_NRF24
    #define MY_NODE_ID 9
    #include <SPI.h>
    #include <MySensor.h>
    
    #include "FastLED.h"
    FASTLED_USING_NAMESPACE
    
    #if defined(FASTLED_VERSION) && (FASTLED_VERSION < 3001000)
    #warning "Requires FastLED 3.1 or later; check github for latest code."
    #endif
    
    #define DATA_PIN    3
    //#define CLK_PIN   4
    #define LED_TYPE    WS2811
    #define COLOR_ORDER GRB
    #define NUM_LEDS    38
    CRGB leds[NUM_LEDS];
    uint8_t gHue = 0;
    
    
    unsigned int currentSpeed = 0 ;
    int brightness = 96;
    unsigned int requestedMode = 0 ;
    int messageType = 0 ;
    int previousMessageType = -1;
    
    String hexColor = "000000" ;
    
    unsigned long previousTime = 0 ;
    
    void setup() {
      delay(1000);
      Serial.begin(115200);
      FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
      FastLED.setBrightness(brightness);
      FastLED.show();
    }
    
    void presentation() {
      sendSketchInfo("FastLED Node", "1.0");
      present(0, S_RGB_LIGHT, "Makes strip said color", true);
    }
    
    void loop() {
      switch (messageType) {
    
        //************** CASE 1 **************
        case (1):
          Serial.print("Hex color override: "); Serial.println(hexColor);
          colorWipe();
          messageType = 0 ;
          break;
    
        //************** CASE 2 **************
        case (2):
          if ( (previousTime + (long) currentSpeed ) < millis() ) {
            if (requestedMode == 2) {rainbow(); FastLED.show(); }
            if (requestedMode == 3) {rainbowWithGlitter();FastLED.show(); }
            if (requestedMode == 4) {addGlitter(80);FastLED.show(); }
            if (requestedMode == 5) {confetti();FastLED.show(); }
            if (requestedMode == 6) {sinelon();FastLED.show(); }
            if (requestedMode == 7) {bpm();FastLED.show(); }
            if (requestedMode == 8) {juggle();FastLED.show(); }
            previousTime = millis();
          }
          break;
    
        //************** CASE 3 **************
        case (3):   // Adjust timing of case 2 using non-blocking code (no DELAYs)
          Serial.print("Case 3 received. Speed set to: "); Serial.print(currentSpeed); Serial.println(" ms.");
          messageType = 2; 
          break;
    
        //************** CASE 4 **************
        case (4):   // Adjust brightness of whole strip of case 2 using non-blocking code (no DELAYs)
          Serial.print("Case 4 received. Brightness set to: "); Serial.println(brightness);
          FastLED.setBrightness(brightness); FastLED.show();
          messageType = previousMessageType ; // We get off type 4 ASAP
          break;
    
    
    
      }
    }
    
    void receive(const MyMessage &message) {
      Serial.println("Message received: ");
    
      if (message.type == V_RGB) { 
        messageType = 1 ;
        hexColor = message.getString();
        Serial.print("RGB color: "); Serial.println(hexColor);
        }
        
      if (message.type == V_VAR1) { 
        requestedMode = message.getInt();
        Serial.println(requestedMode);
        messageType = 2 ;
        Serial.print("Neo mode: "); Serial.println(requestedMode);
      }
    
      if (message.type == V_VAR2) { // This line is for the speed of said mode
        currentSpeed = message.getInt() ;
        Serial.println(currentSpeed);
        messageType = 3 ;
        Serial.print("Neo speed: "); Serial.println(currentSpeed);
      }
    
      if (message.type == V_VAR3) { // This line is for the brightness of said mode
        brightness = message.getInt() ;
        //if(brightness > 255) {brightness = 255;}
        //if(brightness < 0) {brightness = 0;}
        Serial.println(brightness);
        previousMessageType = messageType;
        messageType = 4 ;
        Serial.print("Neo brightness: "); Serial.println(brightness);
      }
    }
    
    
    //********************** FastLED FUNCTIONS ***********************
    
    
    void colorWipe() {
      for (int i = 0; i < NUM_LEDS ; i++) {
        leds[i] = strtol( &hexColor[0], NULL, 16);
        FastLED.show();
      }
    }
    
    void rainbow()
    {
      // FastLED's built-in rainbow generator
      fill_rainbow( leds, NUM_LEDS, gHue++, 7);
    }
    
    void rainbowWithGlitter()
    {
      // built-in FastLED rainbow, plus some random sparkly glitter
      fill_rainbow( leds, NUM_LEDS, gHue++, 7);
      FastLED.show();
      addGlitter(80);
    }
    
    void addGlitter( fract8 chanceOfGlitter)
    {
      if ( random8() < chanceOfGlitter) {
        leds[ random16(NUM_LEDS) ] += CRGB::White;
      }
      
    }
    
    void confetti()
    {
      // random colored speckles that blink in and fade smoothly
      fadeToBlackBy( leds, NUM_LEDS, 10);
      int pos = random16(NUM_LEDS);
      leds[pos] += CHSV( gHue + random8(64), 200, 255);
    }
    
    void sinelon()
    {
      // a colored dot sweeping back and forth, with fading trails
      fadeToBlackBy( leds, NUM_LEDS, 20);
      int pos = beatsin16(13, 0, NUM_LEDS);
      leds[pos] += CHSV( gHue, 255, 192);
    }
    
    void bpm()
    {
      // colored stripes pulsing at a defined Beats-Per-Minute (BPM)
      uint8_t BeatsPerMinute = 62;
      CRGBPalette16 palette = PartyColors_p;
      uint8_t beat = beatsin8( BeatsPerMinute, 64, 255);
      for ( int i = 0; i < NUM_LEDS; i++) { //9948
        leds[i] = ColorFromPalette(palette, gHue + (i * 2), beat - gHue + (i * 10));
      }
    }
    
    void juggle() {
      // eight colored dots, weaving in and out of sync with each other
      fadeToBlackBy( leds, NUM_LEDS, 20);
      byte dothue = 0;
      for ( int i = 0; i < 8; i++) {
        leds[beatsin16(i + 7, 0, NUM_LEDS)] |= CHSV(dothue, 200, 255);
        dothue += 32;
      }
    }
    

    FastLED Node subflow:

    [{"id":"5bb468f1.8ac468","type":"subflow","name":"Neopixel Node","info":"","in":[{"x":67,"y":225,"wires":[{"id":"b168409e.83cfa"}]}],"out":[{"x":731,"y":237,"wires":[{"id":"18fb6ecc.c732b9","port":0}]}]},{"id":"18fb6ecc.c732b9","type":"mysdecenc","z":"5bb468f1.8ac468","name":"","x":627,"y":237,"wires":[[]]},{"id":"d4cbf034.7f9f4","type":"mysencap","z":"5bb468f1.8ac468","name":"Solid RGB set","nodeid":"9","childid":0,"subtype":"40","internal":0,"ack":false,"msgtype":"1","presentation":false,"presentationtype":0,"presentationtext":"","fullpresentation":false,"firmwarename":"","firmwareversion":"","x":453,"y":175,"wires":[["18fb6ecc.c732b9"]]},{"id":"f841fa59.3ad42","type":"mysencap","z":"5bb468f1.8ac468","name":"Mode Call","nodeid":"9","childid":0,"subtype":"24","internal":0,"ack":false,"msgtype":"1","presentation":false,"presentationtype":0,"presentationtext":"","fullpresentation":false,"firmwarename":"","firmwareversion":"","x":446,"y":211,"wires":[["18fb6ecc.c732b9"]]},{"id":"43e75cfc.4fd6f4","type":"mysencap","z":"5bb468f1.8ac468","name":"Speed Call","nodeid":"9","childid":0,"subtype":"25","internal":0,"ack":false,"msgtype":"1","presentation":false,"presentationtype":0,"presentationtext":"","fullpresentation":false,"firmwarename":"","firmwareversion":"","x":451,"y":248,"wires":[["18fb6ecc.c732b9"]]},{"id":"78baceb2.c1add","type":"function","z":"5bb468f1.8ac468","name":"slash n","func":"msg.payload = msg.payload + \"\\n\";\nreturn msg;","outputs":1,"noerr":0,"x":302,"y":174,"wires":[["d4cbf034.7f9f4"]]},{"id":"4aa5e51d.b8370c","type":"function","z":"5bb468f1.8ac468","name":"slash n","func":"msg.payload = msg.payload + \"\\n\";\nreturn msg;","outputs":1,"noerr":0,"x":305,"y":210,"wires":[["f841fa59.3ad42"]]},{"id":"fdfcef4c.e51f8","type":"function","z":"5bb468f1.8ac468","name":"slash n","func":"msg.payload = msg.payload + \"\\n\";\nreturn msg;","outputs":1,"noerr":0,"x":307,"y":247,"wires":[["43e75cfc.4fd6f4"]]},{"id":"b168409e.83cfa","type":"function","z":"5bb468f1.8ac468","name":"","func":"var hexcolor = msg.payload.hexcolor;\nvar mode = msg.payload.mode;\nvar speed = msg.payload.speed;\nvar brightness = msg.payload.brightness;\n\nif (hexcolor !== undefined ){  // Pass the hexcolor down the path\n    msg.payload = hexcolor ;\n    return [msg, null, null, null];\n}\n\nif (mode !== undefined ){  // Pass the pattern mode down the path\n    msg.payload = mode ;\n    return [null, msg, null, null];\n}\n\nif (speed !== undefined ){  // Pass the speed down the path\n    msg.payload = speed ;\n    return [null, null, msg, null];\n}\n\nif (brightness !== undefined ){  // Pass the speed down the path\n    msg.payload = brightness ;\n    return [null, null, null, msg];\n}","outputs":"4","noerr":0,"x":155,"y":225,"wires":[["78baceb2.c1add"],["4aa5e51d.b8370c"],["fdfcef4c.e51f8"],["9eae602d.d13d88"]]},{"id":"842664d8.6ea65","type":"mysencap","z":"5bb468f1.8ac468","name":"Brightness Call","nodeid":"9","childid":0,"subtype":"26","internal":0,"ack":false,"msgtype":"1","presentation":false,"presentationtype":0,"presentationtext":"","fullpresentation":false,"firmwarename":"","firmwareversion":"","x":455,"y":288,"wires":[["18fb6ecc.c732b9"]]},{"id":"9eae602d.d13d88","type":"function","z":"5bb468f1.8ac468","name":"slash n","func":"msg.payload = msg.payload + \"\\n\";\nreturn msg;","outputs":1,"noerr":0,"x":305,"y":285,"wires":[["842664d8.6ea65"]]},{"id":"e2669ab0.c9db9","type":"subflow:5bb468f1.8ac468","z":"395349b4.bbb1be","name":"","x":529,"y":263,"wires":[["d34e424a.c3ba6"]]}]
    
    

    FastLED Node Web API

    [{"id":"57fddc52.c8549c","type":"serial-port","z":"395349b4.bbb1be","serialport":"/dev/ttyUSB0","serialbaud":"115200","databits":"8","parity":"none","stopbits":"1","newline":"\\n","bin":"false","out":"char","addchar":false},{"id":"5bb468f1.8ac468","type":"subflow","name":"Neopixel Node","info":"","in":[{"x":67,"y":225,"wires":[{"id":"b168409e.83cfa"}]}],"out":[{"x":731,"y":237,"wires":[{"id":"18fb6ecc.c732b9","port":0}]}]},{"id":"18fb6ecc.c732b9","type":"mysdecenc","z":"5bb468f1.8ac468","name":"","x":627,"y":237,"wires":[[]]},{"id":"d4cbf034.7f9f4","type":"mysencap","z":"5bb468f1.8ac468","name":"Solid RGB set","nodeid":"9","childid":0,"subtype":"40","internal":0,"ack":false,"msgtype":"1","presentation":false,"presentationtype":0,"presentationtext":"","fullpresentation":false,"firmwarename":"","firmwareversion":"","x":453,"y":175,"wires":[["18fb6ecc.c732b9"]]},{"id":"f841fa59.3ad42","type":"mysencap","z":"5bb468f1.8ac468","name":"Mode Call","nodeid":"9","childid":0,"subtype":"24","internal":0,"ack":false,"msgtype":"1","presentation":false,"presentationtype":0,"presentationtext":"","fullpresentation":false,"firmwarename":"","firmwareversion":"","x":446,"y":211,"wires":[["18fb6ecc.c732b9"]]},{"id":"43e75cfc.4fd6f4","type":"mysencap","z":"5bb468f1.8ac468","name":"Speed Call","nodeid":"9","childid":0,"subtype":"25","internal":0,"ack":false,"msgtype":"1","presentation":false,"presentationtype":0,"presentationtext":"","fullpresentation":false,"firmwarename":"","firmwareversion":"","x":451,"y":248,"wires":[["18fb6ecc.c732b9"]]},{"id":"78baceb2.c1add","type":"function","z":"5bb468f1.8ac468","name":"slash n","func":"msg.payload = msg.payload + \"\\n\";\nreturn msg;","outputs":1,"noerr":0,"x":302,"y":174,"wires":[["d4cbf034.7f9f4"]]},{"id":"4aa5e51d.b8370c","type":"function","z":"5bb468f1.8ac468","name":"slash n","func":"msg.payload = msg.payload + \"\\n\";\nreturn msg;","outputs":1,"noerr":0,"x":305,"y":210,"wires":[["f841fa59.3ad42"]]},{"id":"fdfcef4c.e51f8","type":"function","z":"5bb468f1.8ac468","name":"slash n","func":"msg.payload = msg.payload + \"\\n\";\nreturn msg;","outputs":1,"noerr":0,"x":307,"y":247,"wires":[["43e75cfc.4fd6f4"]]},{"id":"b168409e.83cfa","type":"function","z":"5bb468f1.8ac468","name":"","func":"var hexcolor = msg.payload.hexcolor;\nvar mode = msg.payload.mode;\nvar speed = msg.payload.speed;\nvar brightness = msg.payload.brightness;\n\nif (hexcolor !== undefined ){  // Pass the hexcolor down the path\n    msg.payload = hexcolor ;\n    return [msg, null, null, null];\n}\n\nif (mode !== undefined ){  // Pass the pattern mode down the path\n    msg.payload = mode ;\n    return [null, msg, null, null];\n}\n\nif (speed !== undefined ){  // Pass the speed down the path\n    msg.payload = speed ;\n    return [null, null, msg, null];\n}\n\nif (brightness !== undefined ){  // Pass the speed down the path\n    msg.payload = brightness ;\n    return [null, null, null, msg];\n}","outputs":"4","noerr":0,"x":155,"y":225,"wires":[["78baceb2.c1add"],["4aa5e51d.b8370c"],["fdfcef4c.e51f8"],["9eae602d.d13d88"]]},{"id":"842664d8.6ea65","type":"mysencap","z":"5bb468f1.8ac468","name":"Brightness Call","nodeid":"9","childid":0,"subtype":"26","internal":0,"ack":false,"msgtype":"1","presentation":false,"presentationtype":0,"presentationtext":"","fullpresentation":false,"firmwarename":"","firmwareversion":"","x":455,"y":288,"wires":[["18fb6ecc.c732b9"]]},{"id":"9eae602d.d13d88","type":"function","z":"5bb468f1.8ac468","name":"slash n","func":"msg.payload = msg.payload + \"\\n\";\nreturn msg;","outputs":1,"noerr":0,"x":305,"y":285,"wires":[["842664d8.6ea65"]]},{"id":"944f576d.f793c8","type":"http in","z":"395349b4.bbb1be","name":"","url":"/neopixel","method":"get","swaggerDoc":"","x":84,"y":182,"wires":[["f7981706.1d0b08"]]},{"id":"512f4e11.a571b8","type":"template","z":"395349b4.bbb1be","name":"Prints data ","field":"payload","format":"handlebars","template":"Hexcolor: {{payload.hexcolor}} \nMode: {{payload.mode}} \nSpeed: {{payload.speed}}","x":528,"y":164,"wires":[["98fabd8f.db8f8"]]},{"id":"e2669ab0.c9db9","type":"subflow:5bb468f1.8ac468","z":"395349b4.bbb1be","name":"","x":529,"y":263,"wires":[["d34e424a.c3ba6"]]},{"id":"98fabd8f.db8f8","type":"http response","z":"395349b4.bbb1be","name":"","x":731,"y":164,"wires":[]},{"id":"2e9eb2d7.d49bfe","type":"debug","z":"395349b4.bbb1be","name":"","active":true,"console":"false","complete":"false","x":536,"y":73,"wires":[]},{"id":"5b91c6df.ea9e18","type":"http in","z":"395349b4.bbb1be","name":"","url":"/neopixel","method":"post","swaggerDoc":"","x":82,"y":145,"wires":[["f7981706.1d0b08"]]},{"id":"9c565a2d.52db08","type":"comment","z":"395349b4.bbb1be","name":"Valid commands ~readme~","info":"hexcolor:000000~ffffff\n    First 2 are red, second 2 are green, last 2 are blue. \n    Just like standard HTML hexcolors without #\nmode:2~4\n    2 is rainbow\n    3 is glitter rainbow rainbow\n    4 is glitter. kind of boring\n    5 is confetti\n    6 is Cylon tracers\n    7 is a Beats per minute. currently staticly set to 62bpm in code\n    8 is juggle\nspeed:0~9\n    Number is milliseconds since last time.\n    0ms is little delay as possible\n    200ms is max for website but can go longer (why?)","x":124,"y":266,"wires":[]},{"id":"d34e424a.c3ba6","type":"serial out","z":"395349b4.bbb1be","name":"","serial":"57fddc52.c8549c","x":743,"y":263,"wires":[]},{"id":"f7981706.1d0b08","type":"function","z":"395349b4.bbb1be","name":"Combine Post/Get","func":"return msg;","outputs":1,"noerr":0,"x":298,"y":163,"wires":[["2e9eb2d7.d49bfe","512f4e11.a571b8","e2669ab0.c9db9"]]}]
    
    

    FastLED Node Webpage

    [{"id":"9d9299f7.ff826","type":"http in","z":"163c57ed.326588","name":"","url":"/index.html","method":"get","swaggerDoc":"","x":173,"y":84,"wires":[["8b6f494e.e388b8"]]},{"id":"8b6f494e.e388b8","type":"template","z":"163c57ed.326588","name":"index.html","field":"payload","format":"html","template":"<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\t<meta charset=\"utf-8\" />\n\t<title>Neopixel MySensors Configuration</title>\n\t<script src=\"/jquery.min.js\"></script>\n\t\n\t<script type=\"text/javascript\">\n        $(document).ready(function(){\n            $(\"button[name='rainbow']\").click(function(){ $.post(\"/neopixel\",{ mode: \"2\"}, function() {} ); });\n        });\n    </script>\n    \n    <script type=\"text/javascript\">\n        $(document).ready(function(){\n            $(\"button[name='glitterrainbow']\").click(function(){ $.post(\"/neopixel\",{ mode: \"3\"}, function() {} ); });\n        });\n    </script>\n    \n    <script type=\"text/javascript\">\n        $(document).ready(function(){\n            $(\"button[name='glitter']\").click(function(){ $.post(\"/neopixel\",{ mode: \"4\"}, function() {} ); });\n        });\n    </script>\n    \n    <script type=\"text/javascript\">\n        $(document).ready(function(){\n            $(\"button[name='confetti']\").click(function(){ $.post(\"/neopixel\",{ mode: \"5\"}, function() {} ); });\n        });\n    </script>\n    \n    <script type=\"text/javascript\">\n        $(document).ready(function(){\n            $(\"button[name='cylon']\").click(function(){ $.post(\"/neopixel\",{ mode: \"6\"}, function() {} ); });\n        });\n    </script>\n    \n        <script type=\"text/javascript\">\n        $(document).ready(function(){\n            $(\"button[name='bpm']\").click(function(){ $.post(\"/neopixel\",{ mode: \"7\"}, function() {} ); });\n        });\n    </script>\n    \n    <script type=\"text/javascript\">\n        $(document).ready(function(){\n            $(\"button[name='juggle']\").click(function(){ $.post(\"/neopixel\",{ mode: \"8\"}, function() {} ); });\n        });\n    </script>\n    \n    \n\n</head>\n<body>\n\n<div align=\"center\">\n<canvas width=\"850\" height=\"450\" id=\"canvas_picker\"></canvas>\n<div id=\"hex\">HEX: <input type=\"text\"></input></div>\n\n<button name=\"rainbow\">Rainbow</button>\n<button name=\"glitterrainbow\">Glitter Rainbow</button>\n<button name=\"glitter\">Glitter</button>\n<button name=\"confetti\">Confetti</button>\n<button name=\"cylon\">Cylon</button>\n<button name=\"bpm\">BPM</button>\n<button name=\"juggle\">Juggle</button>\n\n<br><br>\n0 ms. <input type=\"range\"  min=\"0\" max=\"200\" onchange=\"emitSpeed(this.value)\"/> 200 ms.<br>\n0 <input type=\"range\"  min=\"0\" max=\"255\" onchange=\"emitBrightness(this.value)\"/> 255\n</div>\n\n<script type=\"text/javascript\">\n\tvar canvas = document.getElementById('canvas_picker').getContext('2d');\n\n\t// create an image object and get it’s source\n\tvar img = new Image();\n\timg.src = '/colorwheel3.png';\n\n\t// copy the image to the canvas\n\t$(img).load(function(){ canvas.drawImage(img,0,0); });\n\n\t// http://www.javascripter.net/faq/rgbtohex.htm\n\tfunction rgbToHex(R,G,B) {return toHex(R)+toHex(G)+toHex(B)}\n\tfunction toHex(n) {\n\t  n = parseInt(n,10);\n\t  if (isNaN(n)) return \"00\";\n\t  n = Math.max(0,Math.min(n,255));\n\t  return \"0123456789ABCDEF\".charAt((n-n%16)/16)  + \"0123456789ABCDEF\".charAt(n%16);\n\t}\n\t$('#canvas_picker').click(function(event){\n\t  // getting user coordinates\n\t  var x = event.pageX - this.offsetLeft;\n\t  var y = event.pageY - this.offsetTop;\n\t  // getting image data and RGB values\n\t  var img_data = canvas.getImageData(x, y, 1, 1).data;\n\t  var R = img_data[0];\n\t  var G = img_data[1];\n\t  var B = img_data[2];  var rgb = R + ',' + G + ',' + B;\n\t  // convert RGB to HEX\n\t  var hex = rgbToHex(R,G,B);\n\t  // making the color the value of the input\n\t  $('#rgb input').val(rgb);\n\t  $('#hex input').val(hex);\n\t  $.post( \"/neopixel\", { hexcolor: hex } );  }\n\t  );\n</script>\n\n<script type=\"text/javascript\">\nfunction emitSpeed(fast)\n    { $.post(\"/neopixel\",{ speed: fast}, function() {} ); }\n</script>\n\n<script type=\"text/javascript\">\nfunction emitBrightness(bright)\n    { $.post(\"/neopixel\",{ brightness: bright}, function() {} ); }\n</script>\n\n\n</body>\n</html>","x":373,"y":82,"wires":[["bf09f135.39cec8"]]},{"id":"fa066d3a.ea6ff8","type":"http in","z":"163c57ed.326588","name":"","url":"/colorwheel3.png","method":"get","swaggerDoc":"","x":153,"y":134,"wires":[["eafd1d33.cc13b8"]]},{"id":"eafd1d33.cc13b8","type":"file in","z":"163c57ed.326588","name":"","filename":"/home/josh/colorwheel3.png","format":"","x":388,"y":134,"wires":[["bf09f135.39cec8"]]},{"id":"bf09f135.39cec8","type":"http response","z":"163c57ed.326588","name":"","x":638,"y":103,"wires":[]},{"id":"5e929b72.ba9364","type":"http in","z":"163c57ed.326588","name":"","url":"/jquery.min.js","method":"get","swaggerDoc":"","x":175,"y":186,"wires":[["521c39b0.344748"]]},{"id":"521c39b0.344748","type":"file in","z":"163c57ed.326588","name":"","filename":"/home/josh/jquery.min.js","format":"","x":397,"y":184,"wires":[["bf09f135.39cec8"]]}]
    
    


  • @cranky said:

    1.6.0 beta MySensors

    Hi,

    Definitly want to try it.

    I have some ws2801 ledstrip left, can it work with ?

    Where to get 1.6 Mysensors lib ? got to much error to post them here with dev branch lib.


  • Mod

    1.6 is the dev branch. It will likely not be released as 1.6 though, it seems more likely that it will be called 2.0.



  • I can change it back to a 1.5.* code. It'll be a day or so, as I'm busy right now (homework, etc).



  • Hello,
    I know this is an old post.
    But i am trying the script getting to work in combination with Domoticz.
    A did a little rebuild to 2.1.0, and i am getting a RGD light which i can switch to dimmable in Domoticz.
    I can select color and dim the strip but i am struggeling with the Speed (V_VAR2) and Mode (V_VAR1).
    How can I adress these two in Domoticz so it is picked up by the node?
    So i want to set the mode and or the speed from Domoticz to.

    // Enable debug prints to serial monitor
    #define MY_DEBUG 
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    #define MY_RF24_PA_LEVEL RF24_PA_MAX
    // Enabled repeater feature for this node
    #define MY_REPEATER_FEATURE
    #define MY_NODE_ID 9
    
    #include <MySensors.h>
    #include <DHT.h>
    
    #include "FastLED.h"
    FASTLED_USING_NAMESPACE
    
    #if defined(FASTLED_VERSION) && (FASTLED_VERSION < 3001000)
    #warning "Requires FastLED 3.1 or later; check github for latest code."
    #endif
    
    #define DATA_PIN    3
    //#define CLK_PIN   4
    #define LED_TYPE    WS2811
    #define COLOR_ORDER GRB
    #define NUM_LEDS    60
    CRGB leds[NUM_LEDS];
    uint8_t gHue = 0;
    
    
    unsigned int currentSpeed = 0 ;
    int brightness = 96;
    unsigned int requestedMode = 0 ;
    int messageType = 0 ;
    int previousMessageType = -1;
    
    String hexColor = "000000" ;
    
    unsigned long previousTime = 0 ;
    
    void setup() {
      delay(1000);
      Serial.begin(115200);
      FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
      FastLED.setBrightness(brightness);
      FastLED.show();
    }
    
    void presentation() {
      sendSketchInfo("FastLED Node", "1.0");
      present(0, S_RGB_LIGHT, "Makes strip said color", true);
    }
    
    void loop() {
      switch (messageType) {
    
        //************** CASE 1 **************
        case (1):
          Serial.print("Hex color override: "); Serial.println(hexColor);
          colorWipe();
          messageType = 0 ;
          break;
    
        //************** CASE 2 **************
        case (2):
          if ( (previousTime + (long) currentSpeed ) < millis() ) {
            if (requestedMode == 2) {rainbow(); FastLED.show(); }
            if (requestedMode == 3) {rainbowWithGlitter();FastLED.show(); }
            if (requestedMode == 4) {addGlitter(80);FastLED.show(); }
            if (requestedMode == 5) {confetti();FastLED.show(); }
            if (requestedMode == 6) {sinelon();FastLED.show(); }
            if (requestedMode == 7) {bpm();FastLED.show(); }
            if (requestedMode == 8) {juggle();FastLED.show(); }
            previousTime = millis();
          }
          break;
    
        //************** CASE 3 **************
        case (3):   // Adjust timing of case 2 using non-blocking code (no DELAYs)
          Serial.print("Case 3 received. Speed set to: "); Serial.print(currentSpeed); Serial.println(" ms.");
          messageType = 2; 
          break;
    
        //************** CASE 4 **************
        case (4):   // Adjust brightness of whole strip of case 2 using non-blocking code (no DELAYs)
          Serial.print("Case 4 received. Brightness set to: "); Serial.println(brightness);
          FastLED.setBrightness(brightness); FastLED.show();
          messageType = previousMessageType ; // We get off type 4 ASAP
          break;
    
    
    
      }
    }
    
    void receive(const MyMessage &message) {
      Serial.println("Message received: ");
    
      if (message.type == V_RGB) { 
        messageType = 1 ;
        hexColor = message.getString();
        Serial.print("RGB color: "); Serial.println(hexColor);
        }
        
      if (message.type == V_VAR1) { 
        requestedMode = message.getInt();
        Serial.println(requestedMode);
        messageType = 2 ;
        Serial.print("Neo mode: "); Serial.println(requestedMode);
      }
    
      if (message.type == V_VAR2) { // This line is for the speed of said mode
        currentSpeed = message.getInt() ;
        Serial.println(currentSpeed);
        messageType = 3 ;
        Serial.print("Neo speed: "); Serial.println(currentSpeed);
      }
    
      if (message.type == V_VAR3) { // This line is for the brightness of said mode
        brightness = message.getInt() ;
        //if(brightness > 255) {brightness = 255;}
        //if(brightness < 0) {brightness = 0;}
        Serial.println(brightness);
        previousMessageType = messageType;
        messageType = 4 ;
        Serial.print("Neo brightness: "); Serial.println(brightness);
      }
    }
    
    
    //********************** FastLED FUNCTIONS ***********************
    
    
    void colorWipe() {
      for (int i = 0; i < NUM_LEDS ; i++) {
        leds[i] = strtol( &hexColor[0], NULL, 16);
        FastLED.show();
      }
    }
    
    void rainbow()
    {
      // FastLED's built-in rainbow generator
      fill_rainbow( leds, NUM_LEDS, gHue++, 7);
    }
    
    void rainbowWithGlitter()
    {
      // built-in FastLED rainbow, plus some random sparkly glitter
      fill_rainbow( leds, NUM_LEDS, gHue++, 7);
      FastLED.show();
      addGlitter(80);
    }
    
    void addGlitter( fract8 chanceOfGlitter)
    {
      if ( random8() < chanceOfGlitter) {
        leds[ random16(NUM_LEDS) ] += CRGB::White;
      }
      
    }
    
    void confetti()
    {
      // random colored speckles that blink in and fade smoothly
      fadeToBlackBy( leds, NUM_LEDS, 10);
      int pos = random16(NUM_LEDS);
      leds[pos] += CHSV( gHue + random8(64), 200, 255);
    }
    
    void sinelon()
    {
      // a colored dot sweeping back and forth, with fading trails
      fadeToBlackBy( leds, NUM_LEDS, 20);
      int pos = beatsin16(13, 0, NUM_LEDS);
      leds[pos] += CHSV( gHue, 255, 192);
    }
    
    void bpm()
    {
      // colored stripes pulsing at a defined Beats-Per-Minute (BPM)
      uint8_t BeatsPerMinute = 62;
      CRGBPalette16 palette = PartyColors_p;
      uint8_t beat = beatsin8( BeatsPerMinute, 64, 255);
      for ( int i = 0; i < NUM_LEDS; i++) { //9948
        leds[i] = ColorFromPalette(palette, gHue + (i * 2), beat - gHue + (i * 10));
      }
    }
    
    void juggle() {
      // eight colored dots, weaving in and out of sync with each other
      fadeToBlackBy( leds, NUM_LEDS, 20);
      byte dothue = 0;
      for ( int i = 0; i < 8; i++) {
        leds[beatsin16(i + 7, 0, NUM_LEDS)] |= CHSV(dothue, 200, 255);
        dothue += 32;
      }
    }
    

    With Regards, and thanks in advance.
    Peter


Log in to reply
 

520
Online

6.9k
Users

7.8k
Topics

82.7k
Posts

Suggested Topics

Looks like your connection to MySensors Forum was lost, please wait while we try to reconnect.