Problem bei 2x ESP32 und MQTT

Hallo Leute,

ich bin gerade mit einem neuen Experiment beschäftigt und stoße vor ein MQTT problem und hoffe mir kann hier geholfen werden.

Ich habe 2 ESP32 mit folgenden Codes:

  1. ESP (Daten per Serieller-Schnittstelle empfangen und per MQTT senden):
#include <WiFi.h>                       // Bibliethek laden für Wlan
#include <PubSubClient.h>     // Bibliothek laden für MQTT

int led = 21;


// Zugangsdaten für Wlan
const char* ssid = "SSID";
const char* password = "Passwort";

// IP-Adresse vom MQTT Broker
const char* mqtt_server = "192.168.178.30";

//Text Splitten String

String split(String s, char parser, int index) {
  String rs="";
  int parserIndex = index;
  int parserCnt=0;
  int rFromIndex=0, rToIndex=-1;
  while (index >= parserCnt) {
    rFromIndex = rToIndex+1;
    rToIndex = s.indexOf(parser,rFromIndex);
    if (index == parserCnt) {
      if (rToIndex == 0 || rToIndex == -1) return "";
      return s.substring(rFromIndex,rToIndex);
    } else parserCnt++;
  }
  return rs;
}

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

void setup(){

pinMode(led, OUTPUT);

  Serial.begin(115200);
  // default settings
  // (you can also pass in a Wire library object like &Wire2)
  //status = bme.begin();  
  setup_wifi();
  client.setServer(mqtt_server, 1883);
//  client.setCallback(callback);
}

void setup_wifi() {
  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP8266Client")) {
      Serial.println("connected");
      // Subscribe
      client.subscribe("MoBa/#");
      client.publish("MoBa/Display/HBF/Gleis1","Hallo");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
void loop() {
  if (!client.connected()) {
    reconnect();
  }
   // Daten vom COM-Port empfangen
    if(Serial.available() >0) {
    String incomingString = Serial.readString();
    char Anzeige[80];
    digitalWrite(led, true);
    Serial.println(incomingString);
    incomingString.toCharArray(Anzeige,70);
    client.publish("MoBa/Display/HBF/Gleis1",Anzeige); 
    client.publish("MoBa/Display/HBF/Gleis1","Hallo, Test");
    delay(1000);
    digitalWrite(led, false);
  client.loop();
    }
}
  1. ESP (MQTT Empfangen und auf LCD-Display senden)
/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com  
*********/

#include <WiFi.h>                       // Bibliethek laden für Wlan
#include <PubSubClient.h>               // Bibliothek laden für MQTT
#include <LiquidCrystal_I2C.h>          // Bibliothek laden für LCD Display

LiquidCrystal_I2C lcd(0x27, 16, 2);     // Adresse (0x27), Anzahl Spalten (16) und Anzahl Zeilen (2)

// Zugangsdaten für Wlan
const char* ssid = "SSID";
const char* password = "Passwort";

// IP-Adresse vom MQTT Broker
const char* mqtt_server = "192.168.178.30";

//Text Splitten String

String split(String s, char parser, int index) {
  String rs="";
  int parserIndex = index;
  int parserCnt=0;
  int rFromIndex=0, rToIndex=-1;
  while (index >= parserCnt) {
    rFromIndex = rToIndex+1;
    rToIndex = s.indexOf(parser,rFromIndex);
    if (index == parserCnt) {
      if (rToIndex == 0 || rToIndex == -1) return "";
      return s.substring(rFromIndex,rToIndex);
    } else parserCnt++;
  }
  return rs;
}

WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;

void setup() {

  lcd.init();
  lcd.backlight();
  
  Serial.begin(115200);
  // default settings
  // (you can also pass in a Wire library object like &Wire2)
  //status = bme.begin();  
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}

void setup_wifi() {
  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
    lcd.setCursor(0,0);
  lcd.print("WiFi connected");
}

void callback(char* topic, byte* message, unsigned int length) {
  Serial.print("Message arrived on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  String messageTemp;
  
  for (int i = 0; i < length; i++) {
    Serial.println();
    Serial.print((char)message[i]);
    messageTemp += (char)message[i];
  }
  Serial.println();
//  Serial.println (messageTemp);
  // Feel free to add more if statements to control more GPIOs with MQTT

  // If a message is received on the topic esp32/output, you check if the message is either "on" or "off". 
  // Changes the output state according to the message
  if (String(topic) == "MoBa/Display/HBF/Gleis1") {


  
  // Test zu Disply schicken
  String Linie = split(messageTemp, '/',0);
  String Zeit = split(messageTemp, '/',1);
  String Strecke = split(messageTemp, '/',2);
  String Ziel = split(messageTemp, '/',3);
  
  int Laenge = Zeit.length();
  int index = Laenge - 7;
  Zeit.remove(index);

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(Linie);
  lcd.setCursor(11,0);
  lcd.print(Zeit);
  lcd.setCursor(0,1);
  lcd.print(Ziel);
  }
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP8266Client")) {
      Serial.println("connected");
      lcd.setCursor(0,1);
      lcd.print("MQTT connected");
      // Subscribe
      client.subscribe("MoBa/#");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      lcd.setCursor(0,1);
      lcd.print("MQTT waiting");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

}

VBS-Datei (Von wo aus die Daten zum 1. ESP weitergeleitet werden)

set fso = CreateObject("Scripting.FileSystemObject")
set com = fso.OpenTextfile("COM6:9600,N,8,1", 2, True, -2)
set Args = wscript.Arguments

Out =""
For Each Arg in Args
	Out = Out &"" & Arg
Next

'Out ="Dummdidumm"
'MsgBox Out

wscript.sleep(5000)
com.write(Out)
com.close()

Folgendes Problem:

Wenn ich jeweils einen der beiden ESP´s anschließe, dann funktioniert die übertragung Problemlos.

ESP1 sendet die Daten braf ins MQTT

ESP2 empfängt die Daten aus dem MQTT und sendet die auf den LCD

wenn ich aber beide einschalte (ESP1 am PC, ESP2 an eine Steckdose) dann klappt das senden beim 1. ESP nicht mehr, ich bekomme im MQTT nur das "Hallo" aus dem void Setup angezeigt, aber die Daten die per Serieller schnittstelle kommen, werden nicht published. Das was passiert, habe ich mit der LED getestet, die ich hinter if(Serial.available() >0) in den void Loop gesetzt habe.

Vielen Dank schonmal

Gruß Torsten

Sorry...falsch gelesen.

Hat sich erledigt, Fehler gefunden!!

if (client.connect("ESP32Client")) {

hier sollte man bei beiden ESP unterschiedliche Namen eintragen!

Ist mir aber auch erst aufgefallen, als ich mir den Beitrag nochmal durchgelesen habe

Das sind eh die besten Fehler, die man selbst findet und lösen kann.
Setze bitte noch den gelöst Haken.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.