INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
MQTT Topic abbonieren?
15.01.2021, 20:33
Beitrag #17
RE: MQTT Topic abbonieren?
Moin,

(15.01.2021 20:10)Tommy56 schrieb:  Was soll diese Zeile bewirken?
float ((char)payload[i]);
[...]

In der "callback Funktion" bewirkt
Code:
Serial.print((char)payload[i]);

die Ausgabe des eingehenden MQTT Topics auf den seriellen Monitor. Obige Zeile war mein Versuch diese Ausgabe in eine Variable zu schreiben um die dann wiederum auf meinem 1106er Display aus zu geben. Weil ich bisher keine Möglichkeit gefunden habe den eingehenden Topic auf das Display zu schreiben. Also ich habe nur "Serial.print" durch "float" ersetzt.

Ich habe fast alles Deines Tutorials gelesen, allerdings ab "name = strcat(name,"!!");" nicht mehr viel verstanden... noch nicht ! ;-)

bis dann,
Steinspiel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.01.2021, 20:44 (Dieser Beitrag wurde zuletzt bearbeitet: 15.01.2021 20:49 von Tommy56.)
Beitrag #18
RE: MQTT Topic abbonieren?
Dann lerne weiter zu verstehen. Das ist effektiver, als irgendwas sinnloses hinzuschreiben.
Vor allem lerne den Unterschied zwischen char und char* zu begreifen.

Gruß Tommy

Edit: Wenn Du Dir die Zeichen ausgeben lässt, lass die auch mal in HEX ausgeben, damit Du Steuerzeichen siehst. Ist payload mit '\0' abheschlossen? Nur dann kannst Du dtostrf benutzen.

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.01.2021, 22:57
Beitrag #19
RE: MQTT Topic abbonieren?
(15.01.2021 20:44)Tommy56 schrieb:  [...]
zwischen char und char* zu begreifen.
[...]

Ja, aber erst mal versuche ich zu begreifen wo meine lange Antwort an Dich geblieben ist, die ich so wohl formuliert und definitiv abgeschickt hatte... Huh

Mist!

Das ganze drum herum kriege ich jetzt nicht mehr zusammen, aber zum Schluß habe ich geschrieben das "meine" MQTT Ausgabe auf dem seriellen Monitor eine Temperatur nach dem Muster "22.50" ist. Und ob Du mir ein konkretes Beispiel am "callback Abschnitt" geben kannst wie ich die serielle Ausgabe in eine Variable geschrieben bekomme?

Code:
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Nachricht eingegangen [");
  Serial.print("] ");  
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
    }
    Serial.println();
    }

Eine "float ((char)payload[i]);" ist es ja nicht wie ich gelernt habe...

Zu oben: ich denke das die Verwendung von "char*" bei mir relevanter ist, weil der String mit den Temperaturwerten ja immer aus fünf Zeichen (22.50) besteht deren Anzahl sich nicht ändert, oder?
Nur weiß ich (noch) nicht wie ich "char*" verwenden muss...

bis dann,
Steinspiel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.01.2021, 10:46
Beitrag #20
RE: MQTT Topic abbonieren?
Je nach Compiler
Code:
float f = atof(payload);
// oder
float f = atof((char *)payload);

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.01.2021, 23:27
Beitrag #21
RE: MQTT Topic abbonieren?
Moin Tommy,
(16.01.2021 10:46)Tommy56 schrieb:  Je nach Compiler
Code:
float f = atof(payload);
// oder
float f = atof((char *)payload);

Erst mal Danke für Deinen Code, als Compiler dient hier die Arduino IDE. Also fast Danke meine ich... ;-)

Wird ein saublöder Zufall sein: ich habe Deine Zeile eingefügt, den Sketch hochgeladen und dann machte der ESP32 das was Du auf dem Bild siehst. Egal welches Sketch, enthielt es WIFI Einwahl passierte "ES". Ich vermutette es lag an meinem WLAN und habe alles was es an Hardware hier so gibt neu gebootet -> keine Änderung! Den ESP32 gut zwei Stunden Stromlos gelassen -> keine Änderung!
Aus einem Backup habe ich dann eine zwei Tage alte Version meines "MQTT Sketches" (die eigentlich identisch ist mit der heutigen Version) geladen und jetzt scheint es wieder stabil zu laufen. Im I-Net habe ich einiges zu "Guru Meditaionsfehlern" + ESP32 gefunden. Gelegentlich wird von "Stapbelüberlauf" geschrieben, aber die Ursache scheint breit gefächert zu sein...

Das nur zur Info. Für heute werde ich es erstmal lassen mit Deinem Code, ich trau mich morgen dann noch mal ... ;-)


[Bild: Oulu0lH.png][/align]

bis dann,
Steinspiel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.01.2021, 23:40
Beitrag #22
RE: MQTT Topic abbonieren?
Moin Steinspiel,
poste mal bitte Deinen Sketch, bei dem Du den Screenshot gemacht hast. Ich hatte das letztens auch mal, als ich durch das nicht Anschließen eines Potis am Analogeingang auf einen ungültigen Bereich einem Array zugegriffen habe.
Bei Dir scheint es ja beim Einlesen der eintreffenden Nachricht aufzutreten.
Grüße Jan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.01.2021, 00:42
Beitrag #23
RE: MQTT Topic abbonieren?
(16.01.2021 23:40)nbk83 schrieb:  Moin Steinspiel,
poste mal bitte Deinen Sketch, bei dem Du den Screenshot gemacht hast.

Da ist nicht viel, es ist der MQTT Sketch aus dem Buch...
zuzüglich der Konfiguration des SH1106er Displays und zwei, drei auskommatierten Variablen von meinen Fruchtlosen Versuchen den MQTT Payload in eine Variable zu bekommen um diese dann auf dem Display aus zu geben. Und natürlich die auskommatierte Zeile von Tommy...

Code:
#include <Wire.h>
#include <U8g2lib.h>
#include <WiFi.h>
#include <PubSubClient.h>
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

const char* ssid          = "";
const char* password      = "";
const char* mqtt_server   = "192.168.";
//const char* topic         = "esp/test";
const char* eingang_topic_1         = "esp/test";
const char* eingang_topic_2         = "kueche/bme280/temperature";
const int   STATUS_RATE          = 60000;
const int mqttPort        = 1883;
const char* mqttUser      = "";
const char* mqttPassword  = "";
const char* MQTT_scantopic  = "kueche/scan/ble/signal";
const char* MQTT_statustopic = "esp32/status";



WiFiClient espClient;           // WiFi-Client Objekt
PubSubClient mqtt_client(espClient); // PubSubClient Objekt

long lastMsg = 0;     // Wird für Timer verwendet
int counter = 0;      // Zähler


//int wert; //payload konvertieren
//char Wert_str[15];  //payload konvertieren


U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup() {
  Serial.begin(9600); // Init Serial-Monitor
  u8g2.begin();    
  WiFiInit();         // Init WiFi
  mqtt_client.setServer(mqtt_server, 1883);
  mqtt_client.setCallback(callback);
}
//-----------------------------------------
//----WIFI-Verbindung----Anfang------------

void WiFiInit() {
  delay(10); // Kurze Pause
  Serial.print("\n\nVerbindungsaufnahem zu: ");
  Serial.println(ssid);       // Ausgabe SSID
  WiFi.begin(ssid, password); // WiFi starten
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nMit WiFi verbunden");
  Serial.print("IP Adresse: ");
  Serial.println(WiFi.localIP()); // Ausgabe IP-Adresse
}
//----WIFI-Verbindung----Ende----------------
//-------------------------------------------
//----MQTT-Einghende-Verbindung----Anfang----

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Nachricht eingegangen [");
  Serial.print("] ");  
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
    //float f = atof((char *)payload);  // <--- von tommy
    //u8g2.drawStr(0,10, (char)payload[i]); // <--- Display
  
  }
    
  Serial.println();
}
//----MQTT-Einghende-Verbindung----Ende----
//-----------------------------------------
//----MQTT-Verbindung----Anfang------------

void reconnect() {
  while (!mqtt_client.connected()) {
    Serial.print("Starte MQTT-Verbindung...");
    if (mqtt_client.connect("ESPClient", mqttUser, mqttPassword)) {
      Serial.println("verbunden");
      mqtt_client.publish(MQTT_statustopic, "ESP32_no03 IST VERBUNDEN!"); // Kurzes Lebenszeichen
      //mqtt_client.subscribe(eingang_topic_1); // Subcription des Topics
      mqtt_client.subscribe(eingang_topic_2); // Subcription des Topics      
    } else {
      Serial.print("Fehler, rc=");
      Serial.print(mqtt_client.state());
      Serial.println(" versuche es in 5 Sekunden erneut");
      delay(5000); // 5 Sekunden Pause bevor neuer Versuch
    }
  }

//----MQTT-Verbindung----Ende--------------
//-----------------------------------------



}

void loop() {
  if (!mqtt_client.connected()) { reconnect(); }
  mqtt_client.loop();

  
  
  long now = millis();
  char msg[100];        // Wird für Nachricht verwendet
  // Nachricht im 5 Sekundentakt übermitteln
  if (now - lastMsg > STATUS_RATE) {
    lastMsg = now;
    ++counter;
    snprintf(msg, 75, "ESP32_no03 -> INTERVALLMSG #%ld", counter);
    Serial.print("Publish message: ");
    Serial.println(msg);
    mqtt_client.publish(MQTT_statustopic, msg);
  }

  //u8g2.clearBuffer();          // clear the internal memory
  //u8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
  //u8g2.drawStr(0,10, Wert_str);  // write something to the internal memory
  //u8g2.sendBuffer();          // transfer internal memory to the display


}

bis dann,
Steinspiel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.01.2021, 10:50
Beitrag #24
RE: MQTT Topic abbonieren?
Ich weiß nicht, ob payload ordentlich mit '\0' abgeschlossen ist. Probier mal
Code:
char tmp[10];
Serial.print(F("Laenge: "));
Serial.println(length);
strncpy(tmp,payload,length);
float f = atof(tmp);
Serial.println(f);
Wenn Laenge >9 ist, musst Du tmp vergrößern.

Hast Du den Exceptiondecoder schon installiert?

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Wemos d1 Ph Sonde - Hilfe bei Daten per MQTT senden SoerenKaiser99 23 495 10.05.2021 21:25
Letzter Beitrag: SoerenKaiser99
  Einer RGB-LED am ESP Werte aus MQTT zuweisen. Manny 2 403 15.04.2021 16:50
Letzter Beitrag: Manny
  Erfahrungen mit ESP32 und WLAN/MQTT oder was ich beobachtet habe... Arduino4Fun 23 4.296 09.04.2021 16:15
Letzter Beitrag: amshh
  BUILTIN_LED vom ESP mit MQTT und NodeRed schalten. Manny 7 742 22.03.2021 18:24
Letzter Beitrag: Manny
  433MHz-WiFi-MQTT-Sender nbk83 25 2.381 04.01.2021 16:35
Letzter Beitrag: nbk83
  Wo MQTT LogIn Daten einfügen? Steinspiel 10 1.277 28.12.2020 14:32
Letzter Beitrag: Tommy56
  Sensorausgabe mit MQTT publishen ? Steinspiel 14 1.509 16.12.2020 13:06
Letzter Beitrag: biologist
  Hilfe bei async-mqtt-client für ESP32 amshh 7 1.198 12.11.2020 09:19
Letzter Beitrag: amithlon
  DHT11 Daten via MQTT an Raspi senden Hanibal_Smith 5 849 10.11.2020 16:24
Letzter Beitrag: biologist
  wert an client schicken während Deepsleep mqtt & ibroker stevensen 13 1.467 06.11.2020 21:07
Letzter Beitrag: nbk83

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste