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.
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.
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
}