@syntacrsc @TimO My system just upgraded and killed all of mySensors, which is probably half of my system... so I would be in for $50 at least
Posts made by gundark2
-
RE: OH3 - MySensors Binding
-
RE: Arduino Mega RGBW sketch lock-ups
@mfalkvidd I was afraid someone would say something about this avenue of debugging. I was "smart" enough to put all of the connections up high where I can't reach... I guess a next step could be to order a longer usb cable for the mega.
@skywatch Seeing your post here makes me remember when I tried to add a watchdog timer which didn't seem to work... But I thought that the problem persisting meant the watchdog wasn't working... but maybe there is something going on with this radio causing it to misbehave for a period of time...
-
Arduino Mega RGBW sketch lock-ups
Hi everyone,
I have this current node controlling the lights and TV in my bedroom that works great, only problem is that on occasion it locks up for a period of time I cant identify, but its somewhere north of 30 minutes. If I just wait it will eventually go back to working, or I can pull the power, wait, plug it back in and it goes back to working. It doesn't happen at the same time of day, no real pattern that I can find. I can deal but it doesn't really pass the wife test as she can't reach it Anyone have any suggestions? (Also I'll take other optimizations if anyone has any, it's been running for 3 years on the current sketch)
/** Based on the MySensors Project: http://www.mysensors.org This sketch controls a (analog)RGBW strip by listening to new color values from a (OpenHab2) controller and then fading to the new color. Version 2.0 - Updated to MySensors 2 and changed fading Version 1.0 - Changed pins and gw definition Version 0.9 - Oliver Hilsky **/ #define SN "RGBW and TV" #define SV "v3.0 09112019" // library settings #define MY_RADIO_NRF24 #define MY_NODE_ID 22 #define MY_DEBUG // Enables debug messages in the serial log #define MY_RF24_CE_PIN 49 //atmega 2560 code #define MY_RF24_CS_PIN 53 //atmega 2560 code #define MY_RF24_PA_LEVEL RF24_PA_HIGH #include <SPI.h> #include <MySensors.h> #define RELAY_1 30 // Arduino Digital I/O pin number for first relay (second on pin+1 etc) #define NUMBER_OF_RELAYS 1 // Total number of attached relays #define RELAY_ON 1 // GPIO value to write to turn on attached relay #define RELAY_OFF 0 // GPIO value to write to turn off attached relay #define SENSOR_ID 10 //RGBW Sensor ID // Arduino pin attached to driver pins #define RED_PIN 6 #define WHITE_PIN 8 #define GREEN_PIN 5 #define BLUE_PIN 7 #define NUM_CHANNELS 4 // how many channels, RGBW=4 RGB=3... // Smooth stepping between the values #define STEP 1 #define INTERVAL 10 // 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}; boolean isOn = true; // tracks if the strip should be on of off // time tracking for updates unsigned long lastupdate = millis(); void before() { for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) { // Then set relay pins in output mode pinMode(pin, OUTPUT); // Set relay to last known state (using eeprom storage) digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF); } // Set all channels to output (pin number, type) for (int i = 0; i < NUM_CHANNELS; i++) { pinMode(channels[i], OUTPUT); } } void presentation() { // Present sketch (name, version) sendSketchInfo(SN, SV); for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) { // Register all sensors to gw (they will be created as child devices) present(sensor, S_BINARY); } // Register sensors (id, type, description, ack back) present(SENSOR_ID, S_RGBW_LIGHT, SN, true); } void setup() { request(SENSOR_ID, V_RGBW); // get old values if this is just a restart updateLights(); // init lights Serial.println("Waiting for messages..."); } void loop() { // 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"); } // on / off message else if (message.type == V_STATUS) { if(message.sensor == SENSOR_ID) { Serial.print("Turning light "); isOn = message.getInt(); if (isOn) { Serial.println("on"); } else { Serial.println("off"); } }else { digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF); // Store state in eeprom saveState(message.sensor, message.getBool()); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } } // 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() { // for each color for (int v = 0; v < NUM_CHANNELS; v++) { if (values[v] < target_values[v]) { //Serial.print("V+: "); //Serial.print(v); //Serial.print(" value/target value: "); //Serial.print(values[v]); //Serial.println(target_values[v]); values[v] += STEP; if (values[v] > target_values[v]) { values[v] = target_values[v]; } } if (values[v] > target_values[v]) { //Serial.print("V-: "); //Serial.print(v); //Serial.print(" value/target value: "); //Serial.print(values[v]); //Serial.println(target_values[v]); values[v] -= STEP; if (values[v] < target_values[v]) { values[v] = target_values[v]; } } } // set actual pin values for (int i = 0; i < NUM_CHANNELS; i++) { if (isOn) { analogWrite(channels[i], values[i]); } 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) == 8) { Serial.println("new rgbw value"); target_values[0] = fromhex (& input [0]); // ignore # as first sign target_values[1] = fromhex (& input [2]); target_values[2] = fromhex (& input [4]); target_values[3] = fromhex (& input [6]); } 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(", "); } } // 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; }```
-
RE: Occasional MySensors network drop outs
As an informational, I have a regular computer (Intel core 2 duo) with a serial gateway (I have had many different iterations) this one has the NRF24L01+ PA/LNA. I am using openhab2 to control. I have tried changing everything, radios cables, location. Most of the time the system just works perfectly. On occasion and I can't find a pattern it just locks up for like you said about 5 minutes. If I wait for a bit and try again everything goes back to working. Most of the time it seems as though my rules (automation) happens without a hitch, however if a rule is triggered while the system is locked up then for example my TV doesn't turn off at 10 like it should and I wake up a 3 with the tv still on, or the wife can't control her closet led strip. I have mostly considered this just one of those things to live with, until I make the wife mad enough and just move over to zwave for anything critical. In a weird way glad to see that its not just me having this issue. My issue seems to be exactly as you describe, other than I know that when I try to send commands I just get noack's to everything I send out while the "issue" is going on. Either rebooting everything or just waiting solves the issue.
-
RE: Mega 2560 RGBW PWM problem
Thanks for the response, I forgot to mention that was one of the things i tried. Still only strait on or off.
void loop { analogWrite(8, 0); delay(3000); analogWrite(8, 127); delay(3000); analogWrite(8, 255); delay(3000); }
This code gives me approx 6 seconds of OFF and 3 of ON.
I have to think something is wrong with the TIMERS, though at least some of them have to be working because the radio works just fine, openhab and all its functions work.... unless I misunderstand I thought the radio uses PWM for some of the pins.
-
RE: Mega 2560 RGBW PWM problem
So, further information, using this code:
void setup() { pinMode (8, OUTPUT); pinMode (7, OUTPUT); pinMode (6, OUTPUT); pinMode (5, OUTPUT); digitalWrite(8, LOW); digitalWrite(7, LOW); digitalWrite(6, LOW); digitalWrite(5, LOW); } void loop() { digitalWrite(7, HIGH); delayMicroseconds(100); digitalWrite(7, LOW); delayMicroseconds(3000); }
I can change these numbers up and verify that the hardware works just fine... somebody has to point out some completely noob thing I must be doing.
-
Mega 2560 RGBW PWM problem
This is my first time working with a mega, I have been doing lots of tinkering and cant get a mosfet (have tried several, all produce the same results) to be controled with PWM. (I have seen the fade work though I cant figure out why in that instance it worked, and I haven't been able to duplicate it)
Im using the circuit on the mysensors page, with the obvious changes that this is a Mega and I have 4 led "channels" instead of one.
Using my meter and analogWrite I can only get 0v or 5v, which is how my led strip reacts, on or off, no levels. Any value 0-99 produces 0v with 100 giving 5v.
#define MY_DEBUG #define MY_RADIO_NRF24 #define MY_NODE_ID 22 #define SN "Dimmable RGBW Led strip" #define SV "v1.0" #define MY_RF24_CE_PIN 49 //atmega 2560 code #define MY_RF24_CS_PIN 53 //atmega 3560 code #include <MySensors.h> #include <SPI.h> // Arduino pin attached to MOSFET Gate pin #define LED_RED_PIN 6 #define LED_GREEN_PIN 5 #define LED_BLUE_PIN 7 #define LED_WHITE_PIN 8 // CHILD ID's #define CHILD_ID_RED 1 #define CHILD_ID_GREEN 2 #define CHILD_ID_BLUE 3 #define CHILD_ID_WHITE 4 // Bunch of dimmer values #define FADE_DELAY 10 // MS delay, IE how long in between each dim step. int RequestedColor = 0; // Variable for incoming message color static int16_t currentLevelWhite = 0; // Current dim level... static int16_t currentLevelRed = 0; static int16_t currentLevelGreen = 0; static int16_t currentLevelBlue = 0; // Define message name and type to send sensor info MyMessage RedStatus(CHILD_ID_RED, V_DIMMER); MyMessage GreenStatus(CHILD_ID_GREEN, V_DIMMER); MyMessage BlueStatus(CHILD_ID_BLUE, V_DIMMER); MyMessage WhiteStatus(CHILD_ID_WHITE, V_DIMMER); void setup() { request( CHILD_ID_RED, V_DIMMER ); request( CHILD_ID_GREEN, V_DIMMER ); request( CHILD_ID_BLUE, V_DIMMER ); request( CHILD_ID_WHITE, V_DIMMER ); } void presentation() { present( CHILD_ID_RED, V_DIMMER ); present( CHILD_ID_GREEN, V_DIMMER ); present( CHILD_ID_BLUE, V_DIMMER ); present( CHILD_ID_WHITE, V_DIMMER ); sendSketchInfo(SN, SV); } void loop() { } void receive(const MyMessage &message) { if (message.type == V_LIGHT || message.type == V_DIMMER) { Serial.print("Which sensor did we get a message for? : "); Serial.println(message.sensor); RequestedColor = (message.sensor); // Retrieve the power or dim level from the incoming request message int requestedLevel = atoi( message.data ); // Adjust incoming level if this is a V_LIGHT variable update [0 == off, 1 == on] requestedLevel *= ( message.type == V_LIGHT ? 100 : 1 ); // Clip incoming level to valid range of 0 to 100 requestedLevel = requestedLevel > 100 ? 100 : requestedLevel; requestedLevel = requestedLevel < 0 ? 0 : requestedLevel; if(RequestedColor == CHILD_ID_WHITE) { Serial.print( "Changing White level to " ); Serial.print( requestedLevel ); Serial.print( ", from " ); Serial.println( currentLevelWhite ); fadeToLevelWhite( requestedLevel ); }else if(RequestedColor == CHILD_ID_RED) { Serial.print( "Changing Red level to " ); Serial.print( requestedLevel ); Serial.print( ", from " ); Serial.println( currentLevelRed ); fadeToLevelRed( requestedLevel ); }else if(RequestedColor == CHILD_ID_GREEN) { Serial.print( "Changing Green level to " ); Serial.print( requestedLevel ); Serial.print( ", from " ); Serial.println( currentLevelGreen ); fadeToLevelGreen( requestedLevel ); }else if(RequestedColor == CHILD_ID_BLUE) { Serial.print( "Changing Blue level to " ); Serial.print( requestedLevel ); Serial.print( ", from " ); Serial.println( currentLevelBlue ); fadeToLevelBlue( requestedLevel ); } // Inform the gateway of the current DimmableLED's SwitchPower1 and LoadLevelStatus value... // send(lightMsg.set(currentLevel > 0)); // hek comment: Is this really nessesary? // send( dimmerMsg.set(currentLevel) ); } } /*** * This method provides a graceful fade up/down effect */ void fadeToLevelRed( int toLevel ) { int delta = ( toLevel - currentLevelRed ) < 0 ? -1 : 1; while ( currentLevelRed != toLevel ) { currentLevelRed += delta; analogWrite( LED_RED_PIN, (int)(currentLevelRed / 100. * 255) ); Serial.println(currentLevelRed); delay( FADE_DELAY ); } } void fadeToLevelGreen( int toLevel ) { int delta = ( toLevel - currentLevelGreen ) < 0 ? -1 : 1; while ( currentLevelGreen != toLevel ) { currentLevelGreen += delta; analogWrite( LED_GREEN_PIN, (int)(currentLevelGreen / 100. * 255) ); delay( FADE_DELAY ); } } void fadeToLevelBlue( int toLevel ) { int delta = ( toLevel - currentLevelBlue ) < 0 ? -1 : 1; while ( currentLevelBlue != toLevel ) { currentLevelBlue += delta; analogWrite( LED_BLUE_PIN, (int)(currentLevelBlue / 100. * 255) ); delay( FADE_DELAY ); } } void fadeToLevelWhite( int toLevel ) { int delta = ( toLevel - currentLevelWhite ) < 0 ? -1 : 1; while ( currentLevelWhite != toLevel ) { currentLevelWhite += delta; analogWrite( LED_WHITE_PIN, (int)(currentLevelWhite / 100. * 255) ); delay( FADE_DELAY ); } }
I have this same code working on a pro mini, with the exception of no white as it doesn't have enough PWM pins, hence going to the Mega.
Any help is greatly apreciated,
Sean -
RE: dht22 with relay irregular measurement and operation
So I'm new to all this, however anytime I get funky things going on when I have multiple sensors on a node I found that introducing a delay in between the readings helped smooth things out. Hopefully someone will correct me if I'm wrong, but I have had some luck with delays. Also I built one to control my hot tub and I found noise from the pump messed things up, de-coupling capacitors became my friend after that.
-
MySensors Fancy porchlight
So Im building a porch light using some ws2812b's. I am connecting it to openhab so I can do all kinds of fun things based on the time of year, football games and such.
I would like to see if anyone can see in my code, sense I am a beginner, ways to clean it up as what I have already takes up 86% and I would like it to do a few more things. I would really like any feedback, including other things to do with it.#include <Adafruit_GFX.h> #include <Adafruit_NeoMatrix.h> #include <Adafruit_NeoPixel.h> #include "RGB.h" #include <SPI.h> #define MY_NODE_ID 16 #define MY_RADIO_NRF24 #define MY_DEBUG #define MY_REPEATER_FEATURE #include <MySensors.h> #include <MyConfig.h> #define PIN 5 #define CHILD_ID_LED 1 #define CHILD_ID_C1 2 #define CHILD_ID_C2 3 #define CHILD_ID_C3 4 #define CHILD_ID_C4 5 #define CHILD_ID_C5 6 #define CHILD_ID_C6 7 // NEO_MATRIX_TOP, NEO_MATRIX_BOTTOM, NEO_MATRIX_LEFT, NEO_MATRIX_RIGHT: // Position of the FIRST LED in the matrix; pick two, e.g. // NEO_MATRIX_TOP + NEO_MATRIX_LEFT for the top-left corner. // NEO_MATRIX_ROWS, NEO_MATRIX_COLUMNS: LEDs are arranged in horizontal // rows or in vertical columns, respectively; pick one or the other. // NEO_MATRIX_PROGRESSIVE, NEO_MATRIX_ZIGZAG: all rows/columns proceed // in the same order, or alternate lines reverse direction; pick one. // See example below for these values in action. Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(8, 10, 1, 1, PIN, NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ800); const uint16_t colors[] = { matrix.Color(orange.r, orange.g, orange.b), matrix.Color(blue.r, blue.g, blue.b) }; int x = matrix.width(); int pass = 0; int LEDMODE = 0; RGB Color1 = seanwhite; RGB Color2 = {20,20,20}; RGB Color3 = {20,20,20}; RGB Color4 = {20,20,20}; RGB Color5 = {20,20,20}; RGB Color6 = {20,20,20}; void setup() { Serial.begin(115200); matrix.begin(); matrix.setTextWrap(false); matrix.setBrightness(100); } void presentation() { sendSketchInfo("Porchlight", ".9"); present(CHILD_ID_LED, S_CUSTOM); present(CHILD_ID_C1, S_INFO); present(CHILD_ID_C2, S_INFO); present(CHILD_ID_C3, S_INFO); present(CHILD_ID_C4, S_INFO); present(CHILD_ID_C5, S_INFO); present(CHILD_ID_C6, S_INFO); } void loop() { if(LEDMODE == 0) { matrix.fillScreen(matrix.Color(Color1.r, Color1.g, Color1.b)); matrix.show(); } if(LEDMODE == 1) { if(++pass >= 2) pass = 0; if(pass == 0) colorWipe(orange, 10); if(pass == 1) colorWipe(blue, 10); matrix.show(); String twitterHandle = "B R O N C O S"; scrollText(twitterHandle); delay(100); } if(LEDMODE == 2) { // You can put this code in loop() int r; int c; r = random(10); c = random(8); fadePixel(c, r, Color1, Color2, 140, 0); matrix.show(); } if(LEDMODE == 3) { matrix.fillScreen(matrix.Color(Color1.r, Color1.g, Color1.b)); colorWipe(Color2, 100); } if(LEDMODE == 4) { colorWipe(red, 30); colorWipe(orange, 30); colorWipe(yellow, 30); colorWipe(green,30); colorWipe(blue, 30); colorWipe(purple, 30); } if(LEDMODE == 5) { crossFade(orange, blue, 50, 10); crossFade(blue, orange, 50, 10); } if(LEDMODE == 6) { colorWipe(seanwhite,10); drawLogo(); } if(LEDMODE == 7) { colorWipe(off, 10); } } // Fill the pixels one after the other with a color void colorWipe(RGB color, uint8_t wait) { for(uint16_t row=0; row < 10; row++) { for(uint16_t column=0; column < 8; column++) { matrix.drawPixel(column, row, matrix.Color(color.r, color.g, color.b)); matrix.show(); delay(wait); } } } // Crossfade entire screen from startColor to endColor void crossFade(RGB startColor, RGB endColor, int steps, int wait) { for(int i = 0; i <= steps; i++) { int newR = startColor.r + (endColor.r - startColor.r) * i / steps; int newG = startColor.g + (endColor.g - startColor.g) * i / steps; int newB = startColor.b + (endColor.b - startColor.b) * i / steps; matrix.fillScreen(matrix.Color(newR, newG, newB)); matrix.show(); delay(wait); } } void drawLogo() { // This 8x8 array represents the LED matrix pixels. // A value of 1 means we’ll fade the pixel to white int logo[10][8] = { {0, 0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 1, 0, 0}, {0, 1, 1, 0, 1, 1, 0, 0}, {0, 1, 0, 1, 0, 1, 0, 0}, {0, 1, 0, 1, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, }; for(int row = 0; row < 10; row++) { for(int column = 0; column < 8; column++) { if(logo[row][column] == 1) { fadePixel(column, row, purple, white, 120, 0); } } } } // Fade pixel (x, y) from startColor to endColor void fadePixel(int x, int y, RGB startColor, RGB endColor, int steps, int wait) { for(int i = 0; i <= steps; i++) { int newR = startColor.r + (endColor.r - startColor.r) * i / steps; int newG = startColor.g + (endColor.g - startColor.g) * i / steps; int newB = startColor.b + (endColor.b - startColor.b) * i / steps; matrix.drawPixel(x, y, matrix.Color(newR, newG, newB)); matrix.show(); delay(wait); } } void scrollText(String textToDisplay) { int x = matrix.width(); // Account for 6 pixel wide characters plus a space int pixelsInText = textToDisplay.length() * 7; matrix.setCursor(x, 0); matrix.print(textToDisplay); matrix.show(); while(x > (matrix.width() - pixelsInText)) { matrix.fillScreen(colors[pass]); matrix.setCursor(--x, 1); matrix.print(textToDisplay); matrix.show(); delay(75); } } void receive(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.type == V_CUSTOM) { Serial.println( "Porchlight mode recieved..." ); int porchvalue= atoi( message.data ); if ((porchvalue<0)||(porchvalue>7)) { Serial.print(porchvalue); Serial.println( " is not a defined value." ); return; } else { LEDMODE = porchvalue; } } if (message.type == V_TEXT) { Serial.println( "New message V_TEXT type recieved..."); Serial.print("Message: "); Serial.print(message.sensor); Serial.print(", Message: "); Serial.println(message.getString()); String input = message.getString(); Serial.println(input); int commaIndex = input.indexOf(','); // Search for the next comma just after the first int secondCommaIndex = input.indexOf(',', commaIndex+1); String firstValue = input.substring(0, commaIndex); String secondValue = input.substring(commaIndex+1, secondCommaIndex); String thirdValue = input.substring(secondCommaIndex+1); // To the end of the string int firstValueI = firstValue.toInt(); int secondValueI = secondValue.toInt(); int thirdValueI = thirdValue.toInt(); if (message.sensor == 2) { Color1 = (RGB){firstValueI,secondValueI,thirdValueI}; Serial.print("Color1 updated: "); Serial.print(Color1.r); Serial.print(" "); Serial.print(Color1.g); Serial.print(" "); Serial.println(Color1.b); } if (message.sensor == 3) { Color2 = (RGB){firstValueI,secondValueI,thirdValueI}; Serial.print("Color2 updated: "); Serial.print(Color2.r); Serial.print(" "); Serial.print(Color2.g); Serial.print(" "); Serial.println(Color2.b); } if (message.sensor == 4) { Color3 = (RGB){firstValueI,secondValueI,thirdValueI}; Serial.print("Color3 updated: "); Serial.print(Color3.r); Serial.print(" "); Serial.print(Color3.g); Serial.print(" "); Serial.println(Color3.b); } if (message.sensor == 5) { Color4 = (RGB){firstValueI,secondValueI,thirdValueI}; Serial.print("Color4 updated: "); Serial.print(Color4.r); Serial.print(" "); Serial.print(Color4.g); Serial.print(" "); Serial.println(Color4.b); } if (message.sensor == 6) { Color5 = (RGB){firstValueI,secondValueI,thirdValueI}; Serial.print("Color5 updated: "); Serial.print(Color5.r); Serial.print(" "); Serial.print(Color5.g); Serial.print(" "); Serial.println(Color5.b); } if (message.sensor == 7) { Color6 = (RGB){firstValueI,secondValueI,thirdValueI}; Serial.print("Color6 updated: "); Serial.print(Color6.r); Serial.print(" "); Serial.print(Color6.g); Serial.print(" "); Serial.println(Color6.b); } } }