Separate Values from a String

herbie
Posts: 15
Joined: Sun Jul 01, 2018 9:54 am

Separate Values from a String

Postby herbie » Mon Jul 02, 2018 10:22 am

I use a nodemcu with a tft-display to show "weatherdata" (humidity= 2 digits, airpressure= 4 digits and temperature=3 digits) - I get those three values from my Arduino webserver as one String which contains all three values! What I need to do is to separate the three values and assign each of them to a different variable! This would give me the possibility to locate them in different spots of the display - the whole thing would be more attractive and better readable!! There are lots of string functions in Arduino but my problem is that I don´t know which of them I should use. And - since I never did this before - I honestly don´t know how this is to be done!!
Would it be helpful to post my sketch?
I would really appreciate your help!

Archibald
Posts: 110
Joined: Mon Mar 05, 2018 12:44 am

Re: Separate Values from a String

Postby Archibald » Mon Jul 02, 2018 1:26 pm

If you are certain there are always 2, 4 and 3 characters respectively (even if the temperature is negative for example), simply use the substring function to extract the three readings as strings . . . . .

Code: Select all

String data = "humidity=89, airpressure=1023 and temperature=-05";
  
void setup() {
  Serial.begin(115200);
  Serial.println(data.substring(9,11));
  Serial.println(data.substring(25,29));
  Serial.println(data.substring(46,49));
}
(I'm not sure of the format of your data string)

herbie
Posts: 15
Joined: Sun Jul 01, 2018 9:54 am

Re: Separate Values from a String

Postby herbie » Mon Jul 02, 2018 4:54 pm

Thank you very much for your quick answer - now I´ve got that...and it works!!!!!!!!!!!!!!!!!!!!!! :D :D :D :D
There´s one more question on my mind - is it possible to assign variables to the three substrings? This woud be very important for future designs!!

void tft_show_weatherdata() //(air pressure, temperature, humidity)
{
tft.setTextColor(ILI9340_YELLOW, ILI9340_BLACK );
tft.setTextSize(4);
tft.setCursor(5, 5);
tft.print(weatherdata.substring(0,4));// air pressure
tft.setTextSize(13);
tft.setCursor(5, 80);
tft.print(weatherdata.substring(4,8));// temperature
tft.setTextSize(4);
tft.setCursor(5, 205);
tft.print(weatherdata.substring(8,10));// humidity
}

Archibald
Posts: 110
Joined: Mon Mar 05, 2018 12:44 am

Re: Separate Values from a String

Postby Archibald » Mon Jul 02, 2018 6:01 pm

Use toInt() . . . . , .
String data = "1023-01289";
int h,p,t;

void setup() {
Serial.begin(115200);
p = data.substring(0,4).toInt();
t = data.substring(4,8).toInt();
h = data.substring(8,10).toInt();
Serial.println(p);
Serial.println(t);
Serial.println(h);
}
toFloat() is also available if you need it (reference).

herbie
Posts: 15
Joined: Sun Jul 01, 2018 9:54 am

Re: Separate Values from a String

Postby herbie » Mon Jul 02, 2018 8:38 pm

Thank you again - you´re really kind!! :) :) :)
One last question - let´s say the air pressure drops from 1000 to 998 or so - then this would dislocate the values shown on the display! Is there a possibility to assign a minimum length to each of the three parameters on my webserver so that the stringlength of each value always stays the same !! Here is the part of my webserver where the three parameters "pressure", "temperature" and "humidity" are readout.

Code: Select all

// output in plain text
void printText(EthernetClient client) {
  Serial.println("Textmode");
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/plain; charset=utf-8");
  client.println();
  client.print(pressure,0);
   client.print(temperature,1);
  client.print(humidity,0); 

Archibald
Posts: 110
Joined: Mon Mar 05, 2018 12:44 am

Re: Separate Values from a String

Postby Archibald » Tue Jul 03, 2018 7:52 am

That's why in my first post I wrote "If you are certain there are always 2, 4 and 3 characters respectively" :)

I assume client.print does not put spaces between sucessive values. I therefore suggest you insert commas (or some other character).

In the code below, I make use of the fact that toInt() and toFloat() stops the conversion when it finds an invalid character such as a comma.

Code: Select all

String data="998,-1.2,89";

int humidity, pressure;
float temperature;

int firstComma, secondComma;
  
void setup() {
  Serial.begin(115200);

  pressure = data.toInt();  // will read up to first comma

  firstComma = data.indexOf(",");
  temperature = data.substring(firstComma+1).toFloat();  //will read up to second comma
  
  secondComma = data.indexOf(",",firstComma+1);
  humidity = data.substring(secondComma+1).toInt();   //will read to end of string

  Serial.println(pressure);
  Serial.println(temperature,1);
  Serial.println(humidity);
}
If you cannot insert the commas for some reason, we would have to check if the first chararacter is 9 to determine whether the pressure is 3 digits or 4 digits. Then we would have the find the location (index) of the decimal point to determine the end of the temperature value.

herbie
Posts: 15
Joined: Sun Jul 01, 2018 9:54 am

Re: Separate Values from a String

Postby herbie » Tue Jul 03, 2018 10:25 am

Hello Archibald,

I implemented your code and it works - of course. My webserver now sends "1017,23.8,28".
But there is one strange phenomenon :o
Display.JPG
Display.JPG (1.67 MiB) Viewed 19783 times
The value "humidity" has a strange "frame" now that wasn´t there before.
BTW: Excuse me for all those questions and misunderstandings - I´m good at hardware but I´m relatively new to C :oops: :oops: :oops:

Code: Select all

void tft_show_weatherdata() //(air pressure, temperature, humidity)
{

pressure = weatherdata.toInt();  // will read up to first comma

  firstComma = weatherdata.indexOf(",");
  temperature = weatherdata.substring(firstComma+1).toFloat();  //will read up to second comma
 
  secondComma = weatherdata.indexOf(",",firstComma+1);
  humidity = weatherdata.substring(secondComma+1).toInt();   //will read to end of string

  Serial.println(pressure);
  Serial.println(temperature,1);
  Serial.println(humidity);
  
tft.setTextColor(ILI9340_YELLOW, ILI9340_BLACK );
  tft.setTextSize(4);
   tft.setCursor(5, 5);
tft.print(pressure);
//tft.print(weatherdata.substring(0,4));// air pressure
 tft.setTextSize(13);
tft.setCursor(5, 80);
tft.print(temperature);
//tft.print(weatherdata.substring(4,8));// temperature
tft.setTextSize(4);
tft.setCursor(5, 205);
tft.print(humidity);
//tft.print(weatherdata.substring(8,10));// humidity
}

Archibald
Posts: 110
Joined: Mon Mar 05, 2018 12:44 am

Re: Separate Values from a String

Postby Archibald » Tue Jul 03, 2018 10:56 am

I think you included an out of date version of your code; otherwise I would have expected a comma or two to show up on the display!

Because the number of characters representing each value can vary, you need to print the integer and float values to the display, not the substrings. Also, because the number of characters varies and the width of characters varies, I would expect you to have to clear an area of display before printing each new value to the display.

Regarding the 'framing', sorry I don't know anything about that display and its library. It may be best to start a new forum thread for that.

By the way: "hpa" should be "hPa" .

You can delete the console Serial.print statements (unless you want them for debugging).

herbie
Posts: 15
Joined: Sun Jul 01, 2018 9:54 am

Re: Separate Values from a String

Postby herbie » Tue Jul 03, 2018 11:38 am

Thanks again for all you did for me - and of course I´ve changed "hpa" to "hPa" :D :D :D
BTW: I do print the integer and float values to the display - the old "substring-code" is commented out!

Code: Select all

//tft.print(weatherdata.substring(0,4));// air pressure
all the best!!!!!!!

Peter

herbie
Posts: 15
Joined: Sun Jul 01, 2018 9:54 am

Re: Separate Values from a String

Postby herbie » Tue Jul 03, 2018 12:49 pm

UPDATE!!!!!

When I declare "int temperature" instead of "float temperature" the phenomenon does not appear - see picture!!!
Attachments
Display.JPG
Display.JPG (110.45 KiB) Viewed 19767 times

Who is online

Users browsing this forum: No registered users and 141 guests