Zeitliche Abfolge von Eingängen erfassen

Hallo,

ich bin gerade dabei, ein kleines Gerät zu bauen, mit dem ich einen Schrittmotor steuern kann. Da das Ganze sich noch im Bau befindet, ist es bisher nur eine Idee: ich habe vier kapazititive Tochsensoren und einen Drehencoder zur Eingabe von Daten. Die vier Touchsensoren sind in einer Reihe nebeneinander angeordnet.
Nun hatte ich die Idee, daß ein "swipen" über alle vier Touchsensoren eine Funktion auslösen soll.

Leider habe ich gerade keine Idee, wie man ein solches "swipen" erkennen soll. Hat das schon mal jemand versucht oder eine Idee, wie man dies erkennen kann?

1 Like

Ich sehe das nicht als problematisch.
In der loop die einzelnen Sensoren abfragen und die jeweilige Zeit (millis) hinzufügen.

Wenn es nur um die zeitliche Reihenfolge geht ist das wohl kein Thema, aber "wischen" von viermal antippen ist schwerer zu unterscheiden. Sind die vier eng nebeneinander?

Ja, die haben nur etwa einen Finger breit Abstand (mitte-mitte)
Wenn man drüberwischt, kommt folgende Reihenfolge: A1, A1+2, A2, A2-3, A3, A3+4, A4

Das zeitliche nacheinander stellt mich nicht vor ein unlösbares Problem, aber das muss auch noch in der richtigen Geschwindigkeit (also in weniger als einer Sekunde) passieren und eben in der richtigen Reihenfolge.

Das verstehe ich gerade nicht so richtig.

Das klingt doch super.
Ich versteh dich so, dass Sensor A2 schon kommt, bevor Sensor A1 geht.
Soll bei anderen Betätigungen auch was passieren, soll schon was während des swipens passieren, oder gehts tatsächlich nur um A1->A2->A3->A4 ?

Bei "normalem" Betätigen soll ausgewählt werden, welche Werte mit dem Encoder verändert werden. Aber mit dem drüber"swipen" soll zum Beispiel der Motor schnell an oder aus gestellt werden, je nach Richtung.
Die normalen Funktionen der Schalter muss ich in diesem Fall irgendwie blockieren, aber da sehe ich jetzt nicht das Problem, da die nur auswählen sollen, welche Werte später mit dem Encoder eingestellt werden sollen.

Und was genau verstehst du da nicht ?

typische Schrittkette.

Wo ist das Problem?
Wenn Du keinen swipezustand hast, schaust Du wer als erstes auslöst. Ist es sensor 1 gehts in die eine Richtung, ist es sensor 4 ind ei andere.
Die Zeit wird mit dem ersten auslösen gemerkt.
Ist das geplante intervall abgelaufen, bevor eine Aktion ausgeführt wurde, geht die Schrittkette wieder in den Ruhezustand und wartet...

// Forensketch Swipen über 4 Eingänge mit Richtungserkennung
// https://forum.arduino.cc/t/zeitliche-abfolge-von-eingangen-erfassen/1101040/
// ungetestet - kompiliert warnungs- und fehlerfrei
enum  {warten, S1, S12, S2, S23, S3, S34, S4};
byte status = warten;
uint32_t swipeMillis;
const bool rechts = true;
bool richtung;

const bool ausgeloest = true;

void setup(void)
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode(LED_BUILTIN, OUTPUT);
  swipeMillis = millis() - 1001;
}

void ausloesen()
{
  digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));   // toggle
}

void loop()
{
  if (millis() - swipeMillis > 1000)
  {
    status = warten;
  }
  switch (status)
  {
    case warten:
      if (digitalRead(A1) == ausgeloest &&           // 10xx - Start nach rechts
          digitalRead(A2) == !ausgeloest)
      {
        richtung = rechts;
        status = S12;
        swipeMillis = millis();
      }
      else if (digitalRead(A4) == ausgeloest &&      // xx01 - Start nach links
               digitalRead(A3) == !ausgeloest)
      {
        richtung = !rechts;
        status = S34;
        swipeMillis = millis();
      }
      break;
    case S1:
      if (digitalRead(A1) == ausgeloest &&
          digitalRead(A2) == !ausgeloest)           // 10xx
      {
        ausloesen();
        status = warten;                            // Ausgangsstellung
      }
      break;
    case S12:
      if (digitalRead(A1) == ausgeloest &&          //
          digitalRead(A2) == ausgeloest)            // 11xx
      {
        if (richtung == rechts)                     // Von links nach rechts
        { status = S2; }
        else                                        // von rechts nach links
        { status = S1; }
      }
      break;
    case S2:
      if (digitalRead(A1) == !ausgeloest &&         //
          digitalRead(A2) == ausgeloest &&          // 010x
          digitalRead(A3) == !ausgeloest)           //
      {
        if (richtung == rechts)
        { status = S23; }
        else
        { status = S12; }
      }
      break;
    case S23:
      if (digitalRead(A2) == ausgeloest &&
          digitalRead(A3) == ausgeloest)            // x11x
      {
        if (richtung == rechts)
        { status = S3; }
        else
        { status = S2; }
      }
      break;
    case S3:
      if (digitalRead(A2) == !ausgeloest &&
          digitalRead(A3) == ausgeloest &&          // x010
          digitalRead(A4) == !ausgeloest)
      {
        if (richtung == rechts)
        { status = S34; }
        else
        { status = S23; }
      }
      break;
    case S34:
      if (digitalRead(A3) == ausgeloest &&          // xx11
          digitalRead(A4) == ausgeloest)
      {
        if (richtung == rechts)
        { status = S4; }
        else
        { status = S3; }
      }
      break;
    case S4:
      if (digitalRead(A4) == ausgeloest &&          // xx01
          digitalRead(A3) == !ausgeloest)
      {
        ausloesen();
        status = warten;                            // Ausgangsstellung
      }
      break;
  }
}

Ich habe zum großen Teil nur die Prüfung auf 2 Zustände. Das geht natürlich auch mit allen anderen dazu. Dann könnte man z.B. noch ne fehlerroutine reinbauen etc...
Im Kommentar steht, welche ausgelöst sein soll, um dann weiterzumachen. x bedeutet nicht beachtet, 1 ausgelöst 0 nicht ausgelöst

1 Like

Auf SPSen benutze ich Schrittketten so oft und hier hab ich einfach nicht dran gedacht.
Den Code werde ich nachher mal ausprobieren und berichten, wenn ich es fertig habe.

Vielen Dank.

Achte drauf, das ich im setup KEIN PinMode eingestellt habe für die EIngänge.
Auch bin ich davon ausgegangen, das die mit HIGH aktiv sind.
Die Logikumkehr ist in der Variablen ausgeloest möglich.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.