Steppermotor - AccelStepper Lib - dreht sich nicht

Hallo liebe Community,

ich möchte eine Hühnerklappe steuern und dafür einen kleinen Steppermotor (28BYJ) nutzen.
Das ganze soll dann über mqtt getriggert werden.
Hier mein bisheriger Ansatz:

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <AccelStepper.h>
#define HALFSTEP 4

// ###########  WIFI  ############################################
// Update these with values suitable for your network.
const char* ssid = "__";//put your wifi ssid here
const char* password = "xxxx";//put your wifi password here
const char* mqtt_server = "192......";
const char* clientId = "chickenDoor";
const char* userName = "xxx";
const char* passWord = "yyy";
// ################################################################
// Motor pin definitions
#define motorPin1  D1     // IN1 on the ULN2003 driver 1
#define motorPin2  D2     // IN2 on the ULN2003 driver 1
#define motorPin3  D5     // IN3 on the ULN2003 driver 1
#define motorPin4  D6     // IN4 on the ULN2003 driver 1
// ################################################################
AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
// ################################################################
WiFiClient espClient;
PubSubClient client(espClient);

void setup_wifi() {
   delay(100);
  // We start by connecting to a WiFi network
    Serial.print("Connecting to ");
    Serial.println(ssid);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) 
    {
      delay(500);
      Serial.print(".");
    }
  randomSeed(micros());
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
// ################################################################
void callback(char* topic, byte* payload, unsigned int length) 
{
  Serial.print("Command from MQTT broker is: [");
  Serial.print(topic);
  int p =(char)payload[0]-'0';
  int stepperLoop = 0;
// ################################################################
  if(p==1) 
  {
    //myStepper.step(stepsPerRevolution);
    Serial.print("  clockwise]" );
   }
// ################################################################
  else if(p==2)
  {
    //myStepper.step(-stepsPerRevolution);
    Serial.print("  counterclockwise]" );
  }
// ################################################################
  else if(p==3)
  {
    Serial.print("  clockwise loop: ");
stepper1.moveTo(4000);
stepper1.run();
  }
// ################################################################
  else if(p==4)
  {
    Serial.print("  counterclockwise loop: " ); 
stepper1.moveTo(4000);
stepper1.run();
  }
  else if(p==0)
  {
    digitalWrite (D1,LOW);
    digitalWrite (D2,LOW);
    digitalWrite (D5,LOW);
    digitalWrite (D6,LOW); 
    Serial.print("  off]" );
  }
  Serial.println();
}
// ###################  RECONNECT  ################################
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) 
  {
    Serial.print("Attempting MQTT connection...");

    // Attempt to connect
    if (client.connect(clientId,userName,passWord))
    {
      Serial.println("connected");
     //once connected to MQTT broker, subscribe command if any
      client.subscribe("chickenDoor");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 6 seconds before retrying
      delay(6000);
    }
  }
}
// ################################################################
void setup() {
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
// ##################  Speed   ####################################
  stepper1.setMaxSpeed(100.0);
  stepper1.setAcceleration(100.0);
  stepper1.setSpeed(100);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

}

Ich würde ihn nun gerne wenn ich ihm eine 3 übergebe, dass er sich 4000 Inkremente bewegt.
Leider tut er gar nichts. der Befehl kommt aber an.
was kann ich tun?

stepper1.run(); dürfte nach loop() gehören.

Aber dann läuft der Motor doch dauerhaft und nicht nur 4 Umdrehungen wenn ich ihm per mqtt bspw. eine 3 sende.

Aus der Doku: "Poll the motor and step it if a step is due, implementing accelerations and decelerations to acheive the target position. You must call this as frequently as possible, but at least once per minimum step time interval, preferably in your main loop. Note that each call to run() will make at most one step, and then only when a step is due, based on the current speed and the time since the last step."

Das hilft mir nun leider nicht direkt weiter.
wenn ich im loop den Run befehl setze, dann kann ich mittels stepper1.moveTo(4000) die anzahl der Umdrehungen festlegen.
Kann ich diese noch im Nachgang irgendwie ändern?
Also dass ich sie aus dem mqtt befehl nehme und entsprechend anpasse?

Jupp

Nur, solltest Du dort ebenfalls eine 4000 senden - Da steht der Stepper schon - dann macht Der Nichts.

Das .run() schaut 'nur' nach, ob JETZT ein Step gemacht werden muß - Das hat mit dem ganzen drum herum herzlich wenig am Hut.
Wenn Du die Ziel-Position änderst - egal, ob während des Lauf, der Rampe oder des Stand - wird die Lib Alles unternehmen, um zu diesem Ziel zu gelangen - auch, wenn Das Abbremsen bis Null, Vollgas Beschleunigen in Gegenrichtung, Abbremsen auf Null bedeutet.

Du musst 'nur' schauen, daß Du die passende Ziel-Position vorgibst!
Da Dir Diese aber nicht bekannt ist (oder man so einen Kram gerne vergisst) - kann man sich einen Befehl ausdenken, Der RELATIV zum aktuellen Ziel oder zur aktuellen Position das Ziel positioniert - Möglichkeiten gibt's hier viele.

Das .run() muß IMMER (und möglichst schnell) aufgerufen werden.

MfG

silverhawk0705:
wenn ich im loop den Run befehl setze, dann kann ich mittels stepper1.moveTo(4000) die anzahl der Umdrehungen festlegen.

Nee, da bist Du auf dem Holzweg oder hast ungenau formuliert, denn moveTo macht eine Bewegung zu einer absoluten Position. Möchtest Du eine relative Bewegung, wäre stepper1.move(4000) richtig.

Da ich den Zusammenhang nicht kenne, kann ich nicht einschätzen, was tatsächlich richtig ist.