Ich bin dabei meinen Arduino-MEGA Webclient von GET auf PUT umzubauen und auf das String Objekt zu verzichten.
Was bisher geschah:
Im ersten Schritt habe ich einfach im Webclient die client.print ausgetauscht gegen ein
String Objekt "message" und die message mit einfachen Verkettungen zusammengestückelt was auch erwartungsgemäß funktioniert hat.
message ="board=";
message +"TXT_BOARDID";
usw.
Der zweite Schritt ist nun das String Objekt gegen ein char Array ausztauschen.
für den HTML-BODY habe ich nun ein "großen" message Buffer und einen kleinen temporären definiert
const uint16_t MESSAGE_SIZE_MAX = 600; // maximum bytes for Message Buffer
char message[MESSAGE_SIZE_MAX]; // the temporary sending message - html body
char val[32]; // to convert floats and integers before appending
#define TXT_BOARDID "65" // brauchen wir noch weiter unten im Beispiel
Die Message baue ich nun mit strcat zusammen also
strcpy(message, "board="); // Anfang
strcat(message, TXT_BOARDID); // Jedes weitere ...
war Tipparbeitet, aber klappt soweit.
Nun die Fragen:
Frage 1:
bei Integers bin ich mir nicht sicher, ob ich eher ein sprintf oder ein itoa verwenden soll also
Variante A
strcat(message, "&relay=");
sprintf(val, "%d", portRelay);
strcat(message, val);
oder Variante B
strcat(message, "&ldr=");
sprintf(val, "%d", analogRead(LDRSENSOR_PIN));
itoa(analogRead(LDRSENSOR_PIN), val, 10);
strcat(message, val);
Frage 2:
Gibt es für Floats eine Alternative zu dtostrf - oder ist das eh in Ordnung
strcat(message, "&voltage="); // aktuell gemessene Spannung
dtostrf(voltageActual, 1, 2, val);
strcat(message, val);
Frage 3:
Ich bekomme aus meinem Solarregler einige Werte in zwei separaten Registern (zwei int, eins um 16bit shiften) und die baue ich dann
zu einem Float:
float IntToFloat (int low, int high)
//converts two integers with each of two bytes to one float value
//in: low byte high byte
//out: the float value of low and high byte
{ float num;
long temp = (long)high << 16 | low;
num = (float)temp / 100;
return num;
}
wenn ich den Float nun in meine "message" einbauen möchte, gibt es da etwas einfacheres,
als zunächst die zwei Integer in ein Float zu wandeln und diese Float dann mit dtostrf "printbar" zu machen?
// zum Verständnis
int regs[50]; // mein Registry Master Array das über Modbus befüllt wird
const byte solarChargingEquipmentInputPower = 2; // Startregister für den Wert
//...
strcat(message, "&sceip=");
dtostrf(IntToFloat(regs[solarChargingEquipmentInputPower], regs[solarChargingEquipmentInputPower + 1]), 1, 1, val); //Float
strcat(message, val);
also im Prinzip funktioniert alles, aber wenn ich etwas "einfacher" machen könnte (muss der ganze Aufriss mit strcat wirklich sein?), nehme ich gern eure Tipps.