Schrittmotor mit Zeitverzögerung zum Endschalter

Hallo ich habe folgendes Projekt, ich möchte ein Rolladenmodell bauen. Es soll mit dem Schrittmotor 28BYJ-48 (5V) gesteuert werden. Ich habe

2xSchalter für Fahrt Hoch/Runter, dann 2xEndschalter Oben/Unten und einen “Windsensor” (also noch einen Schalter).

Das Teil soll

1.Bei kurzem drücken von Schalter Hoch/Runter auf Endschalter Oben/Untern fahren.
2. Bei längerem drücken soll die Fahrt beim losassen aufhören.
3. Beim Windsensor soll die gesamte Sache ohne mögliche Einwirkung von außen, auf den oberen Endschalter fahren.

Da ich ein Anfänger bin habe ich gerade ein problem damit einen Interrupt ein zu programmieren welcher den Schrittmotor unterbricht.

Könnt ihr mit vielleicht erklären wie genau ich solch einen Interrupt in mein Programm einbauen müsste? Ich versuche mir die Sache hier selber beizubringen deswegen hoffe ich sehr auf eure HILFE!!
Viele liebe Grüsse und DANKE IM VORRAUS!!!

Hier mein Code für den Aufwärtsschalter (um das ganze übersichtlich zu machen habe ich die Frage auf die Aufwärtsfahrt eingeschränkt).

#include "Stepper.h"
#define STEPS  32   
int TasterStopp1_PIN = 2;
int TasterStopp2_PIN = 12;
volatile int tastehochState = 0;
volatile int tasterunterState = 0;
int druckzeit = 200;
unsigned long aktuellezeit;
long vorherigezeit;
int a = 0;
#define Druckzeit 1000
int TasterRunter_PIN = 3;
int TasterHoch_PIN = 4;
int  Steps2Take;  
  

Stepper small_stepper(STEPS, 8, 10, 9, 11);


void setup()
{ 
  pinMode(TasterStopp1_PIN,INPUT);
  pinMode(TasterStopp2_PIN,INPUT);
  pinMode(TasterHoch_PIN,INPUT);
  pinMode(TasterRunter_PIN,INPUT);
  attachInterrupt(0, Stopp1, RISING);
  
}
void Stopp1 (){
tastehochState = digitalRead(TasterStopp1_PIN); // Wie baue ich diesen Interrupt jetzt in meine Millis() Funktion ein?


if (tastehochState == HIGH)
{
  small_stepper.setSpeed(700); 
                      Steps2Take  =  -150;               // Ich möchte, dass der Schrittmotor wenn er an den Endschalter kommt 
                      small_stepper.step(Steps2Take);    //   -150 Schritte geht und dann anhält
                      delay(0);
}
}

void loop ()
{
  tastehochState = digitalRead(TasterHoch_PIN);
  if (tastehochState == HIGH)
  {
    if (a == 0)
    {
      vorherigezeit = millis();
      a = 1;
    }
    aktuellezeit = millis();
    if (aktuellezeit - vorherigezeit <= druckzeit)
    {
     small_stepper.setSpeed(700); //Max seems to be 700
                      Steps2Take  =  2000;  // Rotate CW
                      small_stepper.step(Steps2Take);
                      delay(0);
    }
   else 
    {
      small_stepper.setSpeed(700); //Max seems to be 700
                      Steps2Take  =  0;  // Rotate CW
                      small_stepper.step(Steps2Take);
                      delay(100); 
                      a = 0;   
    }
    while (digitalRead (TasterHoch_PIN))
   if (aktuellezeit - vorherigezeit >= druckzeit) 
    {
     small_stepper.setSpeed(700); //Max seems to be 700
                      Steps2Take  =  50;  // Rotate CW
                      small_stepper.step(Steps2Take);
                      delay(0); 
                      
                      
    }
   else 
    {
      small_stepper.setSpeed(700); //Max seems to be 700
                      Steps2Take  =  0;  // Rotate CW
                      small_stepper.step(Steps2Take);
                      delay(100); 
                      a = 0;
                      
    }
  }
}

Schrittmotor_mit_Endschalter.ino (2.33 KB)

Freddi6690:
Hallo ich habe folgendes Projekt, ...

Ohne mir das Ganze näher angesehen zu haben: Das riecht IMO sehr nach einer Aufgabe, die am besten mit einem „endlichen Automat“ gelöst werden kann. Was mir zu diesem Thema eingefallen ist, habe ich hier ins Netz gekippt. Beachte ggf. die Folgeseite.

Gruß

Gregor

Freddi6690:
Hallo ich habe folgendes Projekt, ich möchte ein Rolladenmodell bauen. Es soll mit dem Schrittmotor 28BYJ-48 Da ich ein Anfänger bin habe ich gerade ein problem damit einen Interrupt ein zu programmieren welcher den Schrittmotor unterbricht.

Normalerweise braucht man dafür keinen Interrupt. Die Abläufe sind so langsam, dass man das eigentlich im loop() abfragen kann. Das Problem ist aber die verwendete stepperlib. Die Standard-'Stepper.h' arbeitet blockierend. D.h. während der Schrittmotor läuft, bleibt das Programm in der Lib hängen und dein Sketch läuft nicht weiter. Da hilft dir dann auch kein Interrupt, da in der Lib ein Abbrechen nicht vorgesehen ist.
Wenn Du diese Lib verwenden willst, darfst Du immer nur einen Schritt machen, umd musst das im loop() selbst verfolgen. Dann kannst Du es auch abbrechen.

Du kannst auch anstelle der blockierenden Stepper.h eine nichtblockierende probieren.
Sie ist hier im oberen Teil verlinkt.
Ich habe die Lib nicht getestet.

Gruß Tommy

Edit: Ich glaube Accelstepper ist vielseitiger.

Super danke ich werde mal die anderen Libs ausprobieren und hoffe die Sache läuft dann. Ich sage bescheid sobald ich neuere Erkenntnisse habe!!
Falls natürlich noch wer Ideen hat immer her damit. Ich will ja schließlich etwas dazulernen!!

Vielen Dank soweit!