Um zu überprüfen ob die Methode aufgerufen wird, kannst du nicht eine MQTT Nachricht an den Broker posten. Bei Speicherproblemen kannst du deine Nachricht nämlich gar nicht erst erzeugen. Deshalb bitte einmal:
void callback(char* topic, byte * payload, unsigned int length)
{
Serial.println("callback called");
// ...
}
In deine Code einfügen und wenn keine Nachrichten mehr verarbeitet werden auf die serielle Schnittstelle gucken . (Achtung: Wenn du die serielle Schnittstelle öffnest, dann wird der Arduino resettet. Ich weiß aber nicht, wie das bei den ESP's ist)
Die For-Schleife in deiner Callback Funktion macht meines Erachtens wenig Sinn. Sagen wir, du empfängst "123.456" als Payload. Dann wird der folgende Code 7 mal durchlaufen, bei längeren Payloads sogar noch öfter. Lass die For-Schleife weg.
Serial.print((char)payload[i]);
payload[length] = '\0';
String s = String((char*)payload);
float f = s.toFloat();
ClientTemp = f;
if (f < 10 && f >= 0) {
tft.fillRect(4, 93, 10, 15, ST7735_BLACK);
tft.setCursor(16, 93);
tft.setTextSize(2);
tft.print(f, 2);
} else if (f < 0 && f > -10) {
tft.setCursor(4, 93);
tft.setTextSize(2);
tft.print(f, 2);
} else if (f <= -10) {
tft.setTextSize(2);
tft.setCursor(4, 93);
tft.print(f, 1);
} else {
tft.setCursor(4, 93);
tft.setTextSize(2);
tft.print(f, 2);
}
tft.setTextSize(1);
tft.print("C");
Außerdem, was macht denn der GUI-Code in deinem Callback? Der sollte nur dafür zuständig sein die MQTT-Nachricht entgegen zu nehmen und nicht auch noch dafür die GUI upzudaten. Und vor allem sollte der Empfang von MQTT Nachrichten nicht davon abhängen, in welchem DisplayMode man ist. Wenn es gar nicht anders geht und die GUI unbedingt von dort aus geupdatet werden muss, dann bitte den GUI-Code in eine eigene Funktion und diese dann von da aus aufrufen.
void callback(char* topic, byte * payload, unsigned int length) {
if (DisplayMode == DSP_STD) {
if (strcmp(topic, "/ESP8266/aussen/Temp") == 0) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
payload[length] = '\0';
String s = String((char*)payload);
float f = s.toFloat();
ClientTemp = f;
guiUpdateTemperature(ClientTemp);
}
}
else if (strcmp(topic, "/ESP8266/aussen/Luft") == 0) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
payload[length] = '\0';
String s = String((char*)payload);
float l = s.toFloat();
guiUpdateHumidity(l);
}
}
}
callb_str = String(ClientTemp);
callb_str.toCharArray(callb, callb_str.length() + 1);
client.publish("/callb/temp/WZ", callb);
}