String Array per MQTT-Publish senden

Hallo Gemeinde, ich versuch grad 2 Messwerte an den lokalen MQTT-Server zu senden:

// "GreenhousTopic" Veroeffentlichen
  String werte[3];
  werte[0] = String(tempC).c_str();
  werte[1] = String(humidity).c_str();
  werte[3]= '\0';
  client.publish(outTopic, werte, true); // hier meckert der Compiler mit werte ist er nicht zufrieden

ist sicherlich wiedermal ein Grundlagenproblem, aber kann wer helfen?

Danke
Stefan

Der Weg Zahl -> String -> C-string (char-Array) ist der ungünstigste Weg, den man gehen kann und er führt je nach Prozessor/RAM früher oder später zu so starker Fragmentierung des RAM, dass Absturz noch die Beste Reaktion ist.

Besser ist es, über dtostrf (kleine 8-Bit-AVR) oder sprintf/snprintf (ESP) direkt ein char-Array zu befüllen.
Da Du uns nicht mitteilst, welchen MC Du verwendest, können wir das nicht genauer beantworten.

Gruß Tommy

Entschuldigung, im Boardmanager ist NodeMCU 1.0 (ESP-12E) definiert. Im Gerätemanager steht CH340.

Stefan

Also 32-Bit und damit snprintf/sprintf
Du musst wohl für jeden Einzelwert ein Publish machen, damit MQTT weiß was das ist.
Ich nutze MQTT nicht.

Gruß Tommy

Danke, dann werden die Werte im Subscribe vereint das passt auch.

Stefan

am Ende war's recht einfach:

  float tempC = AM2320.readTemperature();
  float humidity = AM2320.readHumidity();
  
// "Topic" veroeffentlichen:
  char log[10];
  sprintf(log,"%.1f,%.1f", tempC, humidity);
  client.publish(outTopic,log, true);

danke für den Hinweis zu sprintf()...

Stefan

Ich würde trotzdem eher zu snprintf raten, da Du dort die Größe des Puffers mit geben kannst und nicht darüber hinaus schreibst.

Gruß Tommy

Danke, noch ne letzte Frage:

  snprintf(log, 9,"%3.1f,%3.0f", tempC, humidity);

sollte die winterlichen Wert von -99,0°C, 100%LF erfassen können? - oder? Bin grad wegen der Temperatur unsicher....

Danke - Stefan

Wenn Du eine "Gesamtlänge" für das Zahlenformat angibst, müsstest Du für -99.0 schon "%5.1" angeben, weil die 5 für alle Zeichen inklusive "." und einer Nachkommastelle steht. Ist die Zahl kürzer (z.b. 9.9) wird mit Leerzeichen aufgefüllt "__9.9".

Wenn Du das "Auffüllen" mit Leerzeichen nicht haben willst bietet sich
snprintf(log,10,"%.1f,%.0f", tempC, humidity);
an. Also fast Deine ursprüngliche Variante. Nur hier ohne Nachkommastelle bei der Luftfeuchte.
Ergibt "-99.9,100" + Char-String Ende '\0' = 10 Zeichen.

:+1:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.