Schalter mit Schrittmotoransteuerung >> brauche Hilfe

Hallo erstmal, habe ein Problem mit der Pinabfrage

Schrittmotor muss 90 Grad drehen um einen Schalter zu betätigen - macht das was er soll - ohne Schalterabfrage

Wenn der Pin high ist 1 mal ““else”” abarbeiten und warten bis wieder low
dann einmal ““low”” und warten auf high.(die Pin-Erkennung 0/1 kommt auf 1/10 sec nicht an )

Komme aus der loop nicht raus - true - false ist irgendwie das Problem, keine Idee wie ich das realisieren soll, hoffe das mir jemand helfen kann.

Schalter entprellen ist in der Schaltung nicht nötig.

/* 
 Stepper Motor - Schalter
 L298 Driver
 wenn key = 0 beim einschalten (Normalzustand)
 einmal zur Sicherheit in Anschlag rotieren - 0 Stellung
 und 13 low - 12 high
 pin 7  low Enable von L298 = stromlos machen
 */

#include <Stepper.h>
int key=0;   
boolean executed=false;
const int stepsPerRevolution = 14;  //  14 Schritte , bei dem Motor 90 Grad

// L298 steppertreiber an pin 8 bis 11:
Stepper myStepper(stepsPerRevolution, 8,9,10,11);            

void setup() {
  pinMode(7, OUTPUT); // low Enable L298 stromlos machen
  pinMode(2, INPUT_PULLUP ); // bei high -steps starten, Pin 13 high Pin12 low
                              // bei low wieder in Anfangsstellung
  pinMode(12, OUTPUT); // High=RX Umschaltung
  pinMode(13, OUTPUT); // High=Tx Umschaltung
 myStepper.setSpeed(300); // was der Motor an Schrittspeed machen soll / kann

}

void loop() {
  
  key = digitalRead(2);
 
 if ((key == LOW)&&(executed==false)){
 executed=true;
  digitalWrite(7, HIGH);
   myStepper.step(stepsPerRevolution);
    delay(100);
    digitalWrite(13, LOW);
    digitalWrite(12, HIGH);
    digitalWrite(7, LOW);
}
  else {  
       if (executed==true){
executed=false;
  digitalWrite(7, HIGH);
   myStepper.step(-stepsPerRevolution);  
   delay(100);
    // hier Optokoppler abfragen - wäre noch eine schicke option
    digitalWrite(12, LOW);
    digitalWrite(13, HIGH);  
    digitalWrite(7, LOW);
}
 
  }
}

Sinnvolle Namen für die Pins wären schön. Ist Pin 2 der Schalter, den der Motor betätigt?

ja pin 2 ist der Auslöser

Dann macht der Motor also so oft 90°, bis er den Schalter ausgelöst hat. Wenn das so in Ordnung ist, was genau funktioniert dann nicht? Wie wär's mit ein paar Debug-Ausgaben?

der schrittmotor steuert einen andern Schalter - Schieber und hat nichts mit dem Pin 2 zu tun.

ich habe das Problem in der LOOP - ich weiß nicht wie ich die Pin 2 Abfrage umbauen muss das der Vorgang nur 1 mal je PIN2 High / PIN2 low durchlaufen wird und nicht immer wieder - da liegt das Problem

void loop() {

key = digitalRead(2);

if ((key == LOW)&&(executed==false)){
executed=true;
digitalWrite(7, HIGH);
myStepper.step(stepsPerRevolution);
delay(100);
digitalWrite(13, LOW);
digitalWrite(12, HIGH);
digitalWrite(7, LOW);
}
else {
if (executed==true){
executed=false;

Solange key LOW ist wird abwechselnd der True und False Zweig abgearbeitet, ohne Ende. Baue key auch in die zweite Prüfung ein, dann sollte es klappen.

Ja danke, genau das war's, was mir fehlte.

Betreibe damit einen Hohlleiterschalter in einer Ghz Amateurfunkstation der immer 90 Grad vor und zurück muss

void loop() {
  
  key = digitalRead(2);  Sende-Empfangs Pin = low RX high TX
 
 if ((key == LOW)&&(executed==false)){
 executed=true;
  digitalWrite(7, HIGH); //Schrittmotorbrücke einschalten
   myStepper.step(stepsPerRevolution);
    delay(100);
    digitalWrite(13, LOW);// Spannung für Sender schalten
    digitalWrite(12, HIGH);// Spannung für Empfänger schalten
    digitalWrite(7, LOW); // Schrittmotorbücke aus
}
  else {  
       if ((key == HIGH)&&(executed==true)){
executed=false;
  digitalWrite(7, HIGH);
   myStepper.step(-stepsPerRevolution);  
   delay(100);
    digitalWrite(12, LOW);
    digitalWrite(13, HIGH);  
    digitalWrite(7, LOW);
}