Wert speichert nicht

Hallo liebe Arduino Community,

ich habe ein kleines Problem. :frowning:
Ich will auf einer Linearführung einen Schlitten mit einem Schrittmotor zwischen zwei Endstopps verfahren. Diese Endstopps sind einfache Taster, für dich ich in meinem Code einfach zwei Interrupts eingebaut habe. Solange ich den Taster drücke, dreht sich der Motor in die andere Richtung. Sobald ich ihn allerdings loslasse fährt er wieder zurück. Wie schaffe ich es, dass der Wert für stepperState gespeichert wird und der Motor bis zum anderen Endstopp fährt und erst dann wieder umkehrt?
Danke für eure Hilfe! :slight_smile:

const int switchPin1 = 2;
const int switchPin2 = 3;
const int dirPin = 5;
const int stepPin = 4;

const int stepSpeed = 5;

int stepperState;
 
void setup() 
{
  pinMode(dirPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  pinMode(switchPin1, INPUT);
  pinMode(switchPin2, INPUT);
  
  attachInterrupt(0, limit_switch, RISING); //links
  attachInterrupt(1, limit_switch, RISING); //rechts
 
  digitalWrite(dirPin, stepperState);

  Serial.begin(115200);
}
 
void loop() 
{
  digitalWrite(stepPin, HIGH);               
  delay(stepSpeed);
  digitalWrite(stepPin, LOW);  
  delay(stepSpeed);
}

void limit_switch () 
{
  if (stepperState == HIGH) {
    stepperState = LOW;
  }
  else {
    stepperState = HIGH;
  }

  digitalWrite(dirPin, stepperState);
  Serial.println(stepperState);
}

dafür

  if (stepperState == HIGH) {
    stepperState = LOW;
  }
  else {
    stepperState = HIGH;

könntest du stepperState = !stepperState schreiben und du solltest die Taster entprellen.

Interrupt und mechanische Schalter passen leider nicht zusammen.

Was du machen kannst, ist mit dem einen Schalter den dirPin HIGH und mit dem andern den dirPin LOW zu schalten, evtl. den stepPin glechzeitig LOW setzen, und das Umschalten in einer extra Variable merken. (in zwei leicht unterschiedlichen Interruptroutinen)

In Loop kannst du diesen Richtungswechsel-Merker erkennen, in diesem Fall eine Idee länger warten und dann den stepper wieder loslaufen lassen ( in die neue Richtung ).

So schadet es nicht, dass die Interrupt-Routinen mehrfach dran kommen, da Taster und Endschalter natürlich prellen.

Serial.println(stepperState);

Serielle Ausgaben in ISR können/werden zum Stillstand des µC führen.