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. Hardware
  3. MySensors shield and RGBW Controller

MySensors shield and RGBW Controller

Scheduled Pinned Locked Moved Hardware
66 Posts 16 Posters 32.1k Views 21 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.
  • V vil1driver

    hi,

    nice work,

    I not understand why you said 2 pins of the mosfets are switched, for me it's ok,
    I see G to arduino pins, S at center, and D to leds.. I miss something ?
    I think I will buy some of them for testing

    ps: maybe you can add your project on openhardware.io

    sry for my english

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

    @vil1driver Thanks you! I did change them to IRFZ44N's to be able to drive longer strips. I think the new schematics aren't uploaded here yet. I did switch drain and source pins there. Other than that it seems to be working perfectly, so I will create a new (and hopefully final) version soon.

    I am also thinking about adding SPI pins. Perhaps I also add pins for a DHT11/22, there is still some free space on there. Does anyone have another idea what would be good to add/change?

    As soon as the updated PCB is done I will update my github and I guess also open a project on openhardware.io.

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

      I just finished building another prototype and it's mostly working fine. I still have some lag/network issues and I am not 100% sure about the perfect software/dimming either but I am working on that.
      I will update the code in my git soon and design the new board (I am trying to learn using kicad for that).

      With the RGBW strip I am using red seems to be a lot darker than the other colors. Has someone seen similar behaviour? Or an idea how to fix that?

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

        The problem with the red channel seems to be on the controller's side. Once I switches red and green wires the green got dimmed way too much. I am not sure yet if i's software or hardware thats causing the problem though. :worried:

        I now have a real demo up and running and found another problem: most of the time sending commands works but about 20-40% of the command simply get ignored. Once that happens it takes some time to react at all again.
        On/off seems to work most of the time, changing colors slightly less, changing to/from white most of the time doesn't and dimming doesn't seem to work at all. It is really strange.
        Also the domoticz webinterface gets really laggy after some of the commands failed.
        Waiting some time and then retrying seems to help.

        Is there a good way to debug the domoticz/serial gateway part of the network (because the rgbw controller worked well when I tested it before). The domoticz log only gives me entries like this:

        2016-03-12 18:23:46.917 (MySensors USB-Serial Gateway) Lighting Limitless/Applamp (RGBW test light)
        

        and I have no idea how to see what the serial output to the gateway is.

        Can anyone help?

        The updated code is in my github and here. If you find errors or stuff that could be improved please tell me :)

        /**
        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 0.9
        
        TODO
        safe/request values after restart/loss of connection
        */
        
        
        #define SN   "RGBW Led strip testSketch 3"
        #define SV   "v0.9"
        
        // Load mysensors library	
        #include <MySensor.h>	
        // Load Serial Peripheral Interface library  
        #include <SPI.h>
        
        // Arduino pin attached to driver pins
        #define RED_PIN 3 
        #define WHITE_PIN 4	
        #define GREEN_PIN 5
        #define BLUE_PIN 6
        #define NUM_CHANNELS 4 // how many channels, RGBW=4 RGB=3...
        
        #define SENSOR_ID 1
        
        // Smooth stepping between the values
        #define STEP 1
        #define INTERVAL 10
        const int pwmIntervals = 255;
        float R; // equation for dimming curve
        
        
        MySensor gw;	
           
        // Stores the current color settings
        byte channels[4] = {RED_PIN, GREEN_PIN, BLUE_PIN, WHITE_PIN};
        byte values[4] = {100, 100, 100, 100};
        byte target_values[4] = {100, 100, 100, 100}; 
        
        
        // 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)
          gw.begin(incomingMessage, 123);	// 123 = node id for testing	
               
          // Present sketch (name, version)
          gw.sendSketchInfo(SN, SV);				
               
          // Register sensors (id, type, description, ack back)
          gw.present(SENSOR_ID, S_RGBW_LIGHT, "RGBW test light", true);
        
          // 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));
        
          // init lights
          updateLights();
          
          // debug
          if (isOn) {
            Serial.println("RGBW is running...");
          }
         
          Serial.println("Waiting for messages...");  
        }
        
        void loop()
        {
          // Process incoming messages (like config and light state from controller) - basically keep the mysensors protocol running
          gw.process();		
        
          // and set the new light colors
          if (millis() > lastupdate + INTERVAL) {
            updateLights();
            lastupdate = millis();
          } 
        }
        
        // callback function for incoming messages
        void incomingMessage(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();
          }
        
          // 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);    
          }  
        }
        
        // 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) {
              //analogWrite(channels[i], dimming / 100 * 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, (values[i] / 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;
        }
        

        Update:
        fixed some small errors in the code.
        I also just debugged the rgbw controller via serial to usb and the problem seems to be that most commands just don't reach the node. At least I got no errors via serial.
        There also seems to be some kind of jam sometimes where I send multiple commands nothing happens and then after some seconds all of them are executed in very short order

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

          So I did some more debugging. If someone else has similar problems: you can see the serial output if you ssh into your pi and type

          cat /dev/ttyACM0
          

          where ttyACM0 is the serial port of my gateway. The problem seems to be somewhere between gateway and rgbw controller.
          I get a log like this:

          
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:1
          0;0;3;0;9;read: 123-123-0 s=1,c=1,t=2,pt=0,l=1,sg=0:1
          123;1;1;1;2;1
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:1
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:0
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:1
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:1
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:0
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=ok:1
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:0
          0;0;3;0;9;read: 123-123-0 s=1,c=1,t=2,pt=0,l=1,sg=0:0
          123;1;1;1;2;0
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:1
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=ok:0
          0;0;3;0;9;read: 123-123-0 s=1,c=1,t=2,pt=0,l=1,sg=0:0
          123;1;1;1;2;0
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=ok:1
          0;0;3;0;9;read: 123-123-0 s=1,c=1,t=2,pt=0,l=1,sg=0:1
          123;1;1;1;2;1
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:0
          0;0;3;0;9;read: 123-123-0 s=1,c=1,t=2,pt=0,l=1,sg=0:0
          123;1;1;1;2;0
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:1
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:0
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:1
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:0
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:1
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:0
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:1
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:0
          0;0;3;0;9;read: 123-123-0 s=1,c=1,t=2,pt=0,l=1,sg=0:0
          123;1;1;1;2;0
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:1
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=ok:0
          0;0;3;0;9;read: 123-123-0 s=1,c=1,t=2,pt=0,l=1,sg=0:0
          123;1;1;1;2;0
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:1
          0;0;3;0;9;read: 123-123-0 s=1,c=1,t=2,pt=0,l=1,sg=0:1
          123;1;1;1;2;1
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:1
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=41,pt=0,l=9,sg=0,st=fail:#00000
          0;0;3;0;9;read: 123-123-0 s=1,c=1,t=41,pt=0,l=9,sg=0:#000000FF
          123;1;1;1;41;#000000FF
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=3,pt=0,l=3,sg=0,st=fail:100
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:0
          0;0;3;0;9;read: 123-123-0 s=1,c=1,t=2,pt=0,l=1,sg=0:0
          123;1;1;1;2;0
          0;0;3;0;9;send: 0-0-123-123 s=1,c=1,t=2,pt=0,l=1,sg=0,st=fail:1
          0;0;3;0;9;read: 123-123-0 s=1,c=1,t=2,pt=0,l=1,sg=0:1
          123;1;1;1;2;1
          

          Every action in the webinterface get a entry here and some of them work just fine. But most of them return st=fail:1 (which I guess means that the message couldn't reach the receiver). In some cases it seems like only the acknoledgment didn't make it because the rgbwcontroller reacts anyways.
          Any ideas how to fix that? I had none such problems earlier with my sensor nodes. Might this be a software problem with my controller? Am I not updating gw.process() often enough?

          1 Reply Last reply
          0
          • M Offline
            M Offline
            MikeF
            wrote on last edited by
            #34

            Hi @LastSamurai, I've loaded your sketch onto my RGBW controller, and had a look.

            I discovered a number of issues:

            • in updateLights(), under '// for each color', the limit on the 'for' loop should be v < NUM_CHANNELS (not v<= ... - this was corrupting channels[0])
            • under '// set actual pin values', I had trouble with the exponential dimming, so I commented out this line, and uncommented the alternative analogWrite statement 2 lines above
            • dimming and target_dimming should be declared as type 'float', otherwise the calculation dimming / 100 * values[i] rounds down to zero (the LEDs were switching off)
            • on an Arduino Nano and Pro Mini (at least), PWM outputs are restricted to D3, 5, 6, 9, 10, 11 - you have defined WHITE_PIN as D4.

            With these changes, it seems to work OK - I didn't get any 'st=fail' errors; are you supplying the radio from a separate 3.3V supply (not from the Arduino), and have you added a capacitor (usually 4.7uF) across the supply pins?

            L 1 Reply Last reply
            0
            • M MikeF

              Hi @LastSamurai, I've loaded your sketch onto my RGBW controller, and had a look.

              I discovered a number of issues:

              • in updateLights(), under '// for each color', the limit on the 'for' loop should be v < NUM_CHANNELS (not v<= ... - this was corrupting channels[0])
              • under '// set actual pin values', I had trouble with the exponential dimming, so I commented out this line, and uncommented the alternative analogWrite statement 2 lines above
              • dimming and target_dimming should be declared as type 'float', otherwise the calculation dimming / 100 * values[i] rounds down to zero (the LEDs were switching off)
              • on an Arduino Nano and Pro Mini (at least), PWM outputs are restricted to D3, 5, 6, 9, 10, 11 - you have defined WHITE_PIN as D4.

              With these changes, it seems to work OK - I didn't get any 'st=fail' errors; are you supplying the radio from a separate 3.3V supply (not from the Arduino), and have you added a capacitor (usually 4.7uF) across the supply pins?

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

              Thank you very much for testing!!
              I did already fix some of these errors in the code above and my git... but I forgot to push that to github :sweat_smile:

              @MikeF said:

              Hi @LastSamurai, I've loaded your sketch onto my RGBW controller, and had a look.

              I discovered a number of issues:

              • in updateLights(), under '// for each color', the limit on the 'for' loop should be v < NUM_CHANNELS (not v<= ... - this was corrupting channels[0])

              I already fixed that

              • under '// set actual pin values', I had trouble with the exponential dimming, so I commented out this line, and uncommented the alternative analogWrite statement 2 lines above

              Mhm ok it worked on another testsketch but I will test that again later

              • dimming and target_dimming should be declared as type 'float', otherwise the calculation dimming / 100 * values[i] rounds down to zero (the LEDs were switching off)

              Ok changed it

              • on an Arduino Nano and Pro Mini (at least), PWM outputs are restricted to D3, 5, 6, 9, 10, 11 - you have defined WHITE_PIN as D4.

              Yes thank you, I know that. I made a mistake there in my first testrun of pcbs so I have to use pin 4 for white here. I already fixed that in my next design.

              With these changes, it seems to work OK - I didn't get any 'st=fail' errors; are you supplying the radio from a separate 3.3V supply (not from the Arduino), and have you added a capacitor (usually 4.7uF) across the supply pins?

              On the gateway side I soldered a cap directly to the nrf. I was using the arduino unos power supply but using an external one didn't change anything ;( On the side of the controller I am using a stepdown converter from the 12V for the leds and 2 caps (4,7 and 47).

              Strangely it's getting even worse. Only about 5% of my commands seem to reach the controller and in most of the cases I don't get any acknowledgment back even in these cases. I even tried to change the channel to 111 (not in the wlan spectrum any more afaik). It did not help at all. The distance between controller and gateway is only about 3m, no obstacles.

              Does anyone have another idea? It's really sad to have the setup done and then being unable to really use it ;(

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

                Something seems to be off with the controller. I tried the same code on another arduino uno and it worked just fine. A little less distance perhaps but no errors at all. Strange thing is that the controller was working just fine earlier on.
                I will do some measuring tomorrow perhaps something broke on the board :cry:

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

                  So the problem seems to be the power supply. These buck converters have a high frequency ripple. A solution seems to be a LC filter which I found out in this thread.
                  Now I have the next strange problem though:
                  The controller doesn't seem to find his parent (gateway) somehow. I get logs like this:

                  find parent
                  send: 123-123-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,st=bc:
                  find parent
                  send: 123-123-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,st=bc:
                  find parent
                  send: 123-123-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,st=bc:
                  sensor started, id=123, parent=255, distance=255
                  find parent
                  send: 123-123-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,st=bc:
                  find parent
                  send: 123-123-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,st=bc:
                  find parent
                  send: 123-123-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,st=bc:
                  RGBW is running...
                  Waiting for messages...
                  read: 0-0-123 s=1,c=1,t=2,pt=0,l=1,sg=0:0
                  find parent
                  send: 123-123-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,st=bc:
                  Got a message - Messagetype is: 7
                  read: 0-0-123 s=1,c=1,t=41,pt=0,l=6,sg=0:FF0000
                  find parent
                  send: 123-123-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,st=bc:
                  read: 0-0-123 s=1,c=1,t=3,pt=0,l=2,sg=0:78
                  Got a message - Messagetype is: 3
                  Dimming to 
                  78
                  

                  where the "got a message - ..." part is from my code. It also doesn't show up in my gateway and none of these broadcasts reach it either. The controller uses a set id (123) and I still have that configuration in my domoticz from some earlier test. The really strange thing is that any commands I send from the gateway reach the controller without problems (see last part of the log above for example.)
                  How can this be that sending in one direction seems to work but not in the other? Any idea how to fix this?
                  I'll try to build another testnode with linear regulator soon too so that I can hopefull fix the power issues once and for all ;(

                  PS Ok I assume it's still some kind of power problem because about 1 in 10 times I send a message from the controller I actually get one back. This means you really can't use these cheap buck converters, at least like this, for this kind of setup I guess. I will build the new node tomorrow if I can.

                  1 Reply Last reply
                  0
                  • J Offline
                    J Offline
                    jeti
                    wrote on last edited by
                    #38
                    This post is deleted!
                    1 Reply Last reply
                    0
                    • L Offline
                      L Offline
                      LastSamurai
                      Hardware Contributor
                      wrote on last edited by
                      #39

                      I finally found the time to update my RGBW control pcb and circuit. I just ordered the new version if you want to try them out.
                      This time I used kiCad and will upload the new files later (and hopefully finally create the openHhardware.io project too).
                      I switched to smd parts for mosfets, voltage regulator, resistors and one cap. I also fixed the wrong pinout for the mosfets and switched the CE pin to pin 4 of the pro mini so that now four real pwm pins can be used to control the RGBW outputs.

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

                        I also reworked my sensor board. My goal is a relatively small sensor running of a coin cell (small sensor is useless if the battery pack is double its size). I took some ideas from the excellent slim node but added/changed some parts.
                        The idea at the moment is to support DHT temp/hum sensors, Si7021 or similar I2C sensors, low power IR modules and moisture sensors. The moisture sensor pins should also be usable for (reed)switches.
                        Because some of these sensors require 3.3V (or even 5) I also added a boostconverter. If it's not needed there is a jumber to bridge it. I was worried about power consumption of the sensors when the IC sleeps so I also added a transistor to control the boost converter power.

                        I am planning to use these small cases.

                        Do you guys see any errors? Does the transistor part work like that? Or do you have any suggestions what else to add?
                        Thanks for your feedback!

                        PS I already added serial (RX/TX/GND/Battery) ouput pins and a pulldown resistor for the Gate of the transistor.

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

                          I just realized that I forgot to actually forgot to add the schematics... hard for you guys to help like that^^. So here they are, I hope you guys find some errors that I overlooked ;)

                          0_1460320572976_MiniSensor.jpg

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

                            Any feedback? I will keep working on it for the next days. I am also thinking about adding some kind of light sensor. What is the cheapest one that works well with <=3.3V? What do you guys use?

                            1 Reply Last reply
                            0
                            • GertSandersG Offline
                              GertSandersG Offline
                              GertSanders
                              Hardware Contributor
                              wrote on last edited by
                              #43

                              I use an LDR

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

                                @GertSanders Thanks, that seems to be the easiest solution.
                                I am still working on the board so any mistake you guys might find... tell me :)

                                I finally got around to post the RGBW controller part on openhardware.io. Here is the discussion thread.

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

                                  Does anyone have a link (ebay aliexpress) or name for a nice coincell holder that I can use for my pcb. I used to use some with 2 pins as a connection to the pcb and a plane and some kind of sping on the other side. These work well but its very hard to get the coin cells out again when testing. I saw some pictures of coin cell holders where you just push the cell in from the side but can't find them online.

                                  Also do you guys know any other sensors that could be of use (so that I can integrate them here) or see any errors in my schematics? Otherwise I can hopefully do the pcb design later this week and finally order the boards.

                                  GertSandersG 1 Reply Last reply
                                  0
                                  • L LastSamurai

                                    Does anyone have a link (ebay aliexpress) or name for a nice coincell holder that I can use for my pcb. I used to use some with 2 pins as a connection to the pcb and a plane and some kind of sping on the other side. These work well but its very hard to get the coin cells out again when testing. I saw some pictures of coin cell holders where you just push the cell in from the side but can't find them online.

                                    Also do you guys know any other sensors that could be of use (so that I can integrate them here) or see any errors in my schematics? Otherwise I can hopefully do the pcb design later this week and finally order the boards.

                                    GertSandersG Offline
                                    GertSandersG Offline
                                    GertSanders
                                    Hardware Contributor
                                    wrote on last edited by
                                    #46

                                    @LastSamurai
                                    Look for Keystone Technologies. They make the battery holder on the Adafruit RTC breakout.

                                    L 1 Reply Last reply
                                    0
                                    • GertSandersG GertSanders

                                      @LastSamurai
                                      Look for Keystone Technologies. They make the battery holder on the Adafruit RTC breakout.

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

                                      @GertSanders Thanks you very much but I just can't find any of them (at least at a reasonable price) on aliexpres or ebay(.de).
                                      Should you (or someone else) know a link to one, please send it to me!

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

                                        So I got my pcbs yesterday and started to test them. After some problems with power supply (here) I got the pro mini + nrf to work and send/receive commands. Today I connected the led lights and nothing happened (although it should start with a little power on all channels). After some time of testing to figure out the error the AMS suddenly got very hot and I disconnected the power as fast as possible. Now the pro mini doesn't react anymore to programming (or even serial in/output). I think I somehow broke it. Before I destroy another one though:
                                        do you guys have any idea if there might be an error in my schematics (especially concerning the mosfet part)?

                                        The schematics are in the pdf:
                                        link text

                                        This is my current code:

                                        /**
                                        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 - First version
                                        
                                        TODO
                                        safe/request values after restart/loss of connection
                                        */
                                        
                                        
                                        #define SN   "RGBW test"
                                        #define SV   "v1.0 29042016"
                                        
                                        // Load mysensors library	
                                        #include <MySensor.h>	
                                        // Load Serial Peripheral Interface library  
                                        #include <SPI.h>
                                        
                                        // Arduino pin attached to driver pins
                                        #define RED_PIN 3 
                                        #define WHITE_PIN 9	// this is not a pwm pin! change it if you want pwm
                                        #define GREEN_PIN 5
                                        #define BLUE_PIN 6
                                        #define NUM_CHANNELS 4 // how many channels, RGBW=4 RGB=3...
                                        
                                        #define SENSOR_ID 1
                                        
                                        // Smooth stepping between the values
                                        #define STEP 1
                                        #define INTERVAL 10
                                        const int pwmIntervals = 255;
                                        float R; // equation for dimming curve
                                        
                                        // change the pins to free up the pwm pin for led control
                                        #define RF24_CE_PIN   4 //<-- NOTE!!! changed, the default is 9
                                        #define RF24_CS_PIN   10  // default is 10
                                        #define RF24_PA_LEVEL RF24_PA_MAX
                                        
                                        MyTransportNRF24 transport(RF24_CE_PIN, RF24_CS_PIN, RF24_PA_LEVEL);
                                        MySensor gw(transport);	
                                           
                                        // Stores the current color settings
                                        byte channels[4] = {RED_PIN, GREEN_PIN, BLUE_PIN, WHITE_PIN};
                                        byte values[4] = {100, 100, 100, 100};
                                        byte target_values[4] = {100, 100, 100, 100}; 
                                        
                                        
                                        // 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)
                                          gw.begin(incomingMessage);	// 123 = node id for testing	
                                               
                                          // Present sketch (name, version)
                                          gw.sendSketchInfo(SN, SV);				
                                               
                                          // Register sensors (id, type, description, ack back)
                                          gw.present(SENSOR_ID, S_RGBW_LIGHT, "RGBW test light", true);
                                        
                                          // request current values from gateway/controller
                                          //gw.request(SENSOR_ID, S_RGBW_LIGHT);
                                        
                                          // 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));
                                        
                                          // init lights
                                          updateLights();
                                          
                                          // debug
                                          if (isOn) {
                                            Serial.println("RGBW is running...");
                                          }
                                         
                                          Serial.println("Waiting for messages...");  
                                        }
                                        
                                        void loop()
                                        {
                                          // Process incoming messages (like config and light state from controller) - basically keep the mysensors protocol running
                                          gw.process();		
                                        
                                          // and set the new light colors
                                          if (millis() > lastupdate + INTERVAL) {
                                            updateLights();
                                            lastupdate = millis();
                                          } 
                                        }
                                        
                                        // callback function for incoming messages
                                        void incomingMessage(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();
                                          }
                                        
                                          // 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);    
                                          }  
                                        }
                                        
                                        // 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 * 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, (values[i] / 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;
                                        }
                                        
                                        1 Reply Last reply
                                        0
                                        • L Offline
                                          L Offline
                                          LastSamurai
                                          Hardware Contributor
                                          wrote on last edited by
                                          #49

                                          I finally found the mistake (with some help). The pins for the mosfets were switched. I rotatet them and now its working perfectly. Smooth dimming and switching between colors is really cool. New pictures are on my openhardware.io project page.
                                          Now I need to get some more features for the code (linear fading, remembering the values after restarts...) and then perhaps sometime in the future a better (and fixed) version of the pcb.

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


                                          18

                                          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