ich nutze die PubSubClient.h, sowie die BlueDot_BME280.h
Nun wollte ich per client.publish("Haus/Luftdruck/Wohnzimmer", bme1.readPressure()); eine MQTT message absetzen, aber ich bekomme die Fehlermeldung:
"no matching function for call to 'PubSubClient::publish(const char[49], float)'"
In der BlueDot_BME280.h ist readPressure als float definiert: float readPressure(void);
Kleine Anmerkung:
Dein Puffer msg muss in diesem Fall 50 Zeichen haben. Wenn die Zahlen üblicherweise kürzer sind, liegt da Sparpotential.
Der Formatierung der Zahl mit %X.Yf kannst Du bei X auch eine Gesamtlänge incl. Punkt mitgeben. Ich weiß nicht, ob das mqtt mit Leerzeichen in der Nummer umgehen kann. Falls nicht, kannst Du auch mit linksbündigen Nullen auffüllen: %07.2f - sieben Zeichen insgesamt, vier vor dem Punkt (ggf. mit 0 aufgefüllt), der Punkt und zwei dahinter.
Was mir noch aufgefallen ist: Irgendwo scheint es einen Rundungsfehler zu geben!
Auf dem seriellen Monitor kommt: 23,813, in MQTT kommt 23,812
Auf dem seriellen Monitor kommt: 24,313, in MQTT kommt 24,312
Auf dem seriellen Monitor kommt: 23,563, in MQTT kommt 23,562
Woran liegt's?
Der serielle Monitor rundet auf drei Stellen, und snprintf schneidet die Zahl einfach ab, nehme ich an?! Gut dann mach ich es halt beides auf vier Stellen
...is natürlich Quatsch. 3 Stellen sind eigentlich schon fast zwei zu viel. Ich lasse es bei 3 Stellen...
Jetzt wird die Sache interessant!
In MQTT sind mir bisher keine Probleme mit Leerzeichen aufgefallen, das sieht ganz normal aus.
Hier mal die entscheidenden Stellen aus dem Code:
Bootsschuppen/Temperatur/T63RepeaterUnter1260e "21.750"
Bootsschuppen/Temperatur/T64RepeaterÜber1260e "21.625"
Bootsschuppen/Temperatur/T65Innen "21.750"
Bootsschuppen/Temperatur/T66Aussen "21.438"
Bootsschuppen/Luftfeuchtigkeit/RepeaterBME280_01 "46.57"
Bootsschuppen/Luftdruck/RepeaterBME280_01 "1006.39"
Bootsschuppen/Temperatur/T41RepeaterBME280_01 "22.37"
Im Winter können die Temperaturen natürlich auch noch negativ werden!
Mit Vorzeichen (für den Winter) müsste ich die 50 doch auf 7 eindampfen können, richtig?
Richtig, den Abschluss hatte ich vergessen. Hab's eben noch selber gelesen und wollte es noch auf 8 korrigieren. Gut, ihr ward schneller, dann lasse ich es so für die Nachwelt stehen.
Was mir noch nicht so ganz klar ist, (bin ja wieder Jungfrau, nach anhaltender Abstinenz zum programmieren )
Warum wird am Anfang die Buffer Size auf 50 Zeichen deklariert, und unten dann nochmal die 50 im snprintf(); angegeben? Ich kann an beiden Stellen auf 8 runter, richtig?
Wenn ich jetzt oben die Buffer Size auf 8 einstelle, was bewirken dann andere Werte im snprintf();?
Könnte ich z.B. bei der Luftfeuchtigkeit runter auf 6?
Und bei der T41RepeaterBME280_01 (die hat nur zwei Nachkommastellen) runter auf 7?
Nee, vier Temperaturen kommen von DS18b20, die gebe ich mit drei Nachkommastellen aus (die eine Temperatur vom BME280 nur mit zwei Nachkommastellen).
Ausgelesen wurde nur 1x, aber dann auch verschiedenen Wegen ausgegeben.
Ich habe in der Zwischenzeit die Nachkommastellen testweise erhöht, und dann sah es so aus:
Seriell: 23,8125 und MQTT 23,8125
Bei Seriell wurde auf 23,813 gerundet und bei MQTT wurde bei 23,812 abgeschnitten.
Oben sagst Du wie gross der buffer ist.
Im snprintf weiss das keiner, wie weit geschrieben werden darf.
Du könntest ja auch nur bis 10 schreiben wollen, daher gibst Du an, bis wohin maximal geschrieben werden kann.
Gehst Du in snprintf über sizeof(array) hinaus, kommt es zu komischen Effekten.
Wenn das da oben die Temperaturen sind.. kann es sein, das die nicht 12bit resolution machen?
[edit]
Was ich meine steht im Datenblatt unter "Operation—Measuring Temperature" - Mir erscheint der Sprung 23,8 ->24,5 sehr verdächtig. - Alles andere danach ist nichts.
[/edit]
Die Genauigkeit ist übrigens auch da mit +-0,5°C bei -10 bis +85