Keaner
November 30, 2016, 10:34pm
1
I am trying to grab a part of data from my other photon to display on a led connected to another photon.
This code works
void myHandler(const char *event, const char *data)
{
i++;
Serial.print(i);
Serial.print(event);
Serial.print(", data: ");
if (data)
Serial.println(data);
else
Serial.println("NULL");
}
void setup()
{
Particle.subscribe("temperature", myHandler, MY_DEVICES);
Serial.begin(9600);
}
And my data from the other photon looks like this:
{data:"{"humidity": 25.687870, "temp": 20.197059, "amb_temp": -2.600000}"
How can i grab only the "amb_temp" part of the data.
Create a char buffer of adequate size to fit the data
copy data
to a char array
parse the data using strtok()
examples
or (since your return is a JSON object) you can look into the JSON library on Build
1 Like
Keaner
December 1, 2016, 1:31am
3
Thanks!. I’ll try that out tomorrow
Cloud
December 1, 2016, 6:13am
4
I have a project that uses Neopixels to display temperature.
Mine is a bit more involved at this point but broken down it is…
void setup(){
Particle.subscribe("TempCpub", myHandler, MY_DEVICES);
}
Then the data string in…
void myHandler(const char *event, const char *data)
{
tmp = atof(data); // convert the incoming string literal to float and put the value in the global variable
gotMessage = true; // a global semaphore to set true when you get a new light value from master Particle.subscribe() function
Particle.publish("GotIt", String(tmp));
}
It has it’s own Particle.publish
to verify it has grabbed the data
Then the loop itself calling the logic for the Neopixels and basing the variable published on our string of data in the myHandler
function.
void loop()
{
static int messageTimer = 0;
if(gotMessage)
{
setLeds(tmp);
gotMessage = false;
messageTimer = millis(); // each time the message is received, reset the timeout clock to millis()
}
if(millis() - messageTimer > TIMEOUT_PERIOD) // check to see if your timeout has expired
{
chase(strip.Color(255, 0, 0)); // Red
}
}
1 Like
Keaner
December 1, 2016, 3:04pm
5
thanks for that too. I’m here at work now so Ill get to tinkering and report back.
Keaner
December 1, 2016, 5:23pm
6
I cant seem to get it, when i do this:
Serial.print(event);
Serial.print(", data: ");
Serial.println(str);
I get this
data:{"humidity": 24.993797, "temp": 20.458456, "amb_temp": -4.000000}
I still cant figure out how to get the "amb_temp" part only
I have this code so far:
void myHandler(const char *event, const char *datascrt)
{
String str = String(datascrt);
char strBuffer[256] = "";
str.toCharArray(strBuffer, 256);
int forecastday1 = atoi(strtok(strBuffer,","));
int maxtempday1 = atoi(strtok(NULL, ","));
Serial.print(event);
Serial.print(", data: ");
Serial.println(str);
Serial.println(forecastday1);
Serial.println(maxtempday1);
}
it just spits out zeros. Any help is appreciated
your string above may also have spaces following the “;” character ( i had to escape the string for my example…
char myData[] = "data:{\"humidity\": 24.993797, \"temp\": 20.458456, \"amb_temp\": -4.000000}";
void setup()
{
Serial.begin(9600);
char* ptr = strtok(myData, ": ");
int idx = 0;
while(ptr)
{
Serial.print(idx++);
Serial.print(": ");
Serial.println(atof(ptr));
ptr = strtok(NULL, ": "); // note a space inside the quotes, too
}
}
void loop(){}
Ric
December 1, 2016, 6:46pm
8
It would be easier to parse if you just send the 3 numbers separated by commas, if you have control over that. If the data were like this,
"24.993797,20.458456, -4.000000"
Then, you could separate the strings with strtok,
void myHandler(const char *event, const char *data) {
char *args = (char*)data;
char *first = strtok(args, ",");
char *second = strtok(NULL, ",");
char *third = strtok(NULL, ",");
float ambientTemp = atof(third);
}
1 Like