Hallo zusammen,
ich komme nicht so wirklich weiter mit dieser MQTT Einbindung in den ESP.
Was ich hinbekomme ist, dass ich von einem ESP ein Topic senden kann und im
MQTT Broker (Mosquitto) auch das Empfangene sehe. ( hier eine 0 oder 1)
Siehe hier den Sender ESP / Angeschlossen ist ein Endschalter an d1
- #include <ESP8266WiFi.h> /* Biblothek für WiFi Verbindung */
- #include <ESP8266WebServer.h> /* Biblothek für WebServer */
- #include <ESP8266mDNS.h> /* Biblothek für DNS Server */
- #include <PubSubClient.h>
- #define endschalter_topic "schenk/schalfzimmer/endschalter"
- ESP8266WebServer server(80);
- const char* ssid = "xxxxx";
- const char* password = "xxxxx";
- const char* MQTT_BROKER = "192.168.1.161";
- WiFiClient schenk; /* MQTT */
- PubSubClient client(schenk); /* MQTT */
- long lastMsg = 0; /* MQTT */
- char msg[50]; /* MQTT */
- int value = 0; /* MQTT */
- char zustand[50];
- // following for the name of: http://schalter.local/
- const char* dns_name = "schalter";
- int d1 = 5; /* Variable PIN definition */
- int d1_status = 0; /* Variable für den PIN Status */
- boolean lastButtonState1 = 1; /* StatusMerker, merkt sich den Schaltzustand des PIN*/
- /* Start Setup */
- void setup()
- {
- Serial.begin(115200);
- Serial.println("ESP Gestartet");
- client.setServer(MQTT_BROKER, 1883); /* MQTT */
- client.setClient(schenk); /* MQTT */
- pinMode(d1, INPUT); /* Es wird definert ob der PIN INPUT od. OUTPUT ist */
- WiFi.begin(ssid, password);
- Serial.print("Verbindung wird hergestellt ...");
- while (WiFi.status() != WL_CONNECTED)
- {
- delay(500);
- Serial.print(".");
- }
- Serial.println();
- Serial.print("Verbunden! IP-Adresse: ");
- Serial.println(WiFi.localIP());
- if (MDNS.begin(dns_name)) {
- Serial.println("DNS gestartet, erreichbar unter: ");
- Serial.println("http://" + String(dns_name) + ".local/");
- }
- server.onNotFound([]() {
- server.send(404, "text/plain", "Link wurde nicht gefunden!");
- });
- server.on("/", []() {
- server.send(200, "text/plain", "ESP-Startseite!");
- });
- server.begin();
- Serial.println("Webserver gestartet.");
- }
- /* ENDE Setup */
- /* Sart Loop */
- void loop() {
- if (!client.connected()) {
- reconnect();
- }
- client.loop();
- int d1_status = digitalRead(d1);
- if (d1_status != lastButtonState1) {
- Serial.println(String(int(d1_status)));
- client.publish(endschalter_topic, String(d1_status).c_str(), true); //hier sendet der ESP den Status 0 oder 1
- }
- lastButtonState1 = d1_status;
- }
- /* ENDE Loop */
- void reconnect() {
- while (!client.connected()) {
- Serial.print("Reconnecting...");
- if (!client.connect("ESP8266Client")) {
- Serial.print("failed, rc=");
- Serial.print(client.state());
- Serial.println(" retrying in 5 seconds");
- delay(5000);
- }
- }
- }
Hier noch ein Foto des MQTT Broker, respektive des MQTTfx Tool
Nun bis dahin alles paletti
ABER jetzt:
Wie kann ich auf einem anderen ESP diese Daten (0 und 1) empfangen und für den weiteren
Programmablauf verwenden???
Hier mal ein kläglicher versuch, aber wo ist den jetzt meine 0 oder 1 ???
- #include <ESP8266WebServer.h> /* Biblothek für WebServer */
- #include <ESP8266WiFi.h> /* Biblothek für WiFi Verbindung */
- #include <ESP8266mDNS.h> /* Biblothek für DNS Server */
- #include <PubSubClient.h>
- #define endschalter_topic "schenk/schalfzimmer/endschalter"
- ESP8266WebServer server(80);
- const char* ssid = "xxxxx";
- const char* password = "xxxxxx;
- const char* MQTT_BROKER = "192.168.1.161";
- WiFiClient espClient; /* MQTT */
- PubSubClient client(espClient); /* MQTT */
- long lastMsg = 0; /* MQTT */
- char msg[50]; /* MQTT */
- int value = 0; /* MQTT */
- // following for the name of: http://relais.local/
- const char* dns_name = "relais";
- int d1 = 5; /* Variable PIN definition */
- int d1_status = 0; /* Variable für den PIN Status */
- boolean lastButtonState = 1; /* StatusMerker, merkt sich den Schaltzustand des PIN*/
- unsigned long previousMillis = 0; /* gehört zur Verweilzeit ohne delay(): */
- const long interval = 1000; /* gehört zur Verweilzeit 1000 = 1sek. (Interval) */
- /* Start Setup */
- void setup()
- {
- Serial.begin(115200);
- Serial.println("ESP Gestartet");
- client.setServer(MQTT_BROKER, 1883); /* MQTT */
- client.setCallback(callback); /* MQTT */
- pinMode(d1, OUTPUT); /* Es wird definert ob der PIN INPUT od. OUTPUT ist */
- WiFi.begin(ssid, password);
- Serial.print("Verbindung wird hergestellt ...");
- while (WiFi.status() != WL_CONNECTED)
- {
- delay(500);
- Serial.print(".");
- }
- Serial.println();
- Serial.print("Verbunden! IP-Adresse: ");
- Serial.println(WiFi.localIP());
- if (MDNS.begin(dns_name)) {
- Serial.println("DNS gestartet, erreichbar unter: ");
- Serial.println("http://" + String(dns_name) + ".local/");
- }
- while (!client.connected()) {
- Serial.println("Connecting to MQTT...");
- if (client.connect("ESP8266Client")) {
- Serial.println("connected");
- } else {
- Serial.print("failed with state ");
- Serial.print(client.state());
- delay(2000);
- }
- }
- }
- /* ENDE Setup */
- /* Sart Loop */
- void loop() {
- if ( !client.connected() ) {
- reconnect();
- client.subscribe("schenk/schalfzimmer/endschalter");
- }
- }
- /* ENDE Loop */
- /* Start Unterprogramme */
- void reconnect() {
- while (!client.connected()) {
- Serial.print("Reconnecting...");
- if (!client.connect("ESP8266Client")) {
- Serial.print("failed, rc=");
- Serial.print(client.state());
- Serial.println(" retrying in 5 seconds");
- delay(5000);
- }
- }
- }
- void callback(char* topic, byte* payload, unsigned int length) {
- Serial.print("Message arrived [");
- Serial.print(topic);
- Serial.print("] ");
- for (int i = 0; i < length; i++) {
- Serial.print((char)payload[i]);
- }
- Serial.println();
- if ((char)payload[0] == '1') {
- digitalWrite(d1, LOW);
- } else {
- digitalWrite(d1, HIGH);
- }
- }
An diesem ESP hängt ein Relais an d1 und soll schalten je nach topic Input 0 oder 1.
Ich glaube ich habe das was kpl. nicht mitgeschnitten.
Kann da evtl wer helfen??
Und klein Zusatzfrage, wo liegt den jetzt der Vorteil zum
HTTP senden/empfangen
sender.begin("http://192.168.1.148/sensor_state");
sender.GET();
Ich raff das nicht so ganz.
Gruss Thomas