💬 OH MySensors RGBW Controller
-
Great, just one stupid question. Do I just upload the gbl file to dirtypcbs/oshpark or how does it work?
-
Great, just one stupid question. Do I just upload the gbl file to dirtypcbs/oshpark or how does it work?
@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/3dpcbEdit: 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)
-
What is the correct pitch for the screw terminals? 2.54mm? 5mm ? or other?
-
What is the correct pitch for the screw terminals? 2.54mm? 5mm ? or other?
@Cliff-Karlsson It should be 5 mm
-
I had the same problem with dirtypcbs so I ordered from seedstudio instead. Almost the same price.
-
Oh thats just a naming issue. Rename the "RGBWController-Edge.cuts.gm1" to .gml in the zip file and it should work just fine.
-
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 ;-)
-
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. :)
-
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. :)
@Jan-Gatzke
Hi can you please post your adjusted sketch for further reference? -
@Jan-Gatzke
Hi can you please post your adjusted sketch for further reference?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.
-
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.
@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. -
@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! -
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 -
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
PeerThe node always starts with white on. This is normal behaviour.
-
The node always starts with white on. This is normal behaviour.
@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 -
@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 HoekGreat.Can you post the complete 2.0 sketch, please? I am going to upgrade and this would be a good starting point.
-
Great.Can you post the complete 2.0 sketch, please? I am going to upgrade and this would be a good starting point.
@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; }``` -
@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; }```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.