Mehrere "Programme" / "Funktionen" einzeln Abrufbar

Mahlzeit zusammen,
ich finde einfach keine Antwort. :frowning: Entweder ich suche falsch oder stelle mir etwas Falsches darunter vor.

Zum Problem:
Ich möchte die Austauschbarkeit möglichst groß halten. Also quasi alles vereinheitlichen.
Hierzu wäre es nötig auf einem Arduino mehrere "Programme" einzeln abrufbar zu machen.
Z. B. über Dipschalter (Binär um mehr Auswahl zu haben mit weniger Hardware).
Ein übergeben von Variablen, Definitionen etc. muss bzw. darf nicht passieren.

Ich hatte mir etwas in dieser Art vorgestellt (auch wenn es so nicht geht):

int Pin1 = LOW;
int Pin2 = LOW;
...

void Setup(){

pinMode(1, INPUT);
pinMode(2, INPUT);
...

delay (5);
Pin1 = digitalRead(1);
Pin2 = digitalRead(2);
...

if ((Pin1 == HIGH) && (Pin2 == LOW)) {
Programm_1();}
if ((Pin1 == LOW) && (Pin2 == HIGH)) {
Programm_2();}
....

Programm_1(){

#include ...
int ...
void Setup(){ Setup für das Programm1}
void Loop(){Loop für das Programm1}
}

Programm_2(){

#include ...
int ...
void Setup(){ Setup für das Programm2}
void Loop(){Loop für das Programm2}
}

Ein Umschalten während der Arduino mit Spannung versorgt ist muss nicht / sollte nicht gegeben sein.
Nun habe ich mir mit der Aufgabe mehrere Probleme eingeholt.

  1. Wie kann man das obere Realisieren? Bzw. ist das überhaupt möglich?
  2. Kann man das ganze dann auch auf mehrere Tabs verteilen? Sonst würde das zu unübersichtlich.
  3. Wie würde sich das auf die Geschwindigkeit des Arduinos auswirken?

Gerne auch mit einem kleinen erklärenden Beispiel (wenn es möglich sein sollte) damit ich das auch nachvollziehen und vor allem verstehen kann.
Ich hoffe, man konnte mich zumindest ein wenig verstehen.

Mfg. Fexel

Setup und loop gibt es nur einmal. Wenn Du immer nur nach dem Booten umschalten willst, könnte das so gehen (Pseidocode)

#include
...
byte progNummer = 0;

void setup() {
  Schalter lesen
  progNummer = gelesene Nummer;
  switch (prognummer) {
    case 0:
       setup0();
       break;
    case 1:
       setup1();
       break;
  }
}

void loop() {
  switch (prognummer) {
    case 0:
       loop0();
       break;
    case 1:
       loop1();
       break;
  }

}

void setup0() {}
void setup1() {}

void loop0() {}
void loop1() {}

Ich weiß zwar nicht, warum man sowas auf den speicherschwachen Arduinos wollen soll, aber des Menschen Wille ist ja bekanntlich sein Himmelreich.

Gruß Tommy

Nein. Das geht so nicht. Du kannst nicht loop() per Hand aufrufen, da das eine Rekursion ist. Das geschieht schon automatisch

Und #include macht nicht was du denkst. Makros folgen keinen Bereichen, sondern werden vor dem Kompilieren abgearbeitet.

Hängt davon ab, wie häufig du die "Programme" umschalten willst.

Aus Arduino - Sicht ist jedenfalls alles in einem gemeinsamen Sketch enthalten ( auch wenn du es für deine eigene Übersicht evtl. in verschiedene Tabs trennst.

Ob dein DIP-Schalter nur in setup() gelesen wird und danach bis zum nächsten Reset die gleiche Funktion läuft, oder ob in jedem loop-Durchlauf neu entschieden wird, hängt an dir bzw. deinem Wunsch.

Was auch gern gemacht wird:

  • Wenn eine Taste schon während des setup schon gedrückt ist (Bedienhinweis: Taste drücken und gedrückt halten während des Einschaltens) läuft ein Sonder-Programm, sonst der Standard.
    Gern kann man für Kalibrieren, Test, Reinigung, etc. brauchen. Die vorhandenen Taster können dann während der Sonder-Funktion eine andere Bedeutung haben und man spart sich das versteckte Mäuseklavier.

#include kannst Du nicht bedingt während des Ausführen hinzufügen. Die mußt Du schon am anfang hinsetzen.
Grüße Uwe