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:
- 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();
}
}
- 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