Switch case als Programm-Modi

Hallo zusammen,

vllt. habt ihr eine Idee oder ein Beispiel.
Ich möchte ein Switch Case als Modi-Funktion nutzen.
Dieser soll 3 Modis erhalten evtl. auch mehr.
Sprich wenn 2 digitale Eingänge auf 0 sind, dann soll er den 1 Case bearbeiten solange bis ein Eingang auf High ist dann soll er den nächsten Case abarbeiten usw.
Also jeder Case hat eine genaue Zuordnung von digitalen Eingänge und muss diesen abarbeiten, wenn diese erfüllt sind und direkt den Case wechseln, wenn sich die Signale an den Eingängen verändert.

Bsp.:
Pin 3 und Pin 4 = Low -> Case 0
Pin 3 = Low und Pin 4 = High -> Case 1
Pin 3 = High und Pin 4 = Low -> Case 2
usw.

Ihr würdet mir sehr helfen.

Grüße

aus meiner Sicht könnte man das mit einer

Finite State Machine (siehe Wikipedia)

lösen.

Wie ich das machen würde, habe ich an einem Beispiel hier beschrieben.

Wenns ganz was einfaches sein soll, reicht auch ein struct array oder gar nur ein direkter Port Zugriff. Aber irgendwann brauchst sowieso eine FSM und Erfahrungsgemäß kommen im laufe eines Threads sowieso immer mehr Zusatzanforderungen dazu.

Ein Mittelding wäre die Pins in eine "Bitmap" zu lesen, und dann einfach den Switch case abzuarbeiten.

(deleted)

Mittelding PoC

const byte pin[] {A0, 2, 4, 7};  // die Pins, Reihenfolge egal, merke wir beginnen mit 0 zum Zählen

void setup() {
  Serial.begin(115200);
  for (auto &i : pin)
    pinMode(i, INPUT_PULLUP);
}

void loop() {
  // Pins einlesen und Bitmap erstellen
  byte bitmap = 0;   // zum Einlesen von bis zu 8 pins
  for (size_t i = 0; i < sizeof(pin); i++)
  {
    if (digitalRead(pin[i]) == LOW)  // Logik invertieren umdrehen wegen Pullup
      {
      bitSet(bitmap, i);
      }
  }
  Serial.print(F("bitmap=")); Serial.println(bitmap, BIN);
  // verarbeiten
  switch (bitmap)
  {
    case 0b0000:
      Serial.println(F("nix"));
      break;
    case 0b0001:
      Serial.println(F("nur Pin aus Index 0"));
      break;
    case 0b0011:
      Serial.println(F("nur Index 0 und 1"));
      break;
    case 0b0010:
      Serial.println(F("nur das zweite"));
      break;
    case 0b0111:
      Serial.println(F("die ersten drei "));
      break;
    default :
      Serial.println(F("undefined"));
  }
  delay(1000); // dirty delay
}

vielen dank schonmal für die antwort, werde jetzt mal testen mit welchem programmcode ich zurechtkomme :smiley:

(deleted)

SwitchCase_digitalRead-201117a.zip (1.88 KB)