Invalid operands of types 'const char*' and 'const char [2]'

I have modified the Serial example to fit my needs. I am trying to combine multiple integers and strings. It is giving me an error.

My Sketch:

int pushButton = 2;
int buttonStatePrevious = 0;
char OUTPUTserial;
int OUTPUTserial_temp;
int OUTPUTserial_hum;
int OUTPUTserial_press;
int OUTPUTserial_wd;
int OUTPUTserial_ws;
int OUTPUTserial_light;

void setup() {
  Serial.begin(9600);
  pinMode(pushButton, INPUT);
}

void loop() {
  int buttonState = digitalRead(pushButton);
  if (buttonState == 1 || buttonState == 0) {
    if (buttonState != buttonStatePrevious) {
      // KEY: TEMP-HUM-PRES-WD-WS-LIGHT
      OUTPUTserial_temp = buttonState;
      OUTPUTserial_hum = buttonState;
      OUTPUTserial_press = buttonState;
      OUTPUTserial_wd = buttonState;
      OUTPUTserial_ws = buttonState;
      OUTPUTserial_light = buttonState;
      
      OUTPUTserial = OUTPUTserial_temp + ":" + OUTPUTserial_hum + ":" + OUTPUTserial_press + ":" + OUTPUTserial_wd + ":" + OUTPUTserial_ws + ":" + OUTPUTserial_light;
      Serial.print(OUTPUTserial + "\n");
    }
  }
  buttonStatePrevious = buttonState;
  delay(1);
}

Errors:

DigitalReadSerial_Button_OnChange.ino: In function 'void loop()':
DigitalReadSerial_Button_OnChange:42: error: invalid operands of types 'const char*' and 'const char [2]' to binary 'operator+'

Thanks!

Arduino Meage 2560
Windows 8 Pro 32-bit
Arduino IDE 1.0.5

char OUTPUTserial;

This will hold ONE character.

      OUTPUTserial = OUTPUTserial_temp + ":" + OUTPUTserial_hum + ":" + OUTPUTserial_press + ":" + OUTPUTserial_wd + ":" + OUTPUTserial_ws + ":" + OUTPUTserial_light;

This assumes several things about C/C++ that are not true. It assumes, as has been mentioned that + is a concatenation operator. It is not. It also assumes that you can store a bunch of values in a char variable. You can't. Finally, it assumes that int to string conversion is automatic. In your dreams.

      OUTPUTserial_temp = buttonState;
      OUTPUTserial_hum = buttonState;
      OUTPUTserial_press = buttonState;
      OUTPUTserial_wd = buttonState;
      OUTPUTserial_ws = buttonState;
      OUTPUTserial_light = buttonState;

6 copies of the same value. How useless is that?

First off, the useless repetition of variables is just for testing. When I get my array climate sensors, they will all be different. For now, I am just using a button.

Also, I am very new to C++. I am very JavaScript oriented. Now that I understand that a 'char' is not just a string, please help me out. You can see that I am trying to create a variable with all of the 'OUTPUTserial' values separated by colons.

I looked at sprintf on cplusplus.com and eventually found printf (sprintf has the same syntax). What's the difference between signed and unsigned?

Here is my updated code. I changed some variables to floats because in the future they will have decimal places.

int pushButton = 2;
int buttonStatePrevious = 0;
char OUTPUTserial[ ] = "";
float OUTPUTserial_temp;
float OUTPUTserial_hum;
float OUTPUTserial_press;
float OUTPUTserial_wd;
float OUTPUTserial_ws;
float OUTPUTserial_light;

void setup() {
  Serial.begin(9600);
  pinMode(pushButton, INPUT);
}

void loop() {
  int buttonState = digitalRead(pushButton);
  if (buttonState == 1 || buttonState == 0) {
    if (buttonState != buttonStatePrevious) {
      // KEY: TEMP-HUM-PRES-WD-WS-LIGHT
      OUTPUTserial_temp = buttonState;
      OUTPUTserial_hum = buttonState;
      OUTPUTserial_press = buttonState;
      OUTPUTserial_wd = buttonState;
      OUTPUTserial_ws = buttonState;
      OUTPUTserial_light = buttonState;
      
      
      OUTPUTserial = sprintf ("%f:%f:%f:%f:%f:%f\n", OUTPUTserial_temp, OUTPUTserial_hum, OUTPUTserial_press, OUTPUTserial_wd, OUTPUTserial_ws, OUTPUTserial_light);
      Serial.print(OUTPUTserial);
    }
  }
  buttonStatePrevious = buttonState;
  delay(1);
}

The new error:

DigitalReadSerial_Button_OnChange.ino: In function 'void loop()':
DigitalReadSerial_Button_OnChange:43: error: cannot convert 'float' to 'const char*' for argument '2' to 'int sprintf(char*, const char*, ...)'

Thanks!

What's the difference between signed and unsigned ?

A 1-byte unsigned integer value ranges from 0 to 255
A 1-byte signed integer value ranges from -128 to +127

The same principle applies to 2-byte and 4-byte signed and unsigned integer types

Aha! Thanks.

So why am I getting an error converting the float to sprintf? Isn't that what it's supposed to do in this case?

sprintf() populates an array, based on the format specifiers and the arguments defined. The first argument is the char array to populate, NOT the format specifier string.

And, on the Arduino, the %f format specifier (for floats and doubles) is not supported. You need to use dtostrf().

Thanks so much for your help!

A little Google searching revealed that dtostrf() wouldn't work well. I found this: software - software - Arduino Sketch Compile Error: Trying to Concatenate Float with String - Electrical Engineering Stack Exchange

This code now works perfectly:

int pushButton = 2;
int buttonStatePrevious = 0;

String OUTPUTserial;
float serial_temp;
float serial_hum;
float serial_press;
float serial_wd;
float serial_ws;
float serial_light;

char CHARserial_temp[10];
char CHARserial_hum[10];
char CHARserial_press[10];
char CHARserial_wd[10];
char CHARserial_ws[10];
char CHARserial_light[10];

String OUTPUTserial_temp;
String OUTPUTserial_hum;
String OUTPUTserial_press;
String OUTPUTserial_wd;
String OUTPUTserial_ws;
String OUTPUTserial_light;

void setup() {
  Serial.begin(9600);
  pinMode(pushButton, INPUT);
}

void loop() {
  int buttonState = digitalRead(pushButton);
  if (buttonState == 1 || buttonState == 0) {
    if (buttonState != buttonStatePrevious) {
      // KEY: TEMP-HUM-PRES-WD-WS-LIGHT
      serial_temp = buttonState;
      serial_hum = buttonState;
      serial_press = buttonState;
      serial_wd = buttonState;
      serial_ws = buttonState;
      serial_light = buttonState;
      
      dtostrf(serial_temp,1,2,CHARserial_temp);
      OUTPUTserial_temp = String(CHARserial_temp);
      
      dtostrf(serial_hum,1,2,CHARserial_hum);
      OUTPUTserial_hum = String(CHARserial_hum);
      
      dtostrf(serial_press,1,2,CHARserial_press);
      OUTPUTserial_press = String(CHARserial_press);
      
      dtostrf(serial_wd,1,2,CHARserial_wd);
      OUTPUTserial_wd = String(CHARserial_wd);
      
      dtostrf(serial_ws,1,2,CHARserial_ws);
      OUTPUTserial_ws = String(CHARserial_ws);
      
      dtostrf(serial_light,1,2,CHARserial_light);
      OUTPUTserial_light = String(CHARserial_light);
      
      //OUTPUTserial = dtostrf(OUTPUTserial_temp,colon,OUTPUTserial_hum,colon,OUTPUTserial_press,colon,OUTPUTserial_wd,colon,OUTPUTserial_ws,colon,OUTPUTserial_light);
      //OUTPUTserial = sprintf ("%s:%s:%s:%s:%s:%s\n", OUTPUTserial_temp, OUTPUTserial_hum, OUTPUTserial_press, OUTPUTserial_wd, OUTPUTserial_ws, OUTPUTserial_light);
      OUTPUTserial = OUTPUTserial_temp + ":" + OUTPUTserial_hum + ":" + OUTPUTserial_press + ":" + OUTPUTserial_wd + ":" + OUTPUTserial_ws + ":" + OUTPUTserial_light;
      Serial.print(OUTPUTserial + "\n");
    }
  }
  buttonStatePrevious = buttonState;
  delay(1);
}

Thanks again for helping me!

A little Google searching revealed that dtostrf() wouldn't work well.

But, you are using it anyway. OK.

Combining all the data into one string or String does not cause the data to be sent faster or even buffered faster. All that you are doing is wasting memory. Using 11 Serial.print() statements, instead, means no calls to dtosrtf() (Serial.print() knows how to print a float), no unnecessary char arrays, and no useless wrapping the char array in a String, duplicating the data.

OK, I see what you mean.

Here's the new code. I know I can combine some of the prints but it makes the code easier to read. So, I will only combine them if necessary.

int pushButton = 2;
int buttonStatePrevious = 0;

//String OUTPUTserial;
float serial_temp;
float serial_hum;
float serial_press;
float serial_wd;
float serial_ws;
float serial_light;

void setup() {
  Serial.begin(115200);
  pinMode(pushButton, INPUT);
}

void loop() {
  int buttonState = digitalRead(pushButton);
  if (buttonState == 1 || buttonState == 0) {
    if (buttonState != buttonStatePrevious) {
      // KEY: TEMP-HUM-PRES-WD-WS-LIGHT
      serial_temp = buttonState;
      serial_hum = buttonState;
      serial_press = buttonState;
      serial_wd = buttonState;
      serial_ws = buttonState;
      serial_light = buttonState;
      
      Serial.print("{ \"data\": {");
        Serial.print("\"temp\":\"");
        Serial.print(serial_temp);
        Serial.print("\", ");
        
        Serial.print("\"hum\":\"");
        Serial.print(serial_hum);
        Serial.print("\", ");
        
        Serial.print("\"press\":\"");
        Serial.print(serial_press);
        Serial.print("\", ");
        
        Serial.print("\"wd\":\"");
        Serial.print(serial_wd);
        Serial.print("\", ");
        
        Serial.print("\"ws\":\"");
        Serial.print(serial_ws);
        Serial.print("\", ");
        
        Serial.print("\"light\":\"");
        Serial.print(serial_light);
        Serial.print("\"");
      Serial.print("} }");
      
      Serial.print("\n");
    }
  }
  buttonStatePrevious = buttonState;
  delay(1);
}

Thanks! I think this is complete.

I know I can combine some of the prints but it makes the code easier to read. So, I will only combine them if necessary.

It is not necessary, and readable code is a good thing.

It would be interesting to know what the sketch size was with the last code and with the code before what, and how much SRAM was used in each case.