Hallo
Ich habe mit Hilfe vom IOBroker mir ein kleines Netz aufzubauen können.
Wo die ganzen Daten gesammelt und verarbeitet werden so weit so gut.
Jetzt hab ich schon ein paar Beispiele getestet mit der ArduinoMqttClient Bibliothek wo ich auch ausgewählte werte zurück bekomme und weiter verarbeiten kann.
Wo ich aber den Wald vor lauter bäumen nicht mehr sehe ist,
Wie kann ich sagen wir mal 5-10 werte empfangen und diese auch richtig zuordnen ?
Mit dem WiFiEcho.ino Beispiel geht das mit einen wert schon mal aber ich verstehe nicht wie die Sortierung erfolgen könnte.
unterschiedliche werte abzufragen geht ja mit mqttClient.subscribe(Name); aber wie Zuordnen welcher wert jetzt grade gesendet wird?
Wäre Super wenn mich da jemand erleuchten könnte.
Vielen dank.
Setzte mich heute Abend noch mal dran.
Zurzeit weiß ich nur das ich mit ArduinoMqttClient.h ganz normal int und float senden kann ähnlich wie bei Serial auch.
Wenn ich aber mit PubSubClient.h einen int oder float wert senden will bekomme ich nur Die Meldung das ich es umwandeln soll weil Int /Float nicht zulässig sind.
Mache dir ein Paylaod als CharArray und nutze sprintf um deine Werte ins Payload zu bekommen.
ArduinoMQTTclient scheint das automatisch zu machen. Nutze ich aber nicht.
sprintf ist kein Bestandteil einer MQTT Bibliothek.
Es ist Bestandteil von C++. Es "kopiert" Werte in ein CharArray.
Du legst dir ein CharArray an, was so groß ist, das es alle Zeichen der Zeichenkette aufnehmen kann, +1.
char payload[51] = ""; kann 50 Zeichen aufnehmen. Ob 50 ausreicht, musst du wissen. (Man könnte dies auch dynamisch berechnen. Da du es aber auch nur als Buffer verwenden kannst, verwirfst du es anschließend einfach wieder, und der Speicher ist frei.)
Wenn du dein Payload nicht global, sondern lokal hältst, ist es relativ egal wie groß Payload ist, da es beim verlassen der Funktion wieder frei gegeben wird.
Danke für die hinweise.
Ja habe mich wohl verschreiben hast voll und ganz recht.
sprintf konnte ich leider kein float entlocken es wurde immer nur 0 übertragen.
Nach einiger suche fand ich einen Beitrag in dem stand das sprintf kein float könne und es dafür dtostrf gebe welches aber wohl mehr Speicherplatz braucht.
Was mir beim DUE (Mein eigentliches Ziel) aber egal ist.
Und Ja ich habe in MEIN fall mal auf global verzichtet.
weil ich für mein eigentliches Projekt vermeiden will für die ganzen Übertragungen je eine Funktion zuschreiben. (sind fast 80 werte die insgesamt nach und nach übertragen werden)
Damit spielt die Größe der Payload zwar eine rolle aber die ist ja nebensächlich weil sie eh immer gelöscht wird.
Nicht für jede Übertragung eine Funktion, sondern wenige Funktionen gemeinsam für alle Übertragungen.
Das erfordert halt eine grundlegende Planung des Vorgehens.
Wie sollte das noch einfacher gehen? sind 3 Zeilen für eine Übertragung.
Bin für bessere Vorschläge offen.
Ich hatte den versuch jetzt nur mit wlan gemacht weil grade ein ESP8266 hier lag.
Aber ob Lan oder Wlan sollte keinen unterschied machen. Der Due ist ja auch ein 32-bit Chip.
Schau Dir mal diese Vorgehensweise an. Ob der Due mit dem F-Macro was bringt, habe ich nicht getestet.
Eine Senderoutine für float, eine für int (wenn Du nur float hast, kannst Du die für int weg lassen. Die Sachen fürs F-Macro kannst Du ja mal für den due kompilieren, ob es was bringt.
Dies in eine Funktion packen. Dann hast du einmal diese 3 Zeilen. Und pro Übertragung nur eine Zeile. Hinzu kommen bessere Anpassbarkeit und weniger Fehler trächtig.
Vielen dank für Euere Hilfe.
Zur zeit habe ich im Due noch ca 50-60% Platz Frei es besteht also aktuell noch keine Notwendigkeit platz um biegen und brechen zu sparen das kommt wie üblich nach und nach.
Dazu kommt das ich da noch nicht ganz Durch blicke.
Wie dem auch sei.
Leider scheine ich auf dem schlauch zu stehen oder ich habe mich etwas unklar ausgedruckt.
Plumps ich weis auf was du hinaus willst:
Springe zu dempunkt ();
void dempunkt ()
{
sende die selbe Übertragung....
}
Da es aber unterschiedliche werte zu unterschiedlichen Themen sind musste ich ja dennoch für jede Übertragung einen eigene sende Routine schreiben und verlinken das ist doch eher mehr aufwand.
Als es gleich an dem punkt zu machen wo es gesendet werden soll.
Was sich immer ändert sind die beiden punkte:
dtostrf(wert, 5, 1,payload); // Wert konvertierten und neu speichern
client.publish("TestBeides", payload); //Absenden
Ich könnte jetzt rein fürs löschen eine verlinkung schreiben.
Du hast den Sinn von Funktionen nicht verstanden. Funktionen kann man auch Parameter übergeben, z.B. den Float-Wert und den Text.
Das wird alles in dem von mir in #17 verlinkten Beispiel gezeigt, das Du Dir augenscheinlich nicht angeschaut hast.
Wenn Du Dir also das Leben schwer machen willst, dann mache weiter so. Es ist Deine Entscheidung.