Arduino zwei Sketche in einem Sketch

Hallo,

da ich vorhabe eine Lauflichtsteuerung mit den Arduino zu bauen und schon zwei Programme für den Arduino fertig habe wollte ich mal fragen, ob es möglich ist das der erste Sketch dreimal durchläuft und dannach der zweite Sketch auch dreimal durchläuft und das Programm dann wieder mit den ersten Sketch von vorne beginnt.

klar

Hallo Marvin,
nein, es gibt nur genau einen Sketch auf einem Arduino.

Die von Dir gewünschte Funktionalität läßt sich aber realisieren, beispielsweise mit einer Schrittsteuerung (endlicher Automat, finite state machine).

So, jetzt hast du 2 verschiedene Antworten, kannst was damit anfangen?
Wie die Frage gestellt wurde, so wurde auch geantwortet.

byte durchlauf;
void loop() { 
  switch (durchlauf) {
  case 1:
  case 2: 
  case 3:
      if (A()) durchlauf++; break;
  case 4:
  case 5:
  case 6:
      if (B()) durchlauf++; break;
  default:
    durchlauf=1; break;
}  
bool A() {
   // returns true when finished, 
   // returns false if function has to continue in the next loop.
   ...
   return true;
}

Gibt Leute, die nennen das eine finite state machine.

Musst du natürlich noch erweitern, damit es ein ganzer Sketch wird.

case ohne break für drei Durchläufe, ob das der TO ohne Erklärung versteht? Bin gespannt :slight_smile:

Er wollte ja nur wissen ob es möglich ist :wink:

Die jeweils ersten beiden cases haben übrigens gar keine eigenen Anweisungen. Da fällt einem gar nicht auf, dass eigentlich zu einemcase:auch einbreak; gehört. 8)

Bin eher gespannt, wie lang die 6 loop durchläufe werden :wink: oder ob alles in einen loop Durchluf gezwungen wird und dann wieder von vorn anfängt, oder ob er tatsächlich kurzlaufende loops hinkriegt.

michael_x:
Die jeweils ersten beiden cases haben übrigens gar keine eigenen Anweisungen. Da fällt einem gar nicht auf, dass eigentlich zu einemcase:auch einbreak; gehört.

Ein break ist micht zwingend. So wie hier wäre er sogar falsch. Es gibt auch sinnvolle Konstruktionen, wo ein Teil eigenen Code hat und ohne Break in den 2. Teil über geht.
Beispiel:

switch (befehl) {
  case 1:
      // setze LED und ledStatusauf den übergebenen Wert
  case 2:
     // Sende den ledStatus
     break;
 otherwise:
     // unbekannter Befehl;
}

Also Led setzen sendet den Status zurück und es gibt auch eine Statusabfrage.

Gruß Tommy

switch/case ist in C sehr flexibel und es gibt wenige Einschränkungen (Variablen in einem case zu deklarieren ist eine Sache worüber hier kürzlich ein paar paar Leute gestolpert sind).

Das führte dann zu sowas:

Marvin97:
...wollte ich mal fragen, ob es möglich ist das der ...

Zeige uns doch einfach mal deine Sketche und wir können dir sicher helfen, die richtig zusammen zu setzen.
Das sollten dann entsprechend meiner "Vorredner" zu einem Sketch "zusammenschmelzen".

Poste die bitte in Code-Tags (Schaltfläche </>) oben links im Editor-Fenster, hier im Forum.

Serenifly:
switch/case ist in C sehr flexibel und es gibt wenige Einschränkungen

Da gefällt mir PHP auch...

switch(true)
{
  case $a < 3 : tuwas(); break;
  case $a > 3 : tuwasanderes(); break;
}

Durch geschickte Anordnung lassen sich so unscheinbar aussehende, aber schwer wartbare Monster bauen.

Serenifly:
(Variablen in einem case zu deklarieren ist eine Sache worüber hier kürzlich ein paar paar Leute gestolpert sind).
Das führte dann zu sowas:
Duff’s Device – Wikipedia

Sehr schön!! (etwas gruselig)
Gibt halt nicht viele Möglichkeiten, Schleifen auszurollen, und das, ohne auf sie zu verzichten.

Die TaskMacros von mir, machen es ähnlich, wenn auch aus anderen Gründen.

HotSystems:
Zeige uns doch einfach mal deine Sketche und wir können dir sicher helfen, die richtig zusammen zu setzen.
Das sollten dann entsprechend meiner "Vorredner" zu einem Sketch "zusammenschmelzen".

Poste die bitte in Code-Tags (Schaltfläche </>) oben links im Editor-Fenster, hier im Forum.

Hallo HotSystems,

ersteinmal Danke für die Hilfe habe mal die beiden Sketche hier hinzugefügt.
Der erste Sketch soll ein Blinkwithout Delay erzeugen und der zweite Sketch ein Lauflicht, dass von rechts nach links läuft.
Später möchte ich im Programm über einen Taster, die beiden Programme starten können.
Sprich Taster erstes mal gedrückt Sketch 1 starten, Taster zweites mal gedrückt Sketch 2 starten, Taster drittes mal gedrückt Automatikprogramm starten.
Im Automatikprogramm soll der erste Sketch (Blinkwithout Delay) dreimal durchlaufen und dannach der zweite Sketch (rechts nach links) gestartet werden und dieser auch dreimal durchlaufen.

Hier der erste Sktech das Blinkwithout Delay:

const int potiPin = A0; 
int potiVal = 0;  

const int LED1 = 6;
const int LED2 = 7;
const int LED3 = 8;
const int LED4 = 9;
const int LED5 = 10;

// Variables will change :
int ledState = LOW;             // ledState used to set the LED


unsigned long previousMillis = 0;        // will store last time LED was updated



void setup() {

   for (int i = 0; i < 5; i++)             //For-Schleife mit der Variable 1, die von 0-4 hochgezähglt wird
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);
}

void loop() {

  unsigned long currentMillis = millis();
   potiVal = analogRead(potiPin); 

  if (currentMillis - previousMillis >= potiVal) {
 
    previousMillis = currentMillis;

  
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }


    digitalWrite(LED1 , ledState);
    digitalWrite(LED2 , ledState);
    digitalWrite(LED3 , ledState);
    digitalWrite(LED4 , ledState);
    digitalWrite(LED5, ledState);
  }
}

und hier der zweite Sketch, der das Lauflicht von rechts nach Links durchlaufen lässt.

int LEDPins []= {10, 9, 8, 7, 6}; // Variable, die die Ausgänge zu einer Variablen mit den Namen LEDPins zusammenfasst   
unsigned long letzterWechsel;     // variable, die speichert, wann von der einen zu anderen LED gesprungen wurde
int zeitproled;           // Variable, die speichert wie lange eine LED an bleiben soll
int aktuelleLED = 5;              // Variable, die speichert welche LED gerade an ist

void setup()
{
  for (int i = 0; i < 5; i++){        //For-Schleife mit der Variable 1, die von 0-4 hochgezähglt wird
    pinMode (LEDPins [i], OUTPUT);   // Legt die LEDPins als Ausgänge fest
  }
 
}

void loop() {
  zeitproled = analogRead(A0);
  unsigned long aktuelleZeit = millis ();           // Greift die Zeit für den wechsel der LED ab

 if (aktuelleZeit - letzterWechsel > zeitproled) {    // Überprüft, wann die letzte LED eingeschaltet wurde, wenn die Differenz größer ist als Zeit pro LED, dann
  digitalWrite(LEDPins[aktuelleLED], LOW);           // Schaltet die LED die gerade an ist aus und die nächste ein
  aktuelleLED = (aktuelleLED + 1) % 5;              // Die Variable AktuelleLED wird um 1 hochgezählt und durch 5 geteilt
  digitalWrite (LEDPins[aktuelleLED], HIGH);       // Setzt den Pegel der aktuellen LED auf HIGH 
  letzterWechsel = aktuelleZeit;                      // Aktualisert den Zeitpunkt aktueller Wechsel  
 }
}

Warum 5 mal "pinMode(LED1, OUTPUT);"?

du möchtest eine Ablaufsteuerung bauen. Mit Schrittkette und dem anderen Gedöns, was da noch zu gehört.

Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:
Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,

Blink Without Delay
Der Wachmann

Multitasking Macros
Intervall Macros