Strange behaviour on splitting char array and converting the chunks to int
In this piece of code you have a strange mix of upper bounds:

  for(int i=0;i&lt;3;i++){
    _red[i]=control[i+offset];
  }
  offset=4;
  for(int i=0;i&lt;sizeof(green);i++){
    _green[i]=control[i+offset];
  }
 // strncpy(_green,control+offset,3); // same result
 offset=7;
 for(int i=0;i&lt;sizeof(_blue);i++){
   _blue[i]=control[i+offset];
 }
 offset=10;
 for(int i=0;i&lt;sizeof(_white);i++){
   _white[i]=control[i+offset];
 }
 offset=13;
 for(int i=0;i&lt;sizeof(_brightness);i++){
   _brightness[i]=control[i+offset];
 }


The first looks correct at 3.  The second loop has an upper bound of sizeof(int) which is 2.  The third loop seems to be sizeof(char) which is 1.

Unfortunately non of those values match up with the results you are getting.  What I would try is refactoring whats inside you function to this.

int Convert (char* buffer, char const* control, const int&amp; offset, char const* name)
{
    int value = 0;
    for (index = offset; index &lt; offset; ++index)
    {
        buffer[index-offset] = control[index];
    }
    buffer[4] = '\0';
    atoi(buffer);
    Serial.print(name);
    Serial.print(" = ");
    Serial.print(buffer);
    Serial.print("  Value = ");
    Serial.println(value);
    return value;
}


And then call it to populate your values:

void changeColor(char control[16])
{
    char buffer[4]; // You can reuse this buffer, unless you wanted to have separate ones.
    const int red    = Convert (buffer, control, 1, "red");
    const int green  = Convert (buffer, control, 4, "green");
    const int blue   = Convert (buffer, control, 7, "blue");
    const int white  = Convert (buffer, control, 4, "white");
    const int bright = Convert (buffer, control, 4, "bright");
}