Fehler beim "Serializing" von Temperaturdaten

OP #7593331
Lesenswert?

Hallo,

ich möchte die Sensorwerte vom ESP8266 und dem verbundenen Temperatursensor nach LabView über TCP/MQTT herstellen und "publishen". Im Terminal sehe ich die Temperaturwerte und eine Verbindung zum Broker wird auch hergestellt.

Wenn ich zum Subscriber verbinde und "subscribe" bekomme ich folgende Fehlermeldung:

Serialisierte Daten nach Variant in OpenSerializer.lvlib:Serializer.FlattenedString.lvclass:unmarshalling.vi:3430001->OpenSerializer.lvlib:Serializer.lvclass:UnMarshall.vi:4390003->OpenSerializer.lvlib:Serializer.lvclass:UnMarshall (binary).vi:6550002->MQTT Base.lvlib:MQTT_Base.lvclass:Decode Publish Package.vi:2830001->MQTT Client.lvlib:Client.lvclass:Decode Application Message (Type).vi->SubscriberDD.vi

Laut meines Wissens nach werden die Temperaturwerte in einem String Format an den Broker gesendet und an den Subscriber weitergeleitet. Hier müsste der String Format in Binärform und dann in Dezimal umgewandelt werden. Ich wüsste leider nicht wo und in welcher Reihenfolge man den Umwandlung ansetzten müsste.

Über Unterstützung würde ich mich sehr freuen. Mfg

Quellcode vom ESP8266:

1
 
2

3
#include <Wire.h>
4
#include <Adafruit_SHT31.h>
5
#include <ESP8266WiFi.h>
6
#include <PubSubClient.h>
7
#include <SPI.h>
8

9
// Replace with your WiFi credentials
10
const char* ssid = "Test123";
11
const char* password = "Test123";
12

13
// Replace with your MQTT broker details
14
const char* mqtt_server = "Test123";
15
const int mqtt_port = 1883;
16
const char* mqtt_topic = "sensor_data";
17

18
// Create an instance of the SHT85 sensor
19
Adafruit_SHT31 sht;
20

21
// Create an instance of the WiFi client
22
WiFiClient espClient;
23

24
// Create an instance of the MQTT client
25
PubSubClient client(espClient);
26

27
void setup() {
28
  // Start the serial communication
29
  Serial.begin(9600);
30

31
  // Connect to Wi-Fi
32
  WiFi.begin(ssid, password);
33
  while (WiFi.status() != WL_CONNECTED) {
34
    delay(1000);
35
    Serial.println("Connecting to WiFi...");
36
  }
37
  Serial.println("Connected to WiFi");
38

39
  // Connect to MQTT broker
40
  client.setServer(mqtt_server, mqtt_port);
41

42
  // Initialize the SHT85 sensor
43
  if (!sht.begin(0x44)) {
44
    Serial.println("SHT85 not found. Check wiring!");
45
    while (1);
46
  }
47
}
48

49
void loop() {
50
  // Read sensor data
51
  float temperature = sht.readTemperature();
52
  float humidity = sht.readHumidity();
53

54
  // Print sensor data to Serial Monitor
55
  Serial.print("Temperature: ");
56
  Serial.print(temperature);
57
  Serial.print(" °C, Humidity: ");
58
  Serial.print(humidity);
59
  Serial.println(" %");
60

61
  // Publish sensor data to MQTT
62
  if (client.connect("ESP8266Client")) {
63
    char tempStr[10];
64
    char humStr[10];
65
    dtostrf(temperature, 4, 2, tempStr);
66
    dtostrf(humidity, 4, 2, humStr);
67

68
    client.publish(mqtt_topic, tempStr);
69
    //client.publish(mqtt_topic, humStr);
70

71
    client.disconnect();
72
  }
73

74
  // Wait for a while before reading the sensor again
75
  delay(5000);
76
}
Angehängte Dateien:
#7593342
Lesenswert?

Meine Sensoren publishen ihre Daten folgendermaßen:

1
  char topicc[40]={0};
2
...
3
  strcat(topicc, temp_topic);
4
  client.publish(topicc, String(temp).c_str(), true);

Du könntest auch den MQTT Explorer verwenden, um zu schauen, in welchem Format deine Daten beim Broker ankommen.

#7594388
Lesenswert?

Yasin Y. schrieb:

Habe ein Bild eingefügt, bekomme anscheinend Float Werte, erwartet hatte ich die Nachrichten im String-Format..

Ich sehe auf dem Bild als Nachrichten Zahlwerte ALS TEXT, also genau was dtostrf produziert. Der MQTT-Explorer wiederum erkennt diesen Text als Zahlwert. Anführungszeichen davor und dahinter (also "String-Format") schickst du nicht und bekommst du also auch nicht.

LG, Sebastian

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren