NEWS
GPIO Status Wemos d1 mini an iobroker senden
-
Ich stehe normal auch auf ESP. Aber ich habe hier nun mal ein Skript welchse so gut l
ä
uft.Da ESP nicht wirklich gut Steppermotoren ansprechen kann, mu
ß
ich es so machen. -
Ich stehe normal auch auf ESP. Aber ich habe hier nun mal ein Skript welchse so gut l
ä
uft.Da ESP nicht wirklich gut Steppermotoren ansprechen kann, mu
ß
ich es so machen.@beowolf said in GPIO Status Wemos d1 mini an iobroker senden:
Da ESP nicht wirklich gut Steppermotoren ansprechen kann
Wie kommt's? Die esphome stepper component ist dir aber bekannt?
wie kann ich auf sehr einfache Weise den GPIO Status an iobroker senden?
mit esphome reicht daf
ü
r dieser Vierzeiler hier wenn dein esphome node mittels api mit der Zentrale spricht:binary_sensor: - platform: gpio pin: 3 name: "Tür"viel einfacher wird es wohl nicht mehr werden

-
@beowolf said in GPIO Status Wemos d1 mini an iobroker senden:
Da ESP nicht wirklich gut Steppermotoren ansprechen kann
Wie kommt's? Die esphome stepper component ist dir aber bekannt?
wie kann ich auf sehr einfache Weise den GPIO Status an iobroker senden?
mit esphome reicht daf
ü
r dieser Vierzeiler hier wenn dein esphome node mittels api mit der Zentrale spricht:binary_sensor: - platform: gpio pin: 3 name: "Tür"viel einfacher wird es wohl nicht mehr werden

Ich hatte mich ein wenig mit esphome besch
ä
ftig. Ich habe aber im Moment nicht wirklich die Zeit daf
ü
r mich dort einzulesen und die Dinge zu probieren. -
@beowolf said in GPIO Status Wemos d1 mini an iobroker senden:
nicht wirklich die Zeit daf
ü
r mich dort einzulesen und die Dinge zu probieren.kommt vor

Da ESP nicht wirklich gut Steppermotoren ansprechen kann
Aber dann ist wohl weniger das Problem das esp(home?) nicht gut Steppermotoren ansprechen kann sondern eher das du nicht wirklich gut mit esphome "umgehen" kannst?

F
ü
r Leute mit Programmierkenntnissen wirkt der "no code approach" von esphome zu beginn manchmal "komplexer" als f
ü
r Leute die nicht programmieren k
ö
nnen
Allerdings kannst du esphome nat
ü
rlich auch mit lambda f
ü
ttern, wenn gew
ü
nscht 
-
@beowolf said in GPIO Status Wemos d1 mini an iobroker senden:
nicht wirklich die Zeit daf
ü
r mich dort einzulesen und die Dinge zu probieren.kommt vor

Da ESP nicht wirklich gut Steppermotoren ansprechen kann
Aber dann ist wohl weniger das Problem das esp(home?) nicht gut Steppermotoren ansprechen kann sondern eher das du nicht wirklich gut mit esphome "umgehen" kannst?

F
ü
r Leute mit Programmierkenntnissen wirkt der "no code approach" von esphome zu beginn manchmal "komplexer" als f
ü
r Leute die nicht programmieren k
ö
nnen
Allerdings kannst du esphome nat
ü
rlich auch mit lambda f
ü
ttern, wenn gew
ü
nscht 
Zur
ü
ck zu meiner Frage.Ich habe jetzt das mit eingef
ü
gt// Schaltzustände übermitteln if(digitalRead(pinTuerZu)){ client.publish("Hühnertür/Innen/Tür zu", "1"); } else { client.publish("Hühnertür/Innen/Tür zu", "0"); } if(digitalRead(pinTuerAuf)){ client.publish("Hühnertür/Innen/Tür auf", "1"); } else { client.publish("Hühnertür/Innen/Tür auf", "0"); } if(digitalRead(pinTasterStopp)){ client.publish("Hühnertür/Innen/Stop", "1"); } else { client.publish("Hühnertür/Innen/Stop", "0"); }und
// MQTT Funktion // ************* void connectToMQTT() { client.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port if (client.connect(clientId , mqtt_user, mqtt_password)) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); }Unter ioBroker erscheinen die Daten, leider werden die
Ä
nderungen aber nicht angezeigt.Wo habe ich den Fehler?
Hier noch mal der komplette Code
#include <ESP8266WiFi.h> #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> #include <ESP8266WebServer.h> #include <PubSubClient.h> WiFiClient espClient; PubSubClient client(espClient); #ifndef STASSID #define STASSID "---" #define STAPSK "------" #endif ESP8266WebServer server(80); #include <AccelStepper.h> #include <Adafruit_NeoPixel.h> const char* ssid = STASSID; const char* password = STAPSK; const char* mqtt_server = "192.168.--.--"; const int mqtt_port = 1886; const char* mqtt_user = "----"; const char* mqtt_password = "---------"; char* clientId = "Hühnerklappe"; //WiFiServer server(80); AccelStepper stepper(1, D3, D4); //Pins für den Steppermotor STEP , DIR #define ProgrammstartTuerAuf D0 #define Enable D2 // Steppermotor aktivieren/deaktivieren #define PIN 3 // Umgesteuerter GPIO für die NEO-Led #define NUMPIXELS 1 // Anzal der LEDs const byte pinTuerAuf = D6; // Endschalter Tür offen const byte pinTuerZu = D5; // Endschalter Tür geschlossen const byte pinTasterAuf = D0; // Taster Tür öffnen const byte pinTasterZu = D7; // Taster Tür schließen const byte pinTasterStopp = D1; // Taster Bewegung anhalten const long SchritteUmdrehung = 200; // Schritte des Schrittmotors für 360 Grad der Tür const unsigned int TuerbewegungZu = -15000; const unsigned int TuerbewegungAuf = 15000; enum ZUSTAENDE {MANUELL, TUERZU, OEFFNEN, TUERAUF, SCHLIESSEN}; byte zustand = MANUELL; Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800); void setup() { //GPIO Umsteuerung //GPIO 1 (TX) swap the pin to a GPIO. pinMode(1, FUNCTION_3); //GPIO 3 (RX) swap the pin to a GPIO. pinMode(3, FUNCTION_3); Serial.begin(9600); // Per WLAN mit dem Netzwerk verbinden Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } /////////////////////// ArduinoOTA.onStart([]() { String type; if (ArduinoOTA.getCommand() == U_FLASH) { type = "sketch"; } else { // U_FS type = "filesystem"; } // NOTE: if updating FS this would be the place to unmount FS using FS.end() Serial.println("Start updating " + type); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); } else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); } else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); } else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); } else if (error == OTA_END_ERROR) { Serial.println("End Failed"); } }); ArduinoOTA.begin(); //} ////////////////////// // Die IP vom Webserver auf dem seriellen Monitor ausgeben Serial.println(""); Serial.println("WLAN verbunden."); Serial.println("IP Adresse: "); Serial.println(WiFi.localIP()); connectToMQTT(); server.onNotFound([](){ server.send(404, "text/plain", "Link wurde nicht gefunden!"); }); server.on("/", []() { server.send(200, "text/plain", "Startseite"); }); server.on("/WebTuerAuf", []() { server.send(200, "text/plain", "Tuer wird geoeffnet."); WebTuerAuf(); }); server.on("/WebTuerZu", []() { server.send(200, "text/plain", "Tuer wird geschlossen."); WebTuerZu(); }); server.begin(); Serial.println("Webserver gestartet."); pixels.begin(); // This initializes the NeoPixel library. Serial.println("Programmanfang"); pinMode(PIN, OUTPUT); // NEO-LED pinMode(pinTuerAuf, INPUT_PULLUP); // Endschalter Tür offen pinMode(pinTuerZu, INPUT_PULLUP); // Endschalter Tür geschlossen pinMode(pinTasterAuf, INPUT_PULLUP); // Taster Tür öffnen pinMode(pinTasterZu, INPUT_PULLUP); // Taster Tür schließen pinMode(pinTasterStopp, INPUT_PULLUP); // Taster Bewegung anhalten pinMode(ProgrammstartTuerAuf, OUTPUT); stepper.setMaxSpeed(1000); stepper.setAcceleration(1500); pinMode(Enable, OUTPUT); // Enable Motor 1 } void loop() { ArduinoOTA.handle(); ArduinoOTA.setHostname("Huehnerklappe"); server.handleClient(); digitalWrite(Enable, LOW); //Motor aktiviert stepper.run(); digitalWrite(ProgrammstartTuerAuf, digitalRead(pinTuerAuf)); if (!digitalRead(pinTasterStopp)) { zustand = MANUELL; pixels.setPixelColor(0, pixels.Color(255,255,255)); //LED Farbe weiss pixels.show(); } switch (zustand) { case MANUELL: if ((!digitalRead(pinTasterAuf)) && (digitalRead(pinTuerAuf))) { stepper.move(10); } else if ((!digitalRead(pinTasterZu)) && (digitalRead(pinTuerZu))) { stepper.move(-10); } else { stopp(); } if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); } if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); } break; case TUERZU: stopp(); if (!digitalRead(pinTasterAuf)) { stepper.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } break; case OEFFNEN: if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); pixels.setPixelColor(0, pixels.Color(255,0,0)); //LED Farbe rot pixels.show(); } break; case TUERAUF: stopp(); if (!digitalRead(pinTasterZu)) { stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } break; case SCHLIESSEN: if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); pixels.setPixelColor(0, pixels.Color(0, 255,0)); //LED Farbe grün pixels.show(); } break; } // Schaltzustände übermitteln if(digitalRead(pinTuerZu)){ client.publish("Hühnertür/Innen/Tür zu", "1"); } else { client.publish("Hühnertür/Innen/Tür zu", "0"); } if(digitalRead(pinTuerAuf)){ client.publish("Hühnertür/Innen/Tür auf", "1"); } else { client.publish("Hühnertür/Innen/Tür auf", "0"); } if(digitalRead(pinTasterStopp)){ client.publish("Hühnertür/Innen/Stop", "1"); } else { client.publish("Hühnertür/Innen/Stop", "0"); } } long pos(int winkel) { return (winkel * SchritteUmdrehung / 360L); } void WebTuerAuf(){ stepper.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void WebTuerZu(){ stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void stopp() { stepper.stop(); digitalWrite(Enable, HIGH); //Motor deaktiviert } // MQTT Funktion // ************* void connectToMQTT() { client.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port if (client.connect(clientId , mqtt_user, mqtt_password)) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); } } -
Zur
ü
ck zu meiner Frage.Ich habe jetzt das mit eingef
ü
gt// Schaltzustände übermitteln if(digitalRead(pinTuerZu)){ client.publish("Hühnertür/Innen/Tür zu", "1"); } else { client.publish("Hühnertür/Innen/Tür zu", "0"); } if(digitalRead(pinTuerAuf)){ client.publish("Hühnertür/Innen/Tür auf", "1"); } else { client.publish("Hühnertür/Innen/Tür auf", "0"); } if(digitalRead(pinTasterStopp)){ client.publish("Hühnertür/Innen/Stop", "1"); } else { client.publish("Hühnertür/Innen/Stop", "0"); }und
// MQTT Funktion // ************* void connectToMQTT() { client.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port if (client.connect(clientId , mqtt_user, mqtt_password)) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); }Unter ioBroker erscheinen die Daten, leider werden die
Ä
nderungen aber nicht angezeigt.Wo habe ich den Fehler?
Hier noch mal der komplette Code
#include <ESP8266WiFi.h> #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> #include <ESP8266WebServer.h> #include <PubSubClient.h> WiFiClient espClient; PubSubClient client(espClient); #ifndef STASSID #define STASSID "---" #define STAPSK "------" #endif ESP8266WebServer server(80); #include <AccelStepper.h> #include <Adafruit_NeoPixel.h> const char* ssid = STASSID; const char* password = STAPSK; const char* mqtt_server = "192.168.--.--"; const int mqtt_port = 1886; const char* mqtt_user = "----"; const char* mqtt_password = "---------"; char* clientId = "Hühnerklappe"; //WiFiServer server(80); AccelStepper stepper(1, D3, D4); //Pins für den Steppermotor STEP , DIR #define ProgrammstartTuerAuf D0 #define Enable D2 // Steppermotor aktivieren/deaktivieren #define PIN 3 // Umgesteuerter GPIO für die NEO-Led #define NUMPIXELS 1 // Anzal der LEDs const byte pinTuerAuf = D6; // Endschalter Tür offen const byte pinTuerZu = D5; // Endschalter Tür geschlossen const byte pinTasterAuf = D0; // Taster Tür öffnen const byte pinTasterZu = D7; // Taster Tür schließen const byte pinTasterStopp = D1; // Taster Bewegung anhalten const long SchritteUmdrehung = 200; // Schritte des Schrittmotors für 360 Grad der Tür const unsigned int TuerbewegungZu = -15000; const unsigned int TuerbewegungAuf = 15000; enum ZUSTAENDE {MANUELL, TUERZU, OEFFNEN, TUERAUF, SCHLIESSEN}; byte zustand = MANUELL; Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800); void setup() { //GPIO Umsteuerung //GPIO 1 (TX) swap the pin to a GPIO. pinMode(1, FUNCTION_3); //GPIO 3 (RX) swap the pin to a GPIO. pinMode(3, FUNCTION_3); Serial.begin(9600); // Per WLAN mit dem Netzwerk verbinden Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } /////////////////////// ArduinoOTA.onStart([]() { String type; if (ArduinoOTA.getCommand() == U_FLASH) { type = "sketch"; } else { // U_FS type = "filesystem"; } // NOTE: if updating FS this would be the place to unmount FS using FS.end() Serial.println("Start updating " + type); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); } else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); } else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); } else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); } else if (error == OTA_END_ERROR) { Serial.println("End Failed"); } }); ArduinoOTA.begin(); //} ////////////////////// // Die IP vom Webserver auf dem seriellen Monitor ausgeben Serial.println(""); Serial.println("WLAN verbunden."); Serial.println("IP Adresse: "); Serial.println(WiFi.localIP()); connectToMQTT(); server.onNotFound([](){ server.send(404, "text/plain", "Link wurde nicht gefunden!"); }); server.on("/", []() { server.send(200, "text/plain", "Startseite"); }); server.on("/WebTuerAuf", []() { server.send(200, "text/plain", "Tuer wird geoeffnet."); WebTuerAuf(); }); server.on("/WebTuerZu", []() { server.send(200, "text/plain", "Tuer wird geschlossen."); WebTuerZu(); }); server.begin(); Serial.println("Webserver gestartet."); pixels.begin(); // This initializes the NeoPixel library. Serial.println("Programmanfang"); pinMode(PIN, OUTPUT); // NEO-LED pinMode(pinTuerAuf, INPUT_PULLUP); // Endschalter Tür offen pinMode(pinTuerZu, INPUT_PULLUP); // Endschalter Tür geschlossen pinMode(pinTasterAuf, INPUT_PULLUP); // Taster Tür öffnen pinMode(pinTasterZu, INPUT_PULLUP); // Taster Tür schließen pinMode(pinTasterStopp, INPUT_PULLUP); // Taster Bewegung anhalten pinMode(ProgrammstartTuerAuf, OUTPUT); stepper.setMaxSpeed(1000); stepper.setAcceleration(1500); pinMode(Enable, OUTPUT); // Enable Motor 1 } void loop() { ArduinoOTA.handle(); ArduinoOTA.setHostname("Huehnerklappe"); server.handleClient(); digitalWrite(Enable, LOW); //Motor aktiviert stepper.run(); digitalWrite(ProgrammstartTuerAuf, digitalRead(pinTuerAuf)); if (!digitalRead(pinTasterStopp)) { zustand = MANUELL; pixels.setPixelColor(0, pixels.Color(255,255,255)); //LED Farbe weiss pixels.show(); } switch (zustand) { case MANUELL: if ((!digitalRead(pinTasterAuf)) && (digitalRead(pinTuerAuf))) { stepper.move(10); } else if ((!digitalRead(pinTasterZu)) && (digitalRead(pinTuerZu))) { stepper.move(-10); } else { stopp(); } if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); } if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); } break; case TUERZU: stopp(); if (!digitalRead(pinTasterAuf)) { stepper.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } break; case OEFFNEN: if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); pixels.setPixelColor(0, pixels.Color(255,0,0)); //LED Farbe rot pixels.show(); } break; case TUERAUF: stopp(); if (!digitalRead(pinTasterZu)) { stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } break; case SCHLIESSEN: if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); pixels.setPixelColor(0, pixels.Color(0, 255,0)); //LED Farbe grün pixels.show(); } break; } // Schaltzustände übermitteln if(digitalRead(pinTuerZu)){ client.publish("Hühnertür/Innen/Tür zu", "1"); } else { client.publish("Hühnertür/Innen/Tür zu", "0"); } if(digitalRead(pinTuerAuf)){ client.publish("Hühnertür/Innen/Tür auf", "1"); } else { client.publish("Hühnertür/Innen/Tür auf", "0"); } if(digitalRead(pinTasterStopp)){ client.publish("Hühnertür/Innen/Stop", "1"); } else { client.publish("Hühnertür/Innen/Stop", "0"); } } long pos(int winkel) { return (winkel * SchritteUmdrehung / 360L); } void WebTuerAuf(){ stepper.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void WebTuerZu(){ stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void stopp() { stepper.stop(); digitalWrite(Enable, HIGH); //Motor deaktiviert } // MQTT Funktion // ************* void connectToMQTT() { client.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port if (client.connect(clientId , mqtt_user, mqtt_password)) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); } }@beowolf sagte in GPIO Status Wemos d1 mini an iobroker senden:
client.publish("H
ü
hnert
ü
r/Innen/T
ü
r zu", "1");Meine Arduino-Kenntnisse sind zwar paar Tage alt, aber in den ioB-Objekten sind normalerweise keine Sonder- und Leerzeichen erlaubt. Ev. kann er deswegen nicht publishen.
client.publish("Huehnertuer/Innen/Tuer_zu", "1"); -
@beowolf sagte in GPIO Status Wemos d1 mini an iobroker senden:
client.publish("H
ü
hnert
ü
r/Innen/T
ü
r zu", "1");Meine Arduino-Kenntnisse sind zwar paar Tage alt, aber in den ioB-Objekten sind normalerweise keine Sonder- und Leerzeichen erlaubt. Ev. kann er deswegen nicht publishen.
client.publish("Huehnertuer/Innen/Tuer_zu", "1"); -
@sborg
N
ö
, keine
Ä
nderung.Mu
ß
da nicht eine wie auch immer "Zeitschleife" rein? Also das alle z.B. zwei Minuten geschaut wird ob sich etwas ver
ä
ndert hat?So, habe es jetzt ein wenig ver
ä
ndert.#include <ESP8266WiFi.h> #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> #include <ESP8266WebServer.h> #include <PubSubClient.h> WiFiClient espClient; PubSubClient client(espClient); #ifndef STASSID #define STASSID "---" #define STAPSK "-------------" #endif ESP8266WebServer server(80); #include <AccelStepper.h> #include <Adafruit_NeoPixel.h> const char* ssid = STASSID; const char* password = STAPSK; char* clientId = "Huehnerklappe"; const char* mqtt_server = "192.168.--.--"; const int mqtt_port = 1886; const char* mqtt_user = "-----"; const char* mqtt_password = "------"; //WiFiServer server(80); AccelStepper stepper(1, D3, D4); //Pins für den Steppermotor STEP , DIR #define ProgrammstartTuerAuf D0 #define Enable D2 // Steppermotor aktivieren/deaktivieren #define PIN 3 // Umgesteuerter GPIO für die NEO-Led #define NUMPIXELS 1 // Anzal der LEDs const byte pinTuerAuf = D6; // Endschalter Tür offen const byte pinTuerZu = D5; // Endschalter Tür geschlossen const byte pinTasterAuf = D0; // Taster Tür öffnen const byte pinTasterZu = D7; // Taster Tür schließen const byte pinTasterStopp = D1; // Taster Bewegung anhalten const long SchritteUmdrehung = 200; // Schritte des Schrittmotors für 360 Grad der Tür const unsigned int TuerbewegungZu = -15000; const unsigned int TuerbewegungAuf = 15000; enum ZUSTAENDE {MANUELL, TUERZU, OEFFNEN, TUERAUF, SCHLIESSEN}; byte zustand = MANUELL; Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800); void setup() { //GPIO Umsteuerung //GPIO 1 (TX) swap the pin to a GPIO. pinMode(1, FUNCTION_3); //GPIO 3 (RX) swap the pin to a GPIO. pinMode(3, FUNCTION_3); Serial.begin(9600); // Per WLAN mit dem Netzwerk verbinden Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } /////////////////////// ArduinoOTA.onStart([]() { String type; if (ArduinoOTA.getCommand() == U_FLASH) { type = "sketch"; } else { // U_FS type = "filesystem"; } // NOTE: if updating FS this would be the place to unmount FS using FS.end() Serial.println("Start updating " + type); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); } else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); } else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); } else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); } else if (error == OTA_END_ERROR) { Serial.println("End Failed"); } }); ArduinoOTA.begin(); //} ////////////////////// // Die IP vom Webserver auf dem seriellen Monitor ausgeben Serial.println(""); Serial.println("WLAN verbunden."); Serial.println("IP Adresse: "); Serial.println(WiFi.localIP()); connectToMQTT(); server.onNotFound([](){ server.send(404, "text/plain", "Link wurde nicht gefunden!"); }); server.on("/", []() { server.send(200, "text/plain", "Startseite"); }); server.on("/WebTuerAuf", []() { server.send(200, "text/plain", "Tuer wird geoeffnet."); WebTuerAuf(); }); server.on("/WebTuerZu", []() { server.send(200, "text/plain", "Tuer wird geschlossen."); WebTuerZu(); }); server.begin(); Serial.println("Webserver gestartet."); pixels.begin(); // This initializes the NeoPixel library. Serial.println("Programmanfang"); pinMode(PIN, OUTPUT); // NEO-LED pinMode(pinTuerAuf, INPUT_PULLUP); // Endschalter Tür offen pinMode(pinTuerZu, INPUT_PULLUP); // Endschalter Tür geschlossen pinMode(pinTasterAuf, INPUT_PULLUP); // Taster Tür öffnen pinMode(pinTasterZu, INPUT_PULLUP); // Taster Tür schließen pinMode(pinTasterStopp, INPUT_PULLUP); // Taster Bewegung anhalten pinMode(ProgrammstartTuerAuf, OUTPUT); stepper.setMaxSpeed(1000); stepper.setAcceleration(1500); pinMode(Enable, OUTPUT); // Enable Motor 1 } void loop() { ArduinoOTA.handle(); ArduinoOTA.setHostname("Huehnerklappe"); server.handleClient(); digitalWrite(Enable, LOW); //Motor aktiviert stepper.run(); digitalWrite(ProgrammstartTuerAuf, digitalRead(pinTuerAuf)); if (!digitalRead(pinTasterStopp)) { zustand = MANUELL; pixels.setPixelColor(0, pixels.Color(255,255,255)); //LED Farbe weiss pixels.show(); } switch (zustand) { // Manuelle Steuerung case MANUELL: if ((!digitalRead(pinTasterAuf)) && (digitalRead(pinTuerAuf))) { stepper.move(10); } else if ((!digitalRead(pinTasterZu)) && (digitalRead(pinTuerZu))) { stepper.move(-10); } else { stopp(); } if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); } if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); } break; // Tür wird geöffnet case TUERZU: stopp(); if (!digitalRead(pinTasterAuf)) { stepper.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == HIGH){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "1"); client.publish("Huehnertuer/Innen/Tuer_auf", "0"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); client.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür ist offen case OEFFNEN: if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); pixels.setPixelColor(0, pixels.Color(255,0,0)); //LED Farbe rot pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == LOW){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); client.publish("Huehnertuer/Innen/Tuer_auf", "1"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); client.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür wir geschlossen case TUERAUF: stopp(); if (!digitalRead(pinTasterZu)) { stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == HIGH){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); client.publish("Huehnertuer/Innen/Tuer_auf", "0"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "1"); client.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür ist geschlossen case SCHLIESSEN: if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); pixels.setPixelColor(0, pixels.Color(0, 255,0)); //LED Farbe grün pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == LOW){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); client.publish("Huehnertuer/Innen/Tuer_auf", "0"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); client.publish("Huehnertuer/Innen/Tuer_zu", "1"); } } break; } } long pos(int winkel) { return (winkel * SchritteUmdrehung / 360L); } void WebTuerAuf(){ stepper.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == HIGH){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "1"); client.publish("Huehnertuer/Innen/Tuer_auf", "0"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); client.publish("Huehnertuer/Innen/Tuer_zu", "0"); } // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == LOW){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); client.publish("Huehnertuer/Innen/Tuer_auf", "1"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); client.publish("Huehnertuer/Innen/Tuer_zu", "0"); } pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void WebTuerZu(){ stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == HIGH){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); client.publish("Huehnertuer/Innen/Tuer_auf", "0"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "1"); client.publish("Huehnertuer/Innen/Tuer_zu", "0"); } // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == LOW){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); client.publish("Huehnertuer/Innen/Tuer_auf", "0"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); client.publish("Huehnertuer/Innen/Tuer_zu", "1"); } pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void stopp() { stepper.stop(); digitalWrite(Enable, HIGH); //Motor deaktiviert } // MQTT Funktion // ************* void connectToMQTT() { client.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port if (client.connect(clientId , mqtt_user, mqtt_password)) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); } }Wenn ich jetzt per Taster alles ansteuere, oder per Browser funktioniert es.
ABER
Wenn ich ein paar Minuten warte reagiert ioBroker nicht mehr. Ich mu
ß
erst dem Wemos D1 mini resetten.Was mache ich da noch falsch?
-
So, habe es jetzt ein wenig ver
ä
ndert.#include <ESP8266WiFi.h> #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> #include <ESP8266WebServer.h> #include <PubSubClient.h> WiFiClient espClient; PubSubClient client(espClient); #ifndef STASSID #define STASSID "---" #define STAPSK "-------------" #endif ESP8266WebServer server(80); #include <AccelStepper.h> #include <Adafruit_NeoPixel.h> const char* ssid = STASSID; const char* password = STAPSK; char* clientId = "Huehnerklappe"; const char* mqtt_server = "192.168.--.--"; const int mqtt_port = 1886; const char* mqtt_user = "-----"; const char* mqtt_password = "------"; //WiFiServer server(80); AccelStepper stepper(1, D3, D4); //Pins für den Steppermotor STEP , DIR #define ProgrammstartTuerAuf D0 #define Enable D2 // Steppermotor aktivieren/deaktivieren #define PIN 3 // Umgesteuerter GPIO für die NEO-Led #define NUMPIXELS 1 // Anzal der LEDs const byte pinTuerAuf = D6; // Endschalter Tür offen const byte pinTuerZu = D5; // Endschalter Tür geschlossen const byte pinTasterAuf = D0; // Taster Tür öffnen const byte pinTasterZu = D7; // Taster Tür schließen const byte pinTasterStopp = D1; // Taster Bewegung anhalten const long SchritteUmdrehung = 200; // Schritte des Schrittmotors für 360 Grad der Tür const unsigned int TuerbewegungZu = -15000; const unsigned int TuerbewegungAuf = 15000; enum ZUSTAENDE {MANUELL, TUERZU, OEFFNEN, TUERAUF, SCHLIESSEN}; byte zustand = MANUELL; Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800); void setup() { //GPIO Umsteuerung //GPIO 1 (TX) swap the pin to a GPIO. pinMode(1, FUNCTION_3); //GPIO 3 (RX) swap the pin to a GPIO. pinMode(3, FUNCTION_3); Serial.begin(9600); // Per WLAN mit dem Netzwerk verbinden Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } /////////////////////// ArduinoOTA.onStart([]() { String type; if (ArduinoOTA.getCommand() == U_FLASH) { type = "sketch"; } else { // U_FS type = "filesystem"; } // NOTE: if updating FS this would be the place to unmount FS using FS.end() Serial.println("Start updating " + type); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); } else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); } else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); } else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); } else if (error == OTA_END_ERROR) { Serial.println("End Failed"); } }); ArduinoOTA.begin(); //} ////////////////////// // Die IP vom Webserver auf dem seriellen Monitor ausgeben Serial.println(""); Serial.println("WLAN verbunden."); Serial.println("IP Adresse: "); Serial.println(WiFi.localIP()); connectToMQTT(); server.onNotFound([](){ server.send(404, "text/plain", "Link wurde nicht gefunden!"); }); server.on("/", []() { server.send(200, "text/plain", "Startseite"); }); server.on("/WebTuerAuf", []() { server.send(200, "text/plain", "Tuer wird geoeffnet."); WebTuerAuf(); }); server.on("/WebTuerZu", []() { server.send(200, "text/plain", "Tuer wird geschlossen."); WebTuerZu(); }); server.begin(); Serial.println("Webserver gestartet."); pixels.begin(); // This initializes the NeoPixel library. Serial.println("Programmanfang"); pinMode(PIN, OUTPUT); // NEO-LED pinMode(pinTuerAuf, INPUT_PULLUP); // Endschalter Tür offen pinMode(pinTuerZu, INPUT_PULLUP); // Endschalter Tür geschlossen pinMode(pinTasterAuf, INPUT_PULLUP); // Taster Tür öffnen pinMode(pinTasterZu, INPUT_PULLUP); // Taster Tür schließen pinMode(pinTasterStopp, INPUT_PULLUP); // Taster Bewegung anhalten pinMode(ProgrammstartTuerAuf, OUTPUT); stepper.setMaxSpeed(1000); stepper.setAcceleration(1500); pinMode(Enable, OUTPUT); // Enable Motor 1 } void loop() { ArduinoOTA.handle(); ArduinoOTA.setHostname("Huehnerklappe"); server.handleClient(); digitalWrite(Enable, LOW); //Motor aktiviert stepper.run(); digitalWrite(ProgrammstartTuerAuf, digitalRead(pinTuerAuf)); if (!digitalRead(pinTasterStopp)) { zustand = MANUELL; pixels.setPixelColor(0, pixels.Color(255,255,255)); //LED Farbe weiss pixels.show(); } switch (zustand) { // Manuelle Steuerung case MANUELL: if ((!digitalRead(pinTasterAuf)) && (digitalRead(pinTuerAuf))) { stepper.move(10); } else if ((!digitalRead(pinTasterZu)) && (digitalRead(pinTuerZu))) { stepper.move(-10); } else { stopp(); } if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); } if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); } break; // Tür wird geöffnet case TUERZU: stopp(); if (!digitalRead(pinTasterAuf)) { stepper.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == HIGH){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "1"); client.publish("Huehnertuer/Innen/Tuer_auf", "0"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); client.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür ist offen case OEFFNEN: if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); pixels.setPixelColor(0, pixels.Color(255,0,0)); //LED Farbe rot pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == LOW){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); client.publish("Huehnertuer/Innen/Tuer_auf", "1"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); client.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür wir geschlossen case TUERAUF: stopp(); if (!digitalRead(pinTasterZu)) { stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == HIGH){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); client.publish("Huehnertuer/Innen/Tuer_auf", "0"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "1"); client.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür ist geschlossen case SCHLIESSEN: if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); pixels.setPixelColor(0, pixels.Color(0, 255,0)); //LED Farbe grün pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == LOW){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); client.publish("Huehnertuer/Innen/Tuer_auf", "0"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); client.publish("Huehnertuer/Innen/Tuer_zu", "1"); } } break; } } long pos(int winkel) { return (winkel * SchritteUmdrehung / 360L); } void WebTuerAuf(){ stepper.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == HIGH){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "1"); client.publish("Huehnertuer/Innen/Tuer_auf", "0"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); client.publish("Huehnertuer/Innen/Tuer_zu", "0"); } // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == LOW){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); client.publish("Huehnertuer/Innen/Tuer_auf", "1"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); client.publish("Huehnertuer/Innen/Tuer_zu", "0"); } pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void WebTuerZu(){ stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == HIGH){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); client.publish("Huehnertuer/Innen/Tuer_auf", "0"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "1"); client.publish("Huehnertuer/Innen/Tuer_zu", "0"); } // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == LOW){ client.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); client.publish("Huehnertuer/Innen/Tuer_auf", "0"); client.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); client.publish("Huehnertuer/Innen/Tuer_zu", "1"); } pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void stopp() { stepper.stop(); digitalWrite(Enable, HIGH); //Motor deaktiviert } // MQTT Funktion // ************* void connectToMQTT() { client.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port if (client.connect(clientId , mqtt_user, mqtt_password)) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(client.state()); delay(2000); } }Wenn ich jetzt per Taster alles ansteuere, oder per Browser funktioniert es.
ABER
Wenn ich ein paar Minuten warte reagiert ioBroker nicht mehr. Ich mu
ß
erst dem Wemos D1 mini resetten.Was mache ich da noch falsch?
@beowolf "falsch" sehe ich so ad hoc nichts, aber es kann sein, dass die MQTT-Verbindung abbricht und er dann seitens des ESPs den MQTT-Adapter mit Anfragen "
ü
berf
ä
hrt".Du verbindest einmalig zum MQTT beim hochfahren/booten des ESP, danach pr
ü
fst du aber nie wieder ob die Verbindung
ü
berhaupt noch steht 
void MQTTreconnect() { if (!mqtt_client.connected()) { Serial.print("\nConnect to MQTT-Broker... "); // Connect and publish / subscribe if (mqtt_client.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.println("connected"); //Subscribe in Topics //mqtt_client.subscribe(_topic_); } else { // If weren't connected, we wait for 5 seconds and try again Serial.print("Failed, rc="); Serial.print(mqtt_client.state()); Serial.println(" try again in 5 seconds..."); delay(5000); } } } -
@beowolf "falsch" sehe ich so ad hoc nichts, aber es kann sein, dass die MQTT-Verbindung abbricht und er dann seitens des ESPs den MQTT-Adapter mit Anfragen "
ü
berf
ä
hrt".Du verbindest einmalig zum MQTT beim hochfahren/booten des ESP, danach pr
ü
fst du aber nie wieder ob die Verbindung
ü
berhaupt noch steht 
void MQTTreconnect() { if (!mqtt_client.connected()) { Serial.print("\nConnect to MQTT-Broker... "); // Connect and publish / subscribe if (mqtt_client.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.println("connected"); //Subscribe in Topics //mqtt_client.subscribe(_topic_); } else { // If weren't connected, we wait for 5 seconds and try again Serial.print("Failed, rc="); Serial.print(mqtt_client.state()); Serial.println(" try again in 5 seconds..."); delay(5000); } } }Ich ben
ö
tige noch mal einen TippDas Programm sieht jetzt so aus.
#include <ESP8266WiFi.h> #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> #include <ESP8266WebServer.h> #include <PubSubClient.h> #include <AccelStepper.h> #include <Adafruit_NeoPixel.h> WiFiClient espClient; PubSubClient mqttClient(espClient); #ifndef STASSID #define STASSID "----" #define STAPSK "-----" #endif #define ProgrammstartTuerAuf D0 #define Enable D2 // Steppermotor aktivieren/deaktivieren #define PIN 3 // Umgesteuerter GPIO für die NEO-Led #define NUMPIXELS 1 // Anzal der LEDs ESP8266WebServer server(80); const char* ssid = STASSID; const char* password = STAPSK; char* mqtt_client_id = "Huehnerklappe"; const char* mqtt_server = "192.168.----"; const int mqtt_port = 1886; const char* mqtt_user = "----"; const char* mqtt_password = "---------"; const byte pinTuerAuf = D6; // Endschalter Tür offen const byte pinTuerZu = D5; // Endschalter Tür geschlossen const byte pinTasterAuf = D0; // Taster Tür öffnen const byte pinTasterZu = D7; // Taster Tür schließen const byte pinTasterStopp = D1; // Taster Bewegung anhalten const long SchritteUmdrehung = 200; // Schritte des Schrittmotors für 360 Grad der Tür const unsigned int TuerbewegungZu = -15000; const unsigned int TuerbewegungAuf = 15000; enum ZUSTAENDE {MANUELL, TUERZU, OEFFNEN, TUERAUF, SCHLIESSEN}; byte zustand = MANUELL; AccelStepper stepper(1, D3, D4); //Pins für den Steppermotor STEP , DIR Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800); void setup() { //GPIO Umsteuerung //GPIO 1 (TX) swap the pin to a GPIO. pinMode(1, FUNCTION_3); //GPIO 3 (RX) swap the pin to a GPIO. pinMode(3, FUNCTION_3); Serial.begin(9600); // Per WLAN mit dem Netzwerk verbinden Serial.print("Verbinden mit "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } /////////////////////////////////////////// // Anfang Update über Wlan /////////////////////////////////////////// ArduinoOTA.onStart([]() { String type; if (ArduinoOTA.getCommand() == U_FLASH) { type = "sketch"; } else { // U_FS type = "filesystem"; } // NOTE: if updating FS this would be the place to unmount FS using FS.end() Serial.println("Start updating " + type); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); } else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); } else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); } else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); } else if (error == OTA_END_ERROR) { Serial.println("End Failed"); } }); ArduinoOTA.begin(); /////////////////////////////////////////// // Ende Update über Wlan /////////////////////////////////////////// // Die IP vom Webserver auf dem seriellen Monitor ausgeben Serial.println(""); Serial.println("WLAN verbunden."); Serial.println("IP Adresse: "); Serial.println(WiFi.localIP()); connectToMQTT(); // Mit ioBroker Mqtt verbinden server.onNotFound([](){ server.send(404, "text/plain", "Link wurde nicht gefunden!"); }); server.on("/", []() { server.send(200, "text/plain", "Startseite"); }); server.on("/WebTuerAuf", []() { server.send(200, "text/plain", "Tuer wird geoeffnet."); WebTuerAuf(); }); server.on("/WebTuerZu", []() { server.send(200, "text/plain", "Tuer wird geschlossen."); WebTuerZu(); }); server.begin(); Serial.println("Webserver gestartet."); pixels.begin(); // This initializes the NeoPixel library. Serial.println("Programmanfang"); pinMode(PIN, OUTPUT); // NEO-LED pinMode(pinTuerAuf, INPUT_PULLUP); // Endschalter Tür offen pinMode(pinTuerZu, INPUT_PULLUP); // Endschalter Tür geschlossen pinMode(pinTasterAuf, INPUT_PULLUP); // Taster Tür öffnen pinMode(pinTasterZu, INPUT_PULLUP); // Taster Tür schließen pinMode(pinTasterStopp, INPUT_PULLUP); // Taster Bewegung anhalten pinMode(ProgrammstartTuerAuf, OUTPUT); stepper.setMaxSpeed(1000); stepper.setAcceleration(1500); pinMode(Enable, OUTPUT); // Enable Motor 1 } void loop() { ArduinoOTA.handle(); ArduinoOTA.setHostname("Huehnerklappe"); server.handleClient(); mqttClient.loop(); digitalWrite(Enable, LOW); //Motor aktiviert stepper.run(); digitalWrite(ProgrammstartTuerAuf, digitalRead(pinTuerAuf)); if (!digitalRead(pinTasterStopp)) { zustand = MANUELL; pixels.setPixelColor(0, pixels.Color(255,255,255)); //LED Farbe weiss pixels.show(); } switch (zustand) { // Manuelle Steuerung case MANUELL: if ((!digitalRead(pinTasterAuf)) && (digitalRead(pinTuerAuf))) { stepper.move(10); } else if ((!digitalRead(pinTasterZu)) && (digitalRead(pinTuerZu))) { stepper.move(-10); } else { stopp(); } if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); } if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); } break; // Tür wird geöffnet case TUERZU: stopp(); if (!digitalRead(pinTasterAuf)) { stepper.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür ist offen case OEFFNEN: if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); pixels.setPixelColor(0, pixels.Color(255,0,0)); //LED Farbe rot pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür wir geschlossen case TUERAUF: stopp(); if (!digitalRead(pinTasterZu)) { stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür ist geschlossen case SCHLIESSEN: if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); pixels.setPixelColor(0, pixels.Color(0, 255,0)); //LED Farbe grün pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "1"); } } break; } } long pos(int winkel) { return (winkel * SchritteUmdrehung / 360L); } void WebTuerAuf(){ stepper.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void WebTuerZu(){ stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "1"); } pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void stopp() { stepper.stop(); digitalWrite(Enable, HIGH); //Motor deaktiviert } // MQTT Funktion // ************* void connectToMQTT() { mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.subscribe("Huehnertuer/Innen"); if (mqttClient.connect(mqtt_client_id , mqtt_user, mqtt_password)) { Serial.println("Per MQTT mit ioBroker verbunden"); } else { Serial.print("failed with state "); Serial.print(mqttClient.state()); delay(2000); } }Soweit funktioniert auch alles.
Was sich jetzt nat
ü
rlich anbietet ist, das die http-Kommandos durch mqtt-Befehle ersetzt werden k
ö
nnten.Ich habe da auch schon rumprobiert, aber ich verstehe es einfach nicht.
Was mu
ß
ich unter ioBroker machen?Ich hatte dieses hier schon mal eingef
ü
gt:void callback(char* topic, byte* payload, unsigned int length) { payload[length] = '\0'; String strTopic = String(topic); String strPayload = String((char * ) payload); if(strTopic == "Tuer") { if(strPayload == "false") Serial.println(strPayload); { digitalWrite(pinTasterZu, LOW); } if(strPayload == "true") Serial.println(strPayload); { digitalWrite(pinTasterAuf, LOW); } } }und weiter unten dieses hier
void connectToMQTT() { mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.subscribe("Huehnertuer"); if (mqttClient.connect(mqtt_client_id , mqtt_user, mqtt_password)) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(mqttClient.state()); delay(2000); }Ich komme da aber nicht weiter.
Eine einfache Anleitung w
ä
re event. nicht schlecht.Gr
ü
ß
e -
Ich ben
ö
tige noch mal einen TippDas Programm sieht jetzt so aus.
#include <ESP8266WiFi.h> #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> #include <ESP8266WebServer.h> #include <PubSubClient.h> #include <AccelStepper.h> #include <Adafruit_NeoPixel.h> WiFiClient espClient; PubSubClient mqttClient(espClient); #ifndef STASSID #define STASSID "----" #define STAPSK "-----" #endif #define ProgrammstartTuerAuf D0 #define Enable D2 // Steppermotor aktivieren/deaktivieren #define PIN 3 // Umgesteuerter GPIO für die NEO-Led #define NUMPIXELS 1 // Anzal der LEDs ESP8266WebServer server(80); const char* ssid = STASSID; const char* password = STAPSK; char* mqtt_client_id = "Huehnerklappe"; const char* mqtt_server = "192.168.----"; const int mqtt_port = 1886; const char* mqtt_user = "----"; const char* mqtt_password = "---------"; const byte pinTuerAuf = D6; // Endschalter Tür offen const byte pinTuerZu = D5; // Endschalter Tür geschlossen const byte pinTasterAuf = D0; // Taster Tür öffnen const byte pinTasterZu = D7; // Taster Tür schließen const byte pinTasterStopp = D1; // Taster Bewegung anhalten const long SchritteUmdrehung = 200; // Schritte des Schrittmotors für 360 Grad der Tür const unsigned int TuerbewegungZu = -15000; const unsigned int TuerbewegungAuf = 15000; enum ZUSTAENDE {MANUELL, TUERZU, OEFFNEN, TUERAUF, SCHLIESSEN}; byte zustand = MANUELL; AccelStepper stepper(1, D3, D4); //Pins für den Steppermotor STEP , DIR Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800); void setup() { //GPIO Umsteuerung //GPIO 1 (TX) swap the pin to a GPIO. pinMode(1, FUNCTION_3); //GPIO 3 (RX) swap the pin to a GPIO. pinMode(3, FUNCTION_3); Serial.begin(9600); // Per WLAN mit dem Netzwerk verbinden Serial.print("Verbinden mit "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } /////////////////////////////////////////// // Anfang Update über Wlan /////////////////////////////////////////// ArduinoOTA.onStart([]() { String type; if (ArduinoOTA.getCommand() == U_FLASH) { type = "sketch"; } else { // U_FS type = "filesystem"; } // NOTE: if updating FS this would be the place to unmount FS using FS.end() Serial.println("Start updating " + type); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); } else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); } else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); } else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); } else if (error == OTA_END_ERROR) { Serial.println("End Failed"); } }); ArduinoOTA.begin(); /////////////////////////////////////////// // Ende Update über Wlan /////////////////////////////////////////// // Die IP vom Webserver auf dem seriellen Monitor ausgeben Serial.println(""); Serial.println("WLAN verbunden."); Serial.println("IP Adresse: "); Serial.println(WiFi.localIP()); connectToMQTT(); // Mit ioBroker Mqtt verbinden server.onNotFound([](){ server.send(404, "text/plain", "Link wurde nicht gefunden!"); }); server.on("/", []() { server.send(200, "text/plain", "Startseite"); }); server.on("/WebTuerAuf", []() { server.send(200, "text/plain", "Tuer wird geoeffnet."); WebTuerAuf(); }); server.on("/WebTuerZu", []() { server.send(200, "text/plain", "Tuer wird geschlossen."); WebTuerZu(); }); server.begin(); Serial.println("Webserver gestartet."); pixels.begin(); // This initializes the NeoPixel library. Serial.println("Programmanfang"); pinMode(PIN, OUTPUT); // NEO-LED pinMode(pinTuerAuf, INPUT_PULLUP); // Endschalter Tür offen pinMode(pinTuerZu, INPUT_PULLUP); // Endschalter Tür geschlossen pinMode(pinTasterAuf, INPUT_PULLUP); // Taster Tür öffnen pinMode(pinTasterZu, INPUT_PULLUP); // Taster Tür schließen pinMode(pinTasterStopp, INPUT_PULLUP); // Taster Bewegung anhalten pinMode(ProgrammstartTuerAuf, OUTPUT); stepper.setMaxSpeed(1000); stepper.setAcceleration(1500); pinMode(Enable, OUTPUT); // Enable Motor 1 } void loop() { ArduinoOTA.handle(); ArduinoOTA.setHostname("Huehnerklappe"); server.handleClient(); mqttClient.loop(); digitalWrite(Enable, LOW); //Motor aktiviert stepper.run(); digitalWrite(ProgrammstartTuerAuf, digitalRead(pinTuerAuf)); if (!digitalRead(pinTasterStopp)) { zustand = MANUELL; pixels.setPixelColor(0, pixels.Color(255,255,255)); //LED Farbe weiss pixels.show(); } switch (zustand) { // Manuelle Steuerung case MANUELL: if ((!digitalRead(pinTasterAuf)) && (digitalRead(pinTuerAuf))) { stepper.move(10); } else if ((!digitalRead(pinTasterZu)) && (digitalRead(pinTuerZu))) { stepper.move(-10); } else { stopp(); } if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); } if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); } break; // Tür wird geöffnet case TUERZU: stopp(); if (!digitalRead(pinTasterAuf)) { stepper.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür ist offen case OEFFNEN: if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); pixels.setPixelColor(0, pixels.Color(255,0,0)); //LED Farbe rot pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür wir geschlossen case TUERAUF: stopp(); if (!digitalRead(pinTasterZu)) { stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür ist geschlossen case SCHLIESSEN: if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); pixels.setPixelColor(0, pixels.Color(0, 255,0)); //LED Farbe grün pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "1"); } } break; } } long pos(int winkel) { return (winkel * SchritteUmdrehung / 360L); } void WebTuerAuf(){ stepper.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void WebTuerZu(){ stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "1"); } pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void stopp() { stepper.stop(); digitalWrite(Enable, HIGH); //Motor deaktiviert } // MQTT Funktion // ************* void connectToMQTT() { mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.subscribe("Huehnertuer/Innen"); if (mqttClient.connect(mqtt_client_id , mqtt_user, mqtt_password)) { Serial.println("Per MQTT mit ioBroker verbunden"); } else { Serial.print("failed with state "); Serial.print(mqttClient.state()); delay(2000); } }Soweit funktioniert auch alles.
Was sich jetzt nat
ü
rlich anbietet ist, das die http-Kommandos durch mqtt-Befehle ersetzt werden k
ö
nnten.Ich habe da auch schon rumprobiert, aber ich verstehe es einfach nicht.
Was mu
ß
ich unter ioBroker machen?Ich hatte dieses hier schon mal eingef
ü
gt:void callback(char* topic, byte* payload, unsigned int length) { payload[length] = '\0'; String strTopic = String(topic); String strPayload = String((char * ) payload); if(strTopic == "Tuer") { if(strPayload == "false") Serial.println(strPayload); { digitalWrite(pinTasterZu, LOW); } if(strPayload == "true") Serial.println(strPayload); { digitalWrite(pinTasterAuf, LOW); } } }und weiter unten dieses hier
void connectToMQTT() { mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.subscribe("Huehnertuer"); if (mqttClient.connect(mqtt_client_id , mqtt_user, mqtt_password)) { Serial.println("connected"); } else { Serial.print("failed with state "); Serial.print(mqttClient.state()); delay(2000); }Ich komme da aber nicht weiter.
Eine einfache Anleitung w
ä
re event. nicht schlecht.Gr
ü
ß
e@beowolf Erw
ä
hnte ich schon, dass meine Arduino-Tage schon etwas her sind? 
@beowolf sagte in GPIO Status Wemos d1 mini an iobroker senden:
Eine einfache Anleitung w
ä
re event. nicht schlecht....und der ist mal so richtig gut. "Einfach" ...

IMO bist du aber fast am Ziel. Du hast zwar den "callback" definiert, "h
ö
rst" aber nirgends auf ihn. Sprich der ioB schickt dir den MQTT-Request, der ESP reagiert aber gar nicht drauf.void connectToMQTT() { mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.subscribe("Huehnertuer");
ä
ndern/hinzuf
ü
genvoid connectToMQTT() { mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.setCallback(callback); mqttClient.subscribe("Huehnertuer"); -
@beowolf Erw
ä
hnte ich schon, dass meine Arduino-Tage schon etwas her sind? 
@beowolf sagte in GPIO Status Wemos d1 mini an iobroker senden:
Eine einfache Anleitung w
ä
re event. nicht schlecht....und der ist mal so richtig gut. "Einfach" ...

IMO bist du aber fast am Ziel. Du hast zwar den "callback" definiert, "h
ö
rst" aber nirgends auf ihn. Sprich der ioB schickt dir den MQTT-Request, der ESP reagiert aber gar nicht drauf.void connectToMQTT() { mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.subscribe("Huehnertuer");
ä
ndern/hinzuf
ü
genvoid connectToMQTT() { mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.setCallback(callback); mqttClient.subscribe("Huehnertuer");So richtig geht das noch nicht.
Ich habe unter ioBroker das eingestellt:

Bei den Objekten dieses hier.

Im Programm dieses hier:
// MQTT Funktion // ************* void connectToMQTT() { mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.setCallback(callback); mqttClient.subscribe("mqtt.0.Huehnertuer.Innen.Tuer"); if (mqttClient.connect(mqtt_client_id , mqtt_user, mqtt_password)) { Serial.println("Per MQTT mit ioBroker verbunden"); } else { Serial.print("failed with state "); Serial.print(mqttClient.state()); delay(2000); } } void callback(char* topic, byte* payload, unsigned int length) { payload[length] = '\0'; String strTopic = String(topic); String strPayload = String((char * ) payload); if(strTopic == "mqtt.0.Huehnertuer.Innen.Tuer") { if(strPayload == "false") // Tuer schliessen Serial.println(strPayload); { digitalWrite(pinTasterZu, LOW); } if(strPayload == "true") // Tuer öffnen Serial.println(strPayload); { digitalWrite(pinTasterAuf, LOW); } } } -
So richtig geht das noch nicht.
Ich habe unter ioBroker das eingestellt:

Bei den Objekten dieses hier.

Im Programm dieses hier:
// MQTT Funktion // ************* void connectToMQTT() { mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.setCallback(callback); mqttClient.subscribe("mqtt.0.Huehnertuer.Innen.Tuer"); if (mqttClient.connect(mqtt_client_id , mqtt_user, mqtt_password)) { Serial.println("Per MQTT mit ioBroker verbunden"); } else { Serial.print("failed with state "); Serial.print(mqttClient.state()); delay(2000); } } void callback(char* topic, byte* payload, unsigned int length) { payload[length] = '\0'; String strTopic = String(topic); String strPayload = String((char * ) payload); if(strTopic == "mqtt.0.Huehnertuer.Innen.Tuer") { if(strPayload == "false") // Tuer schliessen Serial.println(strPayload); { digitalWrite(pinTasterZu, LOW); } if(strPayload == "true") // Tuer öffnen Serial.println(strPayload); { digitalWrite(pinTasterAuf, LOW); } } } -
Bin zwar auch nicht, der Nerd, aber wenn du den Pin f
ü
r schlie
ß
en setzt. Musst du ihn nicht wieder zur
ü
ck setzen und dann den Pin f
ü
r das
ö
ffnen? Sonst stehen doch beide an oder sehe ich das falsch?Bis jetzt kann ich noch nicht einmal eine Reaktion am Wemos feststellen. Beide Eing
ä
nge sind normalerweise auf "high". F
ü
r die manuelle Steuerung sind vor Ort zwei Taster die die Eing
ä
nge jeweils auf "low" tasten.Selbst wenn ich sie per mqtt auf "low" setzte und sie dort bleiben, sollte ja eine Reaktion folgen.
Ich bin mir nicht sicher ob ich den Datenpunkt unter ioBroker so richtig erzeugt habe, sodas der Wemos das mitbekommt.
Ich habe auch noch kein Beispiel im Netz gefunden, in dem es genau beschrieben wird wie das Zusammenspiel l
ä
uft.Also - mache unter ioBroker genau das und frage so und so ab.
-
Bis jetzt kann ich noch nicht einmal eine Reaktion am Wemos feststellen. Beide Eing
ä
nge sind normalerweise auf "high". F
ü
r die manuelle Steuerung sind vor Ort zwei Taster die die Eing
ä
nge jeweils auf "low" tasten.Selbst wenn ich sie per mqtt auf "low" setzte und sie dort bleiben, sollte ja eine Reaktion folgen.
Ich bin mir nicht sicher ob ich den Datenpunkt unter ioBroker so richtig erzeugt habe, sodas der Wemos das mitbekommt.
Ich habe auch noch kein Beispiel im Netz gefunden, in dem es genau beschrieben wird wie das Zusammenspiel l
ä
uft.Also - mache unter ioBroker genau das und frage so und so ab.
-
@beowolf
Ich versuche es mal auf meinem Elektronik board die Tage mal nachzubauen. Dann teste ich dein Programm mal parallel.
Gru
ß
Tom -
Das ist der aktuelle Code
#include <ESP8266WiFi.h> #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> #include <ESP8266WebServer.h> #include <PubSubClient.h> #include <AccelStepper.h> #include <Adafruit_NeoPixel.h> WiFiClient espClient; PubSubClient mqttClient(espClient); #ifndef STASSID #define STASSID "----" #define STAPSK "------------" #endif #define ProgrammstartTuerAuf D0 #define Enable D2 // Steppermotor aktivieren/deaktivieren #define PIN 3 // Umgesteuerter GPIO für die NEO-Led #define NUMPIXELS 1 // Anzal der LEDs ESP8266WebServer server(80); const char* ssid = STASSID; const char* password = STAPSK; char* mqtt_client_id = "Huehnerklappe"; const char* mqtt_server = "192.168.---------"; const int mqtt_port = 1886; const char* mqtt_user = "----------"; const char* mqtt_password = "----------------"; const byte pinTuerAuf = D6; // Endschalter Tür offen const byte pinTuerZu = D5; // Endschalter Tür geschlossen const byte pinTasterAuf = D0; // Taster Tür öffnen const byte pinTasterZu = D7; // Taster Tür schließen const byte pinTasterStopp = D1; // Taster Bewegung anhalten const long SchritteUmdrehung = 200; // Schritte des Schrittmotors für 360 Grad der Tür const unsigned int TuerbewegungZu = 61000; const unsigned int TuerbewegungAuf = -61000; enum ZUSTAENDE {MANUELL, TUERZU, OEFFNEN, TUERAUF, SCHLIESSEN}; byte zustand = MANUELL; AccelStepper stepper(1, D3, D4); //Pins für den Steppermotor STEP , DIR AccelStepper stepperauf(1, D3, D4); //Pins für den Steppermotor STEP , DIR Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800); void setup() { //GPIO Umsteuerung //GPIO 1 (TX) swap the pin to a GPIO. pinMode(1, FUNCTION_3); //GPIO 3 (RX) swap the pin to a GPIO. pinMode(3, FUNCTION_3); Serial.begin(9600); // Per WLAN mit dem Netzwerk verbinden Serial.print("Verbinden mit "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } /////////////////////////////////////////// // Anfang Update über Wlan /////////////////////////////////////////// ArduinoOTA.onStart([]() { String type; if (ArduinoOTA.getCommand() == U_FLASH) { type = "sketch"; } else { // U_FS type = "filesystem"; } // NOTE: if updating FS this would be the place to unmount FS using FS.end() Serial.println("Start updating " + type); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); } else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); } else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); } else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); } else if (error == OTA_END_ERROR) { Serial.println("End Failed"); } }); ArduinoOTA.begin(); /////////////////////////////////////////// // Ende Update über Wlan /////////////////////////////////////////// // Die IP vom Webserver auf dem seriellen Monitor ausgeben Serial.println(""); Serial.println("WLAN verbunden."); Serial.println("IP Adresse: "); Serial.println(WiFi.localIP()); connectToMQTT(); // Mit ioBroker Mqtt verbinden server.onNotFound([](){ server.send(404, "text/plain", "Link wurde nicht gefunden!"); }); server.on("/", []() { server.send(200, "text/plain", "Startseite"); }); server.on("/WebTuerAuf", []() { server.send(200, "text/plain", "Tuer wird geoeffnet."); WebTuerAuf(); }); server.on("/WebTuerZu", []() { server.send(200, "text/plain", "Tuer wird geschlossen."); WebTuerZu(); }); server.begin(); Serial.println("Webserver gestartet."); pixels.begin(); // This initializes the NeoPixel library. Serial.println("Programmanfang"); pinMode(PIN, OUTPUT); // NEO-LED pinMode(pinTuerAuf, INPUT_PULLUP); // Endschalter Tür offen pinMode(pinTuerZu, INPUT_PULLUP); // Endschalter Tür geschlossen pinMode(pinTasterAuf, INPUT_PULLUP); // Taster Tür öffnen pinMode(pinTasterZu, INPUT_PULLUP); // Taster Tür schließen pinMode(pinTasterStopp, INPUT_PULLUP); // Taster Bewegung anhalten pinMode(ProgrammstartTuerAuf, OUTPUT); stepper.setMaxSpeed(1000); stepperauf.setMaxSpeed(6000); stepper.setAcceleration(1500); stepperauf.setAcceleration(6000); pinMode(Enable, OUTPUT); // Enable Motor 1 } void loop() { ArduinoOTA.handle(); ArduinoOTA.setHostname("Huehnerklappe"); server.handleClient(); mqttClient.loop(); digitalWrite(Enable, LOW); //Motor aktiviert stepper.run(); stepperauf.run(); digitalWrite(ProgrammstartTuerAuf, digitalRead(pinTuerAuf)); if (!digitalRead(pinTasterStopp)) { zustand = MANUELL; pixels.setPixelColor(0, pixels.Color(255,255,255)); //LED Farbe weiss pixels.show(); } switch (zustand) { // Manuelle Steuerung case MANUELL: if ((!digitalRead(pinTasterAuf)) && (digitalRead(pinTuerAuf))) { stepper.move(10); } else if ((!digitalRead(pinTasterZu)) && (digitalRead(pinTuerZu))) { stepper.move(-10); } else { stopp(); } if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); } if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); } break; // Tür wird geöffnet case TUERZU: stopp(); if (!digitalRead(pinTasterAuf)) { stepperauf.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür ist offen case OEFFNEN: if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); pixels.setPixelColor(0, pixels.Color(255,0,0)); //LED Farbe rot pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür wir geschlossen case TUERAUF: stopp(); if (!digitalRead(pinTasterZu)) { stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür ist geschlossen case SCHLIESSEN: if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); pixels.setPixelColor(0, pixels.Color(0, 255,0)); //LED Farbe grün pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "1"); } } break; } } long pos(int winkel) { return (winkel * SchritteUmdrehung / 360L); } void WebTuerAuf(){ stepperauf.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void WebTuerZu(){ stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "1"); } pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void stopp() { stepper.stop(); digitalWrite(Enable, HIGH); //Motor deaktiviert } // MQTT Funktion // ************* void connectToMQTT() { mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.setCallback(callback); mqttClient.subscribe("mqtt.0.Huehnertuer.Innen.Tuer"); if (mqttClient.connect(mqtt_client_id , mqtt_user, mqtt_password)) { Serial.println("Per MQTT mit ioBroker verbunden"); } else { Serial.print("failed with state "); Serial.print(mqttClient.state()); delay(2000); } } void callback(char* topic, byte* payload, unsigned int length) { payload[length] = '\0'; String strTopic = String(topic); String strPayload = String((char * ) payload); if(strTopic == "mqtt.0.Huehnertuer.Innen.Tuer") { if(strPayload == "false") // Tuer schliessen Serial.println(strPayload); { digitalWrite(pinTasterZu, LOW); } if(strPayload == "true") // Tuer öffnen Serial.println(strPayload); { digitalWrite(pinTasterAuf, LOW); } } }Danke f
ü
r die Hilfe -
Das ist der aktuelle Code
#include <ESP8266WiFi.h> #include <ESP8266mDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> #include <ESP8266WebServer.h> #include <PubSubClient.h> #include <AccelStepper.h> #include <Adafruit_NeoPixel.h> WiFiClient espClient; PubSubClient mqttClient(espClient); #ifndef STASSID #define STASSID "----" #define STAPSK "------------" #endif #define ProgrammstartTuerAuf D0 #define Enable D2 // Steppermotor aktivieren/deaktivieren #define PIN 3 // Umgesteuerter GPIO für die NEO-Led #define NUMPIXELS 1 // Anzal der LEDs ESP8266WebServer server(80); const char* ssid = STASSID; const char* password = STAPSK; char* mqtt_client_id = "Huehnerklappe"; const char* mqtt_server = "192.168.---------"; const int mqtt_port = 1886; const char* mqtt_user = "----------"; const char* mqtt_password = "----------------"; const byte pinTuerAuf = D6; // Endschalter Tür offen const byte pinTuerZu = D5; // Endschalter Tür geschlossen const byte pinTasterAuf = D0; // Taster Tür öffnen const byte pinTasterZu = D7; // Taster Tür schließen const byte pinTasterStopp = D1; // Taster Bewegung anhalten const long SchritteUmdrehung = 200; // Schritte des Schrittmotors für 360 Grad der Tür const unsigned int TuerbewegungZu = 61000; const unsigned int TuerbewegungAuf = -61000; enum ZUSTAENDE {MANUELL, TUERZU, OEFFNEN, TUERAUF, SCHLIESSEN}; byte zustand = MANUELL; AccelStepper stepper(1, D3, D4); //Pins für den Steppermotor STEP , DIR AccelStepper stepperauf(1, D3, D4); //Pins für den Steppermotor STEP , DIR Adafruit_NeoPixel pixels = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800); void setup() { //GPIO Umsteuerung //GPIO 1 (TX) swap the pin to a GPIO. pinMode(1, FUNCTION_3); //GPIO 3 (RX) swap the pin to a GPIO. pinMode(3, FUNCTION_3); Serial.begin(9600); // Per WLAN mit dem Netzwerk verbinden Serial.print("Verbinden mit "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } /////////////////////////////////////////// // Anfang Update über Wlan /////////////////////////////////////////// ArduinoOTA.onStart([]() { String type; if (ArduinoOTA.getCommand() == U_FLASH) { type = "sketch"; } else { // U_FS type = "filesystem"; } // NOTE: if updating FS this would be the place to unmount FS using FS.end() Serial.println("Start updating " + type); }); ArduinoOTA.onEnd([]() { Serial.println("\nEnd"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }); ArduinoOTA.onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); } else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); } else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); } else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); } else if (error == OTA_END_ERROR) { Serial.println("End Failed"); } }); ArduinoOTA.begin(); /////////////////////////////////////////// // Ende Update über Wlan /////////////////////////////////////////// // Die IP vom Webserver auf dem seriellen Monitor ausgeben Serial.println(""); Serial.println("WLAN verbunden."); Serial.println("IP Adresse: "); Serial.println(WiFi.localIP()); connectToMQTT(); // Mit ioBroker Mqtt verbinden server.onNotFound([](){ server.send(404, "text/plain", "Link wurde nicht gefunden!"); }); server.on("/", []() { server.send(200, "text/plain", "Startseite"); }); server.on("/WebTuerAuf", []() { server.send(200, "text/plain", "Tuer wird geoeffnet."); WebTuerAuf(); }); server.on("/WebTuerZu", []() { server.send(200, "text/plain", "Tuer wird geschlossen."); WebTuerZu(); }); server.begin(); Serial.println("Webserver gestartet."); pixels.begin(); // This initializes the NeoPixel library. Serial.println("Programmanfang"); pinMode(PIN, OUTPUT); // NEO-LED pinMode(pinTuerAuf, INPUT_PULLUP); // Endschalter Tür offen pinMode(pinTuerZu, INPUT_PULLUP); // Endschalter Tür geschlossen pinMode(pinTasterAuf, INPUT_PULLUP); // Taster Tür öffnen pinMode(pinTasterZu, INPUT_PULLUP); // Taster Tür schließen pinMode(pinTasterStopp, INPUT_PULLUP); // Taster Bewegung anhalten pinMode(ProgrammstartTuerAuf, OUTPUT); stepper.setMaxSpeed(1000); stepperauf.setMaxSpeed(6000); stepper.setAcceleration(1500); stepperauf.setAcceleration(6000); pinMode(Enable, OUTPUT); // Enable Motor 1 } void loop() { ArduinoOTA.handle(); ArduinoOTA.setHostname("Huehnerklappe"); server.handleClient(); mqttClient.loop(); digitalWrite(Enable, LOW); //Motor aktiviert stepper.run(); stepperauf.run(); digitalWrite(ProgrammstartTuerAuf, digitalRead(pinTuerAuf)); if (!digitalRead(pinTasterStopp)) { zustand = MANUELL; pixels.setPixelColor(0, pixels.Color(255,255,255)); //LED Farbe weiss pixels.show(); } switch (zustand) { // Manuelle Steuerung case MANUELL: if ((!digitalRead(pinTasterAuf)) && (digitalRead(pinTuerAuf))) { stepper.move(10); } else if ((!digitalRead(pinTasterZu)) && (digitalRead(pinTuerZu))) { stepper.move(-10); } else { stopp(); } if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); } if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); } break; // Tür wird geöffnet case TUERZU: stopp(); if (!digitalRead(pinTasterAuf)) { stepperauf.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür ist offen case OEFFNEN: if (!digitalRead(pinTuerAuf)) { zustand = TUERAUF; Serial.println("Tuer geoeffnet"); pixels.setPixelColor(0, pixels.Color(255,0,0)); //LED Farbe rot pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür wir geschlossen case TUERAUF: stopp(); if (!digitalRead(pinTasterZu)) { stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } } break; // Tür ist geschlossen case SCHLIESSEN: if (!digitalRead(pinTuerZu)) { zustand = TUERZU; Serial.println("Tuer geschlossen"); pixels.setPixelColor(0, pixels.Color(0, 255,0)); //LED Farbe grün pixels.show(); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "1"); } } break; } } long pos(int winkel) { return (winkel * SchritteUmdrehung / 360L); } void WebTuerAuf(){ stepperauf.move(pos(TuerbewegungAuf)); zustand = OEFFNEN; Serial.print("Tuer oeffnet ... "); // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } // Schaltzustände übermitteln if(digitalRead(pinTuerAuf) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void WebTuerZu(){ stepper.move(pos(TuerbewegungZu)); zustand = SCHLIESSEN; Serial.print("Tuer schliesst ... "); // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == HIGH){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "1"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "0"); } // Schaltzustände übermitteln if(digitalRead(pinTuerZu) == LOW){ mqttClient.publish("Huehnertuer/Innen/Tuer_oeffnet", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_auf", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_schliesst", "0"); mqttClient.publish("Huehnertuer/Innen/Tuer_zu", "1"); } pixels.setPixelColor(0, pixels.Color(0,0,255)); //LED Farbe blau pixels.show(); } void stopp() { stepper.stop(); digitalWrite(Enable, HIGH); //Motor deaktiviert } // MQTT Funktion // ************* void connectToMQTT() { mqttClient.setServer(mqtt_server, mqtt_port);//MQTT Server, - Port mqttClient.setCallback(callback); mqttClient.subscribe("mqtt.0.Huehnertuer.Innen.Tuer"); if (mqttClient.connect(mqtt_client_id , mqtt_user, mqtt_password)) { Serial.println("Per MQTT mit ioBroker verbunden"); } else { Serial.print("failed with state "); Serial.print(mqttClient.state()); delay(2000); } } void callback(char* topic, byte* payload, unsigned int length) { payload[length] = '\0'; String strTopic = String(topic); String strPayload = String((char * ) payload); if(strTopic == "mqtt.0.Huehnertuer.Innen.Tuer") { if(strPayload == "false") // Tuer schliessen Serial.println(strPayload); { digitalWrite(pinTasterZu, LOW); } if(strPayload == "true") // Tuer öffnen Serial.println(strPayload); { digitalWrite(pinTasterAuf, LOW); } } }Danke f
ü
r die Hilfe@beowolf sagte in GPIO Status Wemos d1 mini an iobroker senden:
mqtt.0.Huehnertuer.Innen.Tuer
Deine Subscribes/strTopics sind noch falsch. Weder der Adaptername noch die Instanz d
ü
rfen da hinein, au
ß
erdem ist die "Punktnotation" nach ioB-Standard bei MQTT falsch 
zB:
mqttClient.subscribe("Huehnertuer/Innen/Tuer");Ich w
ü
rde mir im Serial-Monitor auch mal den MQTT-Request ausgeben lassen, da sieht man ob
ü
berhaupt was beim ESP ankommt. Hier mal der "callback" eines alten Sketches von mir (inkl. der Ausgabe per Serial-Monitor):void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] : "); String Topic = String(topic); char msg[length+1]; for (unsigned int i=0;i<length;i++) { Serial.print((char)payload[i]); msg[i] = (char)payload[i]; } msg[length] = '\0'; Serial.println(); //Zirkulation? if (strcmp(topic,"cmnd/HeizCon/WW-Zirkulation")==0) { if(strcmp(msg,"true")==0) { digitalWrite(STATUS_LED, LOW); //Low=On delay(3000); digitalWrite(STATUS_LED, HIGH); mqtt_client.publish(Topic.c_str(), "false", true); //clear WWZ_state } } } //############################################################################ -
@beowolf sagte in GPIO Status Wemos d1 mini an iobroker senden:
mqtt.0.Huehnertuer.Innen.Tuer
Deine Subscribes/strTopics sind noch falsch. Weder der Adaptername noch die Instanz d
ü
rfen da hinein, au
ß
erdem ist die "Punktnotation" nach ioB-Standard bei MQTT falsch 
zB:
mqttClient.subscribe("Huehnertuer/Innen/Tuer");Ich w
ü
rde mir im Serial-Monitor auch mal den MQTT-Request ausgeben lassen, da sieht man ob
ü
berhaupt was beim ESP ankommt. Hier mal der "callback" eines alten Sketches von mir (inkl. der Ausgabe per Serial-Monitor):void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] : "); String Topic = String(topic); char msg[length+1]; for (unsigned int i=0;i<length;i++) { Serial.print((char)payload[i]); msg[i] = (char)payload[i]; } msg[length] = '\0'; Serial.println(); //Zirkulation? if (strcmp(topic,"cmnd/HeizCon/WW-Zirkulation")==0) { if(strcmp(msg,"true")==0) { digitalWrite(STATUS_LED, LOW); //Low=On delay(3000); digitalWrite(STATUS_LED, HIGH); mqtt_client.publish(Topic.c_str(), "false", true); //clear WWZ_state } } } //############################################################################ -
@sborg sagte in GPIO Status Wemos d1 mini an iobroker senden:
au
ß
erdem ist die "Punktnotation" nach ioB-Standard bei MQTT falschWas meinst du damit?
@beowolf Das Ordner und der Datenpunkt mittels "Punkt" getrennt werden:
falsch
Huehnertuer.Innen.Tuerbei MQTT richtig
Huehnertuer/Innen/Tuer
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden