Forum: Mikrocontroller und Digitale Elektronik Fehler beim "Serializing" von Temperaturdaten


von Yasin Y. (yasin_y)


Angehängte Dateien:

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
}

: Verschoben durch Moderator
von Helmut -. (dc3yc)


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.

: Bearbeitet durch User
von Yasin Y. (yasin_y)


Lesenswert?

Hi ich kriege die Daten wie folgt:
{
  "Temp": "9.8",
  "TempUnit": "C",
  "Hum": "57",
  "Time": "2024-02-01 18:30"
}

von Sebastian W. (wangnick)


Lesenswert?

Yasin Y. schrieb:
> Hi ich kriege die Daten wie folgt:
> {
> "Temp": "9.8",
> "TempUnit": "C",
> "Hum": "57",
> "Time": "2024-02-01 18:30"
> }

Spannend. Wo kommen wohl in diesem JSON TempUnit, Hum und Time her, wenn 
der ESP nur Temp sendet? Ich warte auf die nächste Folge ...

LG, Sebastian

von Rainer W. (rawi)


Lesenswert?

Sebastian W. schrieb:
> Wo kommen wohl in diesem JSON TempUnit ...

... zumal die auch noch falsch ist.

von Sebastian W. (wangnick)


Lesenswert?

Rainer W. schrieb:
> ... zumal die auch noch falsch ist.

Rainer, willst du den armen Yasin auch noch durch die UTF-8-Hölle 
schicken? Das grenzt ja an Subversivität ... :)

LG, Sebastian

von Olly T. (twinpeaks)


Lesenswert?

Yasin Y. schrieb:
> Hi ich kriege die Daten wie folgt:
> {
>   "Temp": "9.8",
>   "TempUnit": "C",
>   "Hum": "57",
>   "Time": "2024-02-01 18:30"
> }

Also wenn Du die Daten im JSON-Format haben willst, nimm doch eine 
passende Library wie ArduinoJson anstatt das von Hand zu machen.
https://arduinojson.org/

: Bearbeitet durch User
von Yasin Y. (yasin_y)


Angehängte Dateien:

Lesenswert?

Hallo Freunde, hatte vergessen die IP des Brokers zu ersetzen..


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

: Bearbeitet durch User
von Sebastian W. (wangnick)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.