Variabele verzenden in Json string

Hi

Ik heb een variabele die aEAV heet en die ik als testje de waarde 500 heb gegeven:

int mEAV = 500;

Dat kan ik testen met:

Serial.println (mEAV);

Deze geeft keurig 500 weer op de seriele monitor.
Nu wil ik dit gaan verzenden naar een Fibaro HC2 controller, dit doe ik zo:

String PostData = "{\r\n"value":(mEAV)\r\n}"; //JSON data to send

De Fibaro accepteert dit helaas als "mEAV" ipv het getal 500.

Ik heb al van alles gezocht en geprobeerd, maar niks lijkt te werken en ik lijk ook wel de enige te zijn diet dit wil realiseren.

Heeft iemand voor mij een duw in de goede richting?

kijk eens naar snprintf

Bedankt, meteen mee klooien natuurlijk maar zonder resultaat.

Ik heb nu:

float f = mEAV;
Serial.print("Original value: ");
Serial.println(f);

char str[50];
// sprintf(str, "String value: %f", f);
sprintf(str, "String value: %d.%02d", (int)f, (int)(f*100)%100);
Serial.println(str);

En wat moet ik dan straks in de json string zetten als variabele, f, %f of str?

Daar kun je zelf toch achter komen ?
Stuur die variabelen eens via de seriële poort.
Dan zie je vanzelf wanneer je de waarde krijgt waar je naar op zoek bent.

Verder kan ik je ook niet helpen, want ik ken het hele ding niet.

Ja, snap ik, f geeft als resultaat 500, maar dan, dan moet ik een string sturen, als test doe ik dat zo:

String PostData = "{\r\n"value":"166"\r\n}"; //JSON data to send

Dit stuurt de onderstaande string naar de Fibaro:
{ "value": "166" }

Maar die 166 is gewoon een vast testgetal, ik wil die variabele "f" daar hebben.
Ik heb bij de variabele al f, "f", (f), %f enz... geprobeerd.

Nu zit ik dus muurvast.

Ten eerste is het belangrijk dat je alles snapt wat er gebeurt.

Ik kan de regel niet helemaal volgen, omdat ik de aanhalingstekens vreemd vind staan.
\r is een carriage return, de \ staat ervoor dat het volgende karakter een stuursignaal is.
Een carriage return zet de cursor terug op positie nul van de betreffende regel.
Dan is er nog een \n, voor new line.
Die zet de cursor op de volgende regel.
Dus \r\n is hetzelfde als wanneer je op je windows pc op de enter toets drukt.

Je moet naar je apparaat communiceren met ASCII karakters.
Het ASCII karakter 500 is mij niet bekend (omdat het niet bestaat).
Daarom moet je je variabele omzetten naar ASCII karakters.
Dat is dan dus een vijf, een nul en nog een nul.
Hoe je dit andersom kunt doen weet ik (want ik heb daar ooit eens iets voor gebouwd).
Maar hoe je dit moet doen, weet ik niet,

Maar als ik google naar snprintf, dan vind ik een uitleg (klik !) die mij best wel duidelijk maakt hoe dit gedaan moet worden.
Das dus inclusief een verhelderende demonstratie.

Bedankt.
Ben alleen bang dat ik je niet helemaal begrijp.
Ik heb dit al:

int mEAV = 500;

float f = mEAV;
Serial.print("Original value: ");
Serial.println(f);

char str[50];
// sprintf(str, "String value: %f", f);
sprintf(str, "String value: %d.%02d", (int)f, (int)(f*100)%100);
Serial.println(str);

Hier boven wordt mEAV al omgezet naar een string value f.
Dit wordt ook bevestigd in de serial monitor.

Ik krijg hem alleen niet goed in de PostData string.

Wat zie je dan precies voorbij komen in je serial monitor ?

f is geen string, maar een float.

Verder ben jij met sprintf bezig, niet met snprintf.
Let op de details !

Nou, even afmelden, het is opgelost.

int mEAV = 998;

String PostData = "{\"value\":\"";
       PostData += mEAV;
       PostData += "\"\}\r\n";
[\code]

Geeft als output: {"value":"998"}

En de Fibaro snapt het:

connected
HTTP/1.1 200 OK
Date: Mon, 13 Feb 2017 20:54:16 GMT
Server: 0.9
Cache-Control: no-cache, no-store, must-revalidate, max-age=0, max-age:0
Content-Type: application/json;charset=UTF-8
Pragma: no-cache
Expires: Fri, 01 Jan 2010 00:00:00 GMT
Transfer-Encoding: chunked

6b
{"name":"Huidig","value":"998","readOnly":false,"isEnum":false,"created":1486916361,"modified":1487019256}
0

Opgelost dus.

Mooi.

Goed dat je je oplossing ook gepost hebt.