Ansteuerung einer Schiebetür. Brauche Hilfe / Tipps und Verbesserungen

Hallo,

wenn ich Dich richtig verstanden habe gehts Dir eigendlich um die Logik mit der Du nicht zurecht kommst, Da ich weder so ein Wischding habe und auch keine Motorshield, habe ich was aus meinem Fundus mit 4 Tastern rausgesucht. Die beiden Ausgänge für Motor rechts ein, Motor links ein hab ich zum Testen auf dem UNO mit zwei LED über Widerstand verbunden. Eigendlich gehört noch ein 5 Taster dazu der anhalten kann, den hab ich jetzt mal weggelassen. Gefahren wird also immer bis zum Endschalter oder es wird die Richtung umgeschaltet.

Anpassen must Du das selber. Die Taster schalten nach 0V und werden beim einlesen invertiert damit arbeitet das Programm mit positiver logik. Wenn Deine Endschalter Öffner sind must Du das anpassen und das Negieren für die beiden Signale weg lassen.

Die Taster hab ich zunächst mal eingelesen und auf bool Werte gelegt, das verträgt sich besser mit der Abfrage auf true & false . Am Ende werden die beiden Boolwerte für die beiden LED auf Ausgänge gelegt. Da musst Du dann halt die Ansteuerung für das Motorshield verwenden.

in der Art:

if(mlinks==true){
sollwert setzen;
Motor ein;
}
else{
sollwert=0;
Motor aus;
}

// Eingänge festlegen
const byte T_links = 2; // Taster
const byte T_rechts = 3;
const byte ES_links = 4; // Endschalter 
const byte ES_rechts = 5;

// Ausgänge festlegen
const byte M_links = 11;
const byte M_rechts = 12;

// interne Flags
bool tlinks, trechts, elinks, erechts;
bool mlinks, mrechts;
bool debug = false ;// zum testen auf true setzen 

void setup() {
  Serial.begin(9600);

  pinMode(T_links, INPUT_PULLUP);
  pinMode(T_rechts, INPUT_PULLUP);
  pinMode(ES_links, INPUT_PULLUP);
  pinMode(ES_rechts, INPUT_PULLUP);
  pinMode(M_links, OUTPUT);
  pinMode(M_rechts, OUTPUT);
}

void loop() {
  //eingänge lesen und invertieren

  tlinks = !digitalRead(T_links);
  trechts = !digitalRead(T_rechts);
  elinks = !digitalRead(ES_links);
  erechts = !digitalRead(ES_rechts);

  if ( debug) {
    // Anzeige Eingänge zu testen
    Serial.print(tlinks); Serial.print("\t");
    Serial.print(trechts); Serial.print("\t");
    Serial.print(elinks); Serial.print("\t");
    Serial.print(erechts); Serial.print("\t");
    Serial.print(mlinks); Serial.print("\t");
    Serial.print(mrechts); Serial.println();
    delay(100);
  }
  if (tlinks == true) { // nach links fahren
    mrechts = false;
    delay(100);
    mlinks = true;
  }

  if (trechts == true) { // nach rechts fahren
    mlinks = false;
    delay(100);
    mrechts = true;
  }

  if (elinks)mlinks = false; // wenn Endschalter erreicht dann aus
  if (erechts)mrechts = false;

  digitalWrite(M_links, mlinks); // auf Ausgänge legen 
  digitalWrite (M_rechts, mrechts);

}