@tt-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