Hi,
ich nutze folgende Lib um Daten per WiflyShield an mein iPhone (TouchOSC) zu übertragen:
Folgendes Problem:
Daten werden per
client.sendFloat((float)(sensors.getTempCByIndex(i)),"/tempLED");
gesendet.
Jetzt möchte ich allerdings den ZielString (im beispiel "/tempLED") mit einer Variable versehen, also
"/tempLED0"
"/tempLED1"
etc...
Mit einer alten Library die ich mit XBEE verwendet habe, hätte folgendes funktioniert:
for (int i=0; i<DS18Sensoren; i++) {
client.sendFloat((float)(sensors.getTempCByIndex(i)),("/tempLED"+i)); ///
}
Das klappt jetzt leider nicht mit dieser Library.
Fehler:
AquaLED_WIFLY_v2.ino: In function 'void getTimeAndTemp(Time)':
AquaLED_WIFLY_v2:127: error: invalid conversion from 'const char*' to 'char*'
AquaLED_WIFLY_v2:127: error: initializing argument 2 of 'int OSCClient::sendFloat(float, char*)'
Hat jemand eine Idee, wie ich das anpassen kann?
BEsten Dank
Gruß
Thorsten
Aus einem Beispeil Sketch kann man folgendes entnehmen:
void loop()
{
//note that the destination adress is set by setting the remote host of the wifly!
//three ways of sending messages...
//simple but not as flexible: the convenience functions:
client.sendInt(analogRead(A0),"/ard/A0Value");
client.sendFloat((float)analogRead(A1)*5.0/255.0,"/ard/A1Voltage");
//using a local message object allows to multiple additional parameters in a singel message:
//loacal_mes,str is release by out of scope
OSCMessage loacal_mes;
loacal_mes.beginMessage("/ard/A2A3Value");
loacal_mes.addArgInt32(analogRead(A2));
loacal_mes.addArgInt32(analogRead(A3));
client.send(&loacal_mes);
//using a global message object and some global variables works as well
global_mes.beginMessage("/ard/status");
global_mes.addArgInt32(globalIntValue);
global_mes.addArgFloat(globalFloatValue);
global_mes.addArgString(globalString);
client.send(&global_mes);
global_mes.flush(); //object data clear
globalIntValue++;
globalFloatValue*=0.999;
}
Was ich hieran nich verstehe:
//using a local message object allows to multiple additional parameters in a singel message:
//loacal_mes,str is release by out of scope
OSCMessage loacal_mes;
loacal_mes.beginMessage("/ard/A2A3Value");
loacal_mes.addArgInt32(analogRead(A2));
loacal_mes.addArgInt32(analogRead(A3));
client.send(&loacal_mes);
Es werden mehrere Daten mit einer Nachricht gesendet, allerdings ist mir die Logik der Zuordnung nicht ganz klar. Zwei Werte werden an eine Adresse gesendet, die müssen sich doch dann gegenseitig überschreiben?
In meinem Fall:
for (int i=0; i<DS18Sensoren; i++) {
OSCMessage loacal_mes;
loacal_mes.beginMessage("/tempLED");
for (int i=0; i<DS18Sensoren; i++) loacal_mes.addArgFloat((float)(sensors.getTempCByIndex(i)));
client.send(&loacal_mes);
}
"/tempLED" + i
Du solltest inzwischen wissen, dass das in C nicht geht
Zwei Werte werden an eine Adresse gesendet, die müssen sich doch dann gegenseitig überschreiben?
Nein, müssen sie nicht. Das HokusPokus liegt darin, dass
client.send(OSCMessage*)
weiss, was es mit einem OSCMessage Element machen soll.
Daten werden per
client.sendFloat((float)(sensors.getTempCByIndex(i)),"/tempLED");
gesendet.
Jetzt möchte ich allerdings den ZielString (im beispiel "/tempLED") mit einer Variable versehen, also
"/tempLED0"
"/tempLED1"
etc...
z.B. so:
for (int i=0; i<DS18Sensoren; i++) {
static char text[10] =
// 012345678
"/tempLED#";
text[8] = '0'+i;
client.sendFloat((float)(sensors.getTempCByIndex(i)),text)); ///
}
Das ist die beste Lösung für i von 0-9
Das wird wohl reichen, aber wenn man Zahlen größer als 9 braucht, dann kann man atoi() verwenden und einfach text + 8 für das Ziel-Array übergeben.
Hallo,
vielen Dank,sieht gut aus.
Hat denn jemand ne Idee, was genau hier passiert:
//using a local message object allows to multiple additional parameters in a singel message:
//loacal_mes,str is release by out of scope
OSCMessage loacal_mes;
loacal_mes.beginMessage("/ard/A2A3Value");
loacal_mes.addArgInt32(analogRead(A2));
loacal_mes.addArgInt32(analogRead(A3));
client.send(&loacal_mes);
Es scheint doch nur eine Adresse (=Textfeld in der TouchOSC app) zu geben:"/ard/A2A3Value"
Trotzdem werden an diese Adresse (scheinbar?) 2 verschiedene Werte gesendet: analogRead(A2) und analogRead(A3). Eigentlich müssten die doch an "/ard/A2Value" und "/ard/A3Value" gesendet werden.