Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. OpenHardware.io
  3. 💬 OH MySensors RGBW Controller

💬 OH MySensors RGBW Controller

Scheduled Pinned Locked Moved OpenHardware.io
mysensorspcbrgbwcontroller
106 Posts 18 Posters 29.5k Views 19 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • hekH Offline
    hekH Offline
    hek
    Admin
    wrote on last edited by
    #5

    Nope, you have to press the refresh button in the github-tab.

    1 Reply Last reply
    0
    • Cliff KarlssonC Offline
      Cliff KarlssonC Offline
      Cliff Karlsson
      wrote on last edited by
      #6

      Great, just one stupid question. Do I just upload the gbl file to dirtypcbs/oshpark or how does it work?

      L 1 Reply Last reply
      0
      • Cliff KarlssonC Cliff Karlsson

        Great, just one stupid question. Do I just upload the gbl file to dirtypcbs/oshpark or how does it work?

        L Offline
        L Offline
        LastSamurai
        Hardware Contributor
        wrote on last edited by LastSamurai
        #7

        @Cliff-Karlsson said:

        Great, just one stupid question. Do I just upload the gbl file to dirtypcbs/oshpark or how does it work?

        You take a zip file with all the gerber files inside (I think I already put one into the git), test it online (if you want to; sometimes it doesnt look perfect here) and then you upload it to dirtypcbs. I don't know how oshpark works, but I guess similar.

        Online gerber viewers I use are:
        http://circuitpeople.com/
        http://mayhewlabs.com/3dpcb

        Edit: I did just fix the files, you should be able to just use the RGBWController-Gerber.zip from the github (I will try to update the openhardware.io page now)

        1 Reply Last reply
        0
        • Cliff KarlssonC Offline
          Cliff KarlssonC Offline
          Cliff Karlsson
          wrote on last edited by
          #8

          What is the correct pitch for the screw terminals? 2.54mm? 5mm ? or other?

          L 1 Reply Last reply
          0
          • Cliff KarlssonC Cliff Karlsson

            What is the correct pitch for the screw terminals? 2.54mm? 5mm ? or other?

            L Offline
            L Offline
            LastSamurai
            Hardware Contributor
            wrote on last edited by
            #9

            @Cliff-Karlsson It should be 5 mm

            1 Reply Last reply
            0
            • AchimA Offline
              AchimA Offline
              Achim
              wrote on last edited by
              #10

              dirtypcb says that the outline files are missing
              No board outline (.GML/.GKO/.GBR) file found.
              Can you please add this outline files to the GIT.

              1 Reply Last reply
              0
              • Cliff KarlssonC Offline
                Cliff KarlssonC Offline
                Cliff Karlsson
                wrote on last edited by
                #11

                I had the same problem with dirtypcbs so I ordered from seedstudio instead. Almost the same price.

                1 Reply Last reply
                0
                • L Offline
                  L Offline
                  LastSamurai
                  Hardware Contributor
                  wrote on last edited by
                  #12

                  Oh thats just a naming issue. Rename the "RGBWController-Edge.cuts.gm1" to .gml in the zip file and it should work just fine.

                  1 Reply Last reply
                  0
                  • peerkersezuukerP Offline
                    peerkersezuukerP Offline
                    peerkersezuuker
                    wrote on last edited by
                    #13

                    Just got the v1.3 pcb's from OSH Park, just waiting for some components, and the we go. It will be an exciting christmas ;-)

                    Domoticz / My Sensors / Z-Wave
                    https://www.kermisbuks.nl

                    1 Reply Last reply
                    0
                    • J Offline
                      J Offline
                      Jan Gatzke
                      wrote on last edited by
                      #14

                      I got my v1.3 pcbs from Smart Prototyping. Quality is good. The controller works fine BUT the sketch version in your github repo is broken. Seems like the non linear fading part never got finished. I am now using linear fading and the sketch is working. :)

                      peerkersezuukerP 1 Reply Last reply
                      1
                      • J Jan Gatzke

                        I got my v1.3 pcbs from Smart Prototyping. Quality is good. The controller works fine BUT the sketch version in your github repo is broken. Seems like the non linear fading part never got finished. I am now using linear fading and the sketch is working. :)

                        peerkersezuukerP Offline
                        peerkersezuukerP Offline
                        peerkersezuuker
                        wrote on last edited by
                        #15

                        @Jan-Gatzke
                        Hi can you please post your adjusted sketch for further reference?

                        Domoticz / My Sensors / Z-Wave
                        https://www.kermisbuks.nl

                        J 1 Reply Last reply
                        0
                        • peerkersezuukerP peerkersezuuker

                          @Jan-Gatzke
                          Hi can you please post your adjusted sketch for further reference?

                          J Offline
                          J Offline
                          Jan Gatzke
                          wrote on last edited by
                          #16

                          @peerkersezuuker

                          You have to fix the following part:

                          for (int i = 0; i < NUM_CHANNELS; i++) {
                              if (isOn) {
                                // normal fading
                                //analogWrite(channels[i], dimming / 100.0 * values[i]);
                          
                                // non linear fading, idea from https://diarmuid.ie/blog/pwm-exponential-led-fading-on-arduino-or-other-platforms/
                                analogWrite(channels[i], pow (2, (dimming / R)) - 1);
                              } else {
                                analogWrite(channels[i], 0);
                              }
                            }
                          

                          Corrected Version

                          for (int i = 0; i < NUM_CHANNELS; i++) {
                              if (isOn) {
                                // normal fading
                                analogWrite(channels[i], dimming / 100.0 * values[i]);
                          
                                // non linear fading, idea from https://diarmuid.ie/blog/pwm-exponential-led-fading-on-arduino-or-other-platforms/
                                //analogWrite(channels[i], pow (2, (dimming / R)) - 1);
                              } else {
                                analogWrite(channels[i], 0);
                              }
                            }
                          

                          Or else all channels are set to the Value of dimming. The sketch on openhardware.io is broken, too.

                          peerkersezuukerP 1 Reply Last reply
                          0
                          • J Jan Gatzke

                            @peerkersezuuker

                            You have to fix the following part:

                            for (int i = 0; i < NUM_CHANNELS; i++) {
                                if (isOn) {
                                  // normal fading
                                  //analogWrite(channels[i], dimming / 100.0 * values[i]);
                            
                                  // non linear fading, idea from https://diarmuid.ie/blog/pwm-exponential-led-fading-on-arduino-or-other-platforms/
                                  analogWrite(channels[i], pow (2, (dimming / R)) - 1);
                                } else {
                                  analogWrite(channels[i], 0);
                                }
                              }
                            

                            Corrected Version

                            for (int i = 0; i < NUM_CHANNELS; i++) {
                                if (isOn) {
                                  // normal fading
                                  analogWrite(channels[i], dimming / 100.0 * values[i]);
                            
                                  // non linear fading, idea from https://diarmuid.ie/blog/pwm-exponential-led-fading-on-arduino-or-other-platforms/
                                  //analogWrite(channels[i], pow (2, (dimming / R)) - 1);
                                } else {
                                  analogWrite(channels[i], 0);
                                }
                              }
                            

                            Or else all channels are set to the Value of dimming. The sketch on openhardware.io is broken, too.

                            peerkersezuukerP Offline
                            peerkersezuukerP Offline
                            peerkersezuuker
                            wrote on last edited by
                            #17

                            @Jan-Gatzke
                            Thank you for your post.
                            I hope the Mosfet's are comming in today, then i can build it up and play with it.

                            Domoticz / My Sensors / Z-Wave
                            https://www.kermisbuks.nl

                            1 Reply Last reply
                            0
                            • L Offline
                              L Offline
                              LastSamurai
                              Hardware Contributor
                              wrote on last edited by
                              #18

                              @Jan-Gatzke Thank you for correcting it ;) I never got around to making the fading part work a 100% so I reverted back to my normal linear fading for my controllers. Seems like I forgot to correct that in my git repo :frowning: Sorry for that, I will fix it after christmas.
                              Great to hear that others are using the controllers too! Have fun with them and update me if you change something or build some (other) cool thing with them!

                              1 Reply Last reply
                              0
                              • peerkersezuukerP Offline
                                peerkersezuukerP Offline
                                peerkersezuuker
                                wrote on last edited by
                                #19

                                A little question, the v1.3 is this the one with the corrected mosfet placement ?
                                I build and programmed one now, but i only get a bright white light, and no response when i switch the node. So now i am in doubt...

                                With regards
                                Peer

                                Domoticz / My Sensors / Z-Wave
                                https://www.kermisbuks.nl

                                J 1 Reply Last reply
                                0
                                • peerkersezuukerP peerkersezuuker

                                  A little question, the v1.3 is this the one with the corrected mosfet placement ?
                                  I build and programmed one now, but i only get a bright white light, and no response when i switch the node. So now i am in doubt...

                                  With regards
                                  Peer

                                  J Offline
                                  J Offline
                                  Jan Gatzke
                                  wrote on last edited by
                                  #20

                                  @peerkersezuuker

                                  The node always starts with white on. This is normal behaviour.

                                  peerkersezuukerP 1 Reply Last reply
                                  0
                                  • J Jan Gatzke

                                    @peerkersezuuker

                                    The node always starts with white on. This is normal behaviour.

                                    peerkersezuukerP Offline
                                    peerkersezuukerP Offline
                                    peerkersezuuker
                                    wrote on last edited by
                                    #21

                                    @Jan-Gatzke
                                    Thank you, i see it in the code now ...
                                    I tested it with setting the RGB levels one by one to 255, and this works, so the channels are responding to the initialisation code.
                                    And because it is rebuild to version 2.0, i forgot one void to adjust...
                                    void incomingMessage(
                                    should be
                                    void receive(

                                    Problem solved, thank you very much.
                                    With regards
                                    Peer van Hoek

                                    Domoticz / My Sensors / Z-Wave
                                    https://www.kermisbuks.nl

                                    J 1 Reply Last reply
                                    0
                                    • peerkersezuukerP peerkersezuuker

                                      @Jan-Gatzke
                                      Thank you, i see it in the code now ...
                                      I tested it with setting the RGB levels one by one to 255, and this works, so the channels are responding to the initialisation code.
                                      And because it is rebuild to version 2.0, i forgot one void to adjust...
                                      void incomingMessage(
                                      should be
                                      void receive(

                                      Problem solved, thank you very much.
                                      With regards
                                      Peer van Hoek

                                      J Offline
                                      J Offline
                                      Jan Gatzke
                                      wrote on last edited by
                                      #22

                                      @peerkersezuuker

                                      Great.Can you post the complete 2.0 sketch, please? I am going to upgrade and this would be a good starting point.

                                      peerkersezuukerP 1 Reply Last reply
                                      0
                                      • J Jan Gatzke

                                        @peerkersezuuker

                                        Great.Can you post the complete 2.0 sketch, please? I am going to upgrade and this would be a good starting point.

                                        peerkersezuukerP Offline
                                        peerkersezuukerP Offline
                                        peerkersezuuker
                                        wrote on last edited by
                                        #23

                                        @Jan-Gatzke
                                        Sure, no problem.
                                        But it is not 100% clean, i am just a coppier and paste'r....
                                        If you can clean it up that would be nice.

                                        /**
                                        Based on the MySensors Project: http://www.mysensors.org
                                        
                                        This sketch controls a (analog)RGBW strip by listening to new color values from a (domoticz) controller and then fading to the new color.
                                        
                                        Version 1.0 - Changed pins and gw definition
                                        Version 0.9 - Oliver Hilsky
                                        
                                        TODO
                                        safe/request values after restart/loss of connection
                                        */
                                        #define MY_DEBUG 
                                        
                                        #define SN   "RGBW 01"
                                        #define SV   "1.0"
                                        #define MY_RADIO_NRF24
                                        // change the pins to free up the pwm pin for led control
                                        #define MY_RF24_CE_PIN 4 //<-- NOTE!!! changed, the default is 9
                                        #define MY_RF24_CS_PIN 10 // default is 10
                                        #define MY_RF24_PA_LEVEL RF24_PA_MAX
                                        #define MY_REPEATER_FEATURE
                                        #define MY_NODE_ID 6
                                        
                                        
                                        // Load mysensors library	
                                        #include <MySensors.h>	
                                        // Load Serial Peripheral Interface library  
                                        #include <SPI.h>
                                        
                                        // Arduino pin attached to driver pins
                                        #define RED_PIN 3 
                                        #define WHITE_PIN 9
                                        #define GREEN_PIN 5
                                        #define BLUE_PIN 6
                                        #define NUM_CHANNELS 4 // how many channels, RGBW=4 RGB=3...
                                        #define CHILD_ID 1
                                        
                                        // Smooth stepping between the values
                                        #define STEP 1
                                        #define INTERVAL 10
                                        const int pwmIntervals = 255;
                                        float R; // equation for dimming curve
                                        
                                        // Stores the current color settings
                                        byte channels[4] = {RED_PIN, GREEN_PIN, BLUE_PIN, WHITE_PIN};
                                        byte values[4] = {0, 0, 0, 255};
                                        byte target_values[4] = {0, 0, 0, 255}; 
                                        
                                        
                                        // stores dimming level
                                        byte dimming = 100;
                                        byte target_dimming = 100;
                                        
                                        // tracks if the strip should be on of off
                                        boolean isOn = true;
                                        
                                        // time tracking for updates
                                        unsigned long lastupdate = millis();
                                             
                                        void setup() 
                                        {
                                          // Initializes the sensor node (with callback function for incoming messages)
                                          //begin(incomingMessage);	// 123 = node id for testing	
                                               
                                          // Set all channels to output (pin number, type)
                                          for (int i = 0; i < NUM_CHANNELS; i++) {
                                            pinMode(channels[i], OUTPUT);
                                          }
                                        
                                          // set up dimming
                                          R = (pwmIntervals * log10(2))/(log10(255));
                                        
                                          // get old values if this is just a restart
                                          request(CHILD_ID, V_RGBW);
                                        
                                          // init lights
                                          updateLights();
                                          
                                          // debug
                                          if (isOn) {
                                            Serial.println("RGBW is running...");
                                          }
                                         
                                          Serial.println("Waiting for messages...");  
                                        }
                                        
                                        void presentation()  {
                                          // Send the sketch version information to the gateway and Controller
                                          sendSketchInfo(SN, SV);
                                        
                                          // Register this device as Waterflow sensor
                                          present(CHILD_ID, S_RGBW_LIGHT, SN, true);
                                        }
                                        
                                        void loop()
                                        {
                                          // Process incoming messages (like config and light state from controller) - basically keep the mysensors protocol running
                                        //  process();		
                                        
                                          // and set the new light colors
                                          if (millis() > lastupdate + INTERVAL) {
                                            updateLights();
                                            lastupdate = millis();
                                          } 
                                        }
                                        
                                        // callback function for incoming messages
                                        void receive(const MyMessage &message) {
                                        
                                          Serial.print("Got a message - ");
                                          Serial.print("Messagetype is: ");
                                          Serial.println(message.type);
                                        
                                          // acknoledgment
                                          if (message.isAck())
                                          {
                                           	Serial.println("Got ack from gateway");
                                          }
                                          
                                          // new dim level
                                          else if (message.type == V_DIMMER) {
                                              Serial.println("Dimming to ");
                                              Serial.println(message.getString());
                                              target_dimming = message.getByte();
                                        
                                              // a new dimmer value also means on, no seperate signal gets send (by domoticz)
                                            isOn = true;
                                          }
                                        
                                          // on / off message
                                          else if (message.type == V_STATUS) {
                                            Serial.print("Turning light ");
                                        
                                            isOn = message.getInt();
                                        
                                            if (isOn) {
                                              Serial.println("on");
                                            } else {
                                              Serial.println("off");
                                            }
                                          }
                                        
                                          // new color value
                                          else if (message.type == V_RGBW) {    
                                            const char * rgbvalues = message.getString();
                                            inputToRGBW(rgbvalues);  
                                        
                                            // a new color also means on, no seperate signal gets send (by domoticz); needed e.g. for groups
                                            isOn = true;  
                                          }  
                                        }
                                        
                                        // this gets called every INTERVAL milliseconds and updates the current pwm levels for all colors
                                        void updateLights() {  
                                        
                                          // update pin values -debug
                                          //Serial.println(greenval);
                                          //Serial.println(redval);
                                          //Serial.println(blueval);
                                          //Serial.println(whiteval);
                                        
                                          //Serial.println(target_greenval);
                                          //Serial.println(target_redval);
                                          //Serial.println(target_blueval);
                                          //Serial.println(target_whiteval);
                                          //Serial.println("+++++++++++++++");
                                        
                                          // for each color
                                          for (int v = 0; v < NUM_CHANNELS; v++) {
                                        
                                            if (values[v] < target_values[v]) {
                                              values[v] += STEP;
                                              if (values[v] > target_values[v]) {
                                                values[v] = target_values[v];
                                              }
                                            }
                                        
                                            if (values[v] > target_values[v]) {
                                              values[v] -= STEP;
                                              if (values[v] < target_values[v]) {
                                                values[v] = target_values[v];
                                              }
                                            }
                                          }
                                        
                                          // dimming
                                          if (dimming < target_dimming) {
                                            dimming += STEP;
                                            if (dimming > target_dimming) {
                                              dimming = target_dimming;
                                            }
                                          }
                                          if (dimming > target_dimming) {
                                            dimming -= STEP;
                                            if (dimming < target_dimming) {
                                              dimming = target_dimming;
                                            }
                                          }
                                        
                                          /*
                                          // debug - new values
                                          Serial.println(greenval);
                                          Serial.println(redval);
                                          Serial.println(blueval);
                                          Serial.println(whiteval);
                                        
                                          Serial.println(target_greenval);
                                          Serial.println(target_redval);
                                          Serial.println(target_blueval);
                                          Serial.println(target_whiteval);
                                          Serial.println("+++++++++++++++");
                                          */
                                        
                                          // set actual pin values
                                          for (int i = 0; i < NUM_CHANNELS; i++) {
                                            if (isOn) {
                                              // normal fading
                                              analogWrite(channels[i], dimming / 100.0 * values[i]);
                                        
                                              // non linear fading, idea from https://diarmuid.ie/blog/pwm-exponential-led-fading-on-arduino-or-other-platforms/
                                              //analogWrite(channels[i], pow (2, (dimming / R)) - 1);
                                            } else {
                                              analogWrite(channels[i], 0);
                                            }
                                          }
                                        }
                                        
                                        // converts incoming color string to actual (int) values
                                        // ATTENTION this currently does nearly no checks, so the format needs to be exactly like domoticz sends the strings
                                        void inputToRGBW(const char * input) {
                                          Serial.print("Got color value of length: "); 
                                          Serial.println(strlen(input));
                                          
                                          if (strlen(input) == 6) {
                                            Serial.println("new rgb value");
                                            target_values[0] = fromhex (& input [0]);
                                            target_values[1] = fromhex (& input [2]);
                                            target_values[2] = fromhex (& input [4]);
                                            target_values[3] = 0;
                                          } else if (strlen(input) == 9) {
                                            Serial.println("new rgbw value");
                                            target_values[0] = fromhex (& input [1]); // ignore # as first sign
                                            target_values[1] = fromhex (& input [3]);
                                            target_values[2] = fromhex (& input [5]);
                                            target_values[3] = fromhex (& input [7]);
                                          } else {
                                            Serial.println("Wrong length of input");
                                          }  
                                        
                                        
                                          Serial.print("New color values: ");
                                          Serial.println(input);
                                          
                                          for (int i = 0; i < NUM_CHANNELS; i++) {
                                            Serial.print(target_values[i]);
                                            Serial.print(", ");
                                          }
                                         
                                          Serial.println("");
                                          Serial.print("Dimming: ");
                                          Serial.println(dimming);
                                        }
                                        
                                        // converts hex char to byte
                                        byte fromhex (const char * str)
                                        {
                                          char c = str [0] - '0';
                                          if (c > 9)
                                            c -= 7;
                                          int result = c;
                                          c = str [1] - '0';
                                          if (c > 9)
                                            c -= 7;
                                          return (result << 4) | c;
                                        }```

                                        Domoticz / My Sensors / Z-Wave
                                        https://www.kermisbuks.nl

                                        J 1 Reply Last reply
                                        0
                                        • peerkersezuukerP peerkersezuuker

                                          @Jan-Gatzke
                                          Sure, no problem.
                                          But it is not 100% clean, i am just a coppier and paste'r....
                                          If you can clean it up that would be nice.

                                          /**
                                          Based on the MySensors Project: http://www.mysensors.org
                                          
                                          This sketch controls a (analog)RGBW strip by listening to new color values from a (domoticz) controller and then fading to the new color.
                                          
                                          Version 1.0 - Changed pins and gw definition
                                          Version 0.9 - Oliver Hilsky
                                          
                                          TODO
                                          safe/request values after restart/loss of connection
                                          */
                                          #define MY_DEBUG 
                                          
                                          #define SN   "RGBW 01"
                                          #define SV   "1.0"
                                          #define MY_RADIO_NRF24
                                          // change the pins to free up the pwm pin for led control
                                          #define MY_RF24_CE_PIN 4 //<-- NOTE!!! changed, the default is 9
                                          #define MY_RF24_CS_PIN 10 // default is 10
                                          #define MY_RF24_PA_LEVEL RF24_PA_MAX
                                          #define MY_REPEATER_FEATURE
                                          #define MY_NODE_ID 6
                                          
                                          
                                          // Load mysensors library	
                                          #include <MySensors.h>	
                                          // Load Serial Peripheral Interface library  
                                          #include <SPI.h>
                                          
                                          // Arduino pin attached to driver pins
                                          #define RED_PIN 3 
                                          #define WHITE_PIN 9
                                          #define GREEN_PIN 5
                                          #define BLUE_PIN 6
                                          #define NUM_CHANNELS 4 // how many channels, RGBW=4 RGB=3...
                                          #define CHILD_ID 1
                                          
                                          // Smooth stepping between the values
                                          #define STEP 1
                                          #define INTERVAL 10
                                          const int pwmIntervals = 255;
                                          float R; // equation for dimming curve
                                          
                                          // Stores the current color settings
                                          byte channels[4] = {RED_PIN, GREEN_PIN, BLUE_PIN, WHITE_PIN};
                                          byte values[4] = {0, 0, 0, 255};
                                          byte target_values[4] = {0, 0, 0, 255}; 
                                          
                                          
                                          // stores dimming level
                                          byte dimming = 100;
                                          byte target_dimming = 100;
                                          
                                          // tracks if the strip should be on of off
                                          boolean isOn = true;
                                          
                                          // time tracking for updates
                                          unsigned long lastupdate = millis();
                                               
                                          void setup() 
                                          {
                                            // Initializes the sensor node (with callback function for incoming messages)
                                            //begin(incomingMessage);	// 123 = node id for testing	
                                                 
                                            // Set all channels to output (pin number, type)
                                            for (int i = 0; i < NUM_CHANNELS; i++) {
                                              pinMode(channels[i], OUTPUT);
                                            }
                                          
                                            // set up dimming
                                            R = (pwmIntervals * log10(2))/(log10(255));
                                          
                                            // get old values if this is just a restart
                                            request(CHILD_ID, V_RGBW);
                                          
                                            // init lights
                                            updateLights();
                                            
                                            // debug
                                            if (isOn) {
                                              Serial.println("RGBW is running...");
                                            }
                                           
                                            Serial.println("Waiting for messages...");  
                                          }
                                          
                                          void presentation()  {
                                            // Send the sketch version information to the gateway and Controller
                                            sendSketchInfo(SN, SV);
                                          
                                            // Register this device as Waterflow sensor
                                            present(CHILD_ID, S_RGBW_LIGHT, SN, true);
                                          }
                                          
                                          void loop()
                                          {
                                            // Process incoming messages (like config and light state from controller) - basically keep the mysensors protocol running
                                          //  process();		
                                          
                                            // and set the new light colors
                                            if (millis() > lastupdate + INTERVAL) {
                                              updateLights();
                                              lastupdate = millis();
                                            } 
                                          }
                                          
                                          // callback function for incoming messages
                                          void receive(const MyMessage &message) {
                                          
                                            Serial.print("Got a message - ");
                                            Serial.print("Messagetype is: ");
                                            Serial.println(message.type);
                                          
                                            // acknoledgment
                                            if (message.isAck())
                                            {
                                             	Serial.println("Got ack from gateway");
                                            }
                                            
                                            // new dim level
                                            else if (message.type == V_DIMMER) {
                                                Serial.println("Dimming to ");
                                                Serial.println(message.getString());
                                                target_dimming = message.getByte();
                                          
                                                // a new dimmer value also means on, no seperate signal gets send (by domoticz)
                                              isOn = true;
                                            }
                                          
                                            // on / off message
                                            else if (message.type == V_STATUS) {
                                              Serial.print("Turning light ");
                                          
                                              isOn = message.getInt();
                                          
                                              if (isOn) {
                                                Serial.println("on");
                                              } else {
                                                Serial.println("off");
                                              }
                                            }
                                          
                                            // new color value
                                            else if (message.type == V_RGBW) {    
                                              const char * rgbvalues = message.getString();
                                              inputToRGBW(rgbvalues);  
                                          
                                              // a new color also means on, no seperate signal gets send (by domoticz); needed e.g. for groups
                                              isOn = true;  
                                            }  
                                          }
                                          
                                          // this gets called every INTERVAL milliseconds and updates the current pwm levels for all colors
                                          void updateLights() {  
                                          
                                            // update pin values -debug
                                            //Serial.println(greenval);
                                            //Serial.println(redval);
                                            //Serial.println(blueval);
                                            //Serial.println(whiteval);
                                          
                                            //Serial.println(target_greenval);
                                            //Serial.println(target_redval);
                                            //Serial.println(target_blueval);
                                            //Serial.println(target_whiteval);
                                            //Serial.println("+++++++++++++++");
                                          
                                            // for each color
                                            for (int v = 0; v < NUM_CHANNELS; v++) {
                                          
                                              if (values[v] < target_values[v]) {
                                                values[v] += STEP;
                                                if (values[v] > target_values[v]) {
                                                  values[v] = target_values[v];
                                                }
                                              }
                                          
                                              if (values[v] > target_values[v]) {
                                                values[v] -= STEP;
                                                if (values[v] < target_values[v]) {
                                                  values[v] = target_values[v];
                                                }
                                              }
                                            }
                                          
                                            // dimming
                                            if (dimming < target_dimming) {
                                              dimming += STEP;
                                              if (dimming > target_dimming) {
                                                dimming = target_dimming;
                                              }
                                            }
                                            if (dimming > target_dimming) {
                                              dimming -= STEP;
                                              if (dimming < target_dimming) {
                                                dimming = target_dimming;
                                              }
                                            }
                                          
                                            /*
                                            // debug - new values
                                            Serial.println(greenval);
                                            Serial.println(redval);
                                            Serial.println(blueval);
                                            Serial.println(whiteval);
                                          
                                            Serial.println(target_greenval);
                                            Serial.println(target_redval);
                                            Serial.println(target_blueval);
                                            Serial.println(target_whiteval);
                                            Serial.println("+++++++++++++++");
                                            */
                                          
                                            // set actual pin values
                                            for (int i = 0; i < NUM_CHANNELS; i++) {
                                              if (isOn) {
                                                // normal fading
                                                analogWrite(channels[i], dimming / 100.0 * values[i]);
                                          
                                                // non linear fading, idea from https://diarmuid.ie/blog/pwm-exponential-led-fading-on-arduino-or-other-platforms/
                                                //analogWrite(channels[i], pow (2, (dimming / R)) - 1);
                                              } else {
                                                analogWrite(channels[i], 0);
                                              }
                                            }
                                          }
                                          
                                          // converts incoming color string to actual (int) values
                                          // ATTENTION this currently does nearly no checks, so the format needs to be exactly like domoticz sends the strings
                                          void inputToRGBW(const char * input) {
                                            Serial.print("Got color value of length: "); 
                                            Serial.println(strlen(input));
                                            
                                            if (strlen(input) == 6) {
                                              Serial.println("new rgb value");
                                              target_values[0] = fromhex (& input [0]);
                                              target_values[1] = fromhex (& input [2]);
                                              target_values[2] = fromhex (& input [4]);
                                              target_values[3] = 0;
                                            } else if (strlen(input) == 9) {
                                              Serial.println("new rgbw value");
                                              target_values[0] = fromhex (& input [1]); // ignore # as first sign
                                              target_values[1] = fromhex (& input [3]);
                                              target_values[2] = fromhex (& input [5]);
                                              target_values[3] = fromhex (& input [7]);
                                            } else {
                                              Serial.println("Wrong length of input");
                                            }  
                                          
                                          
                                            Serial.print("New color values: ");
                                            Serial.println(input);
                                            
                                            for (int i = 0; i < NUM_CHANNELS; i++) {
                                              Serial.print(target_values[i]);
                                              Serial.print(", ");
                                            }
                                           
                                            Serial.println("");
                                            Serial.print("Dimming: ");
                                            Serial.println(dimming);
                                          }
                                          
                                          // converts hex char to byte
                                          byte fromhex (const char * str)
                                          {
                                            char c = str [0] - '0';
                                            if (c > 9)
                                              c -= 7;
                                            int result = c;
                                            c = str [1] - '0';
                                            if (c > 9)
                                              c -= 7;
                                            return (result << 4) | c;
                                          }```
                                          J Offline
                                          J Offline
                                          Jan Gatzke
                                          wrote on last edited by
                                          #24

                                          @peerkersezuuker

                                          If I find the time, I will clean it up. I want to have a look at the non linear fading. IMHO the initial settings need to be customized, too. Instead of switching the white LEDs on the node could request the values from the controller (if possible) or from eeprom.

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          20

                                          Online

                                          11.7k

                                          Users

                                          11.2k

                                          Topics

                                          113.0k

                                          Posts


                                          Copyright 2019 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • MySensors
                                          • OpenHardware.io
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular