Funktion/Routine mehrmals durchlaufen

Hallo,

ich versuche eine Funktion z.B. Funktion 1 dreimal durchlaufen zu lassen, dannach soll diese Funktion enden und eine weitere Funktion z.B. Funktion2 auch dreimal durchlaufen.
Jedoch weiß ich nicht genau, wie ich das am besten lösen könnte.

Über einen Taster soll die Funktion1 im Loop aufegrufen werden. Die Funktion1 soll nach den loslassen des Taster gestartet werden, also wenn die Variable Tasterstaus==HIGH ist. Dannach soll die Funktion1 dreimal durchlaufen und dannach enden.
Wenn die Funktion1 beendet ist soll die Funktion2 starten und auch dreimal durchlaufen.

Habe an zwei if-Abfragen gedacht eine um die Funktion1 zu starten und eine um die Funktion 2 zu starten.
Der Sketch sieht im Moment so aus, dass wenn der Taster gedrückt wird, die Funktion1 startet und so lange an bleibt, bis der Taster ein zweites mal betätigt wird dann startet die Funktion2.

Es wäre sehr Nett, wenn mir jemand dabei helfen könnte und mir eine einfache Lösung vorschlagen würde.

Wie wär's mit einer Schleife?

Nachtrag:

Wie könnte ich es den mit einer Schleife hinbekommen?
So dass die Funktion1 dreimal durchläuft dannach endet und dann die Funktion2 dreimal druchläuft?

Du möchtest einen endlichen Automaten bauen.

sowas in der Art.
Also über einen Counter soll mit die Funktion1 dreimal und dannach die Funktion2 dreimal durchlaufen werden.
Das ganze soll aber ohne delay passieren, da nebenbei noch in der Funktion 1 und Funktion 2 LEDs angesteuert werden.

Hier erstmal der Code, wie er bis jetzt ist:

int TasterZeit = 0;               //Zeit beim drückeb des Taster
int Entprellzeit = 200;           //Entprellzeit (200ms)


//Variable für den Lichtmodus
int Lichtmodus = 0;

//Variable für den Poti
int Poti = A0;
int intervall;

//Variablen für das Lauflichtprogramm1
boolean Startwert = LOW;        //Startwert der LED
unsigned long letzterwechsel1;  //Speichert, wie viele Sekunden seit der letzten Änderung vergangen sind
int LEDPin1 = 6;                //LEDPin1 ist der Pin6
int LEDPin2 = 7;                //LEDPin2 ist der Pin7

//Variablen für das Lauflichtprogramm2
int LEDPin3 []= {6,7};          //Variable, die die Ausgänge zu einer Variablen mit den Namen LEDPins zusammenfasst   
unsigned long letzterwechsel2;  //Variable, die speicher, wann von einer LED zu anderen gesprungen wurde
int aktuelleLED = 1;            //Legt den Startwert der LED fest

void setup() {
  // put your setup code here, to run once:

pinMode (Taster, INPUT);
pinMode (LEDRueckmeldung, OUTPUT);
pinMode (LEDPin1, OUTPUT);
pinMode (LEDPin2, OUTPUT);

for (int i=0; i < 2; i++){      //For-Schleife mit der Variable i, die von 0-2 hochgezähglt wird
  pinMode(LEDPin3[i], OUTPUT);  

}

 

}

void loop() {
 
Tasterabfrage();
Potiabfrage();        
Lauflichtprogramm1();  //Lauflichtprogramm1 (Blinken nur Kanal 1 und 2)
Lauflichtprogramm2();  //Lauflichtprogramm2 (Springender Ball nur Kanal 1 und 2)
}

void Tasterabfrage() {

 Tasterstatus = digitalRead(Taster);    //Auslesen des Tasters

 if (Tasterstatus==HIGH)                //Wenn der Tasterstaus HIGH ist..  
 {
  TasterZeit=millis();                  //Aktualisieren der Tasterzeit
  Tastergedruckt = 1;                   //Speichern, dass der Taster gedrückt wurde
  digitalWrite(LEDRueckmeldung, HIGH);  //Die RückmeldeLED wird auf HIGH gesetzt
 }

 //Wenn die gewählte Entprellzeit vergangen ist und der Taster gedrückt wurde
 if ((millis() - TasterZeit > Entprellzeit) && Tastergedruckt == 1)
 {
  Lichtmodus++;                       //Lichtmodus wird um eins hochgezählt
  Tastergedruckt = 0;                 //Variable Tastergedrückt wird auf 0 gesetzt
  digitalWrite(LEDRueckmeldung, LOW); //Die RückmeldeLED wird auf LOW gesetzt
 }
}

void Potiabfrage() {
  
 intervall = analogRead(Poti);    //Auslesen des Potis
 
}

void Lauflichtprogramm1(){

  if (Lichtmodus==0){
    if (millis()- letzterwechsel1 > intervall){
      letzterwechsel1 = millis();                //aktuelle Zeit speichern
      Startwert = !Startwert;                   //Zustand der LED wechseln

      digitalWrite(LEDPin1, Startwert);         //Zustand an den Ausgang 6 & 7 schreiben
      digitalWrite(LEDPin2, Startwert);
  
    }
  }
}

void Lauflichtprogramm2(){

  if (Lichtmodus==1){
    unsigned long aktuellezeit = millis ();        //Greift die Zeit für den wechsel der LED ab
  
  if (aktuellezeit - letzterwechsel2 > intervall){ //Überprüft, ob die Differenz aus der aktuellen Zeit minus den letzten Wechsel größer als der Intervall ist 
    digitalWrite(LEDPin3[aktuelleLED], LOW);       //Aktuelle LED wird auf LOW gesetzt
    aktuelleLED = (aktuelleLED + 1) % 2;           //Aktuelle LED wird um 1 erhöht und durch 2 geteilt
    digitalWrite(LEDPin3[aktuelleLED], HIGH);      //Aktuelle LED wird auf HIGH gesetzt
    letzterwechsel2 = aktuellezeit;                //Weist die aktuellezeit den letztenwechsel2 zu
  
  }
}
}

Nun soll im Lopp eine weitere Routine/Funktion die Automatikbetrieb() heißt rein, wenn diese über die IF-Schleife if (Lichtmodus==3){} aufgerufen wird, soll das Lauflichtprogramm1 dreimal durchlaufen und dann dannach das Lauflichtprogramm2 ebenfals dreimal

Hat jemand villeicht eine Idee, wie man mein Vorhaben realisieren könnte?

Du hast es doch schon fast.
Pseudocode ungetestet:

int Lichtmodus = 0;
int counter = 0;
boolean ende = false;

void loop() {
  if (!ende) {
    Lauflichtprogramm1();  
    Lauflichtprogramm2();  
    counter++;
    if (counter >= 3) {
      counter = 0;
      Lichtmodus++;
    }
    if (Lichtmodus > 1) ende = true;
  }
}

Gruß Tommy

Habe den Pseudocode gerade mal getestet, jedoch funktioniert es bei mir irgendwie nicht.
Kann es sein, dass ich irgendwas verkehrt mache.
Hätte den Pseudocode so eingefügt.

//Einbinden der Bibliothek (Für den EEPROM)
#include <EEPROM.h> 

//Konstanten für den Tater und RückmeldeLED
const int Taster = 3;
const int LEDRueckmeldung = 2;

//Variablen für den Tater
int Tasterstatus = 0;             //Aktuelles Signal vom Taster
int Tastergedruckt = 0;           //Abfrage ob Taster gedrückt wurde
int TasterZeit = 0;               //Zeit beim drückeb des Taster
int Entprellzeit = 200;           //Entprellzeit (200ms)


//Variable für den Lichtmodus
int Lichtmodus = 0;
int counter=0;
boolean ende = false;

//Variable für den Poti
int Poti = A0;
int intervall;

//Variablen für das Lauflichtprogramm1
boolean Startwert = LOW;        //Startwert der LED
unsigned long letzterwechsel1;  //Speichert, wie viele Sekunden seit der letzten Änderung vergangen sind
int LEDPin1 = 6;                //LEDPin1 ist der Pin6
int LEDPin2 = 7;                //LEDPin2 ist der Pin7

//Variablen für das Lauflichtprogramm2
int LEDPin3 []= {6,7};          //Variable, die die Ausgänge zu einer Variablen mit den Namen LEDPins zusammenfasst   
unsigned long letzterwechsel2;  //Variable, die speicher, wann von einer LED zu anderen gesprungen wurde
int aktuelleLED = 1;            //Legt den Startwert der LED fest

void setup() {
  // put your setup code here, to run once:

pinMode (Taster, INPUT);
pinMode (LEDRueckmeldung, OUTPUT);
pinMode (LEDPin1, OUTPUT);
pinMode (LEDPin2, OUTPUT);

for (int i=0; i < 2; i++){      //For-Schleife mit der Variable i, die von 0-2 hochgezähglt wird
  pinMode(LEDPin3[i], OUTPUT);  

}

 

}

void loop() {

i[color=red]f (!ende) {
    Lauflichtprogramm1(); 
    Lauflichtprogramm2(); 
    counter++;
    if (counter >= 3) {
      counter = 0;
      Lichtmodus++;
    }
    if (Lichtmodus > 1) ende = true;
  }[/color]
  Tasterabfrage();
Potiabfrage();
}


        



void Tasterabfrage() {

 Tasterstatus = digitalRead(Taster);    //Auslesen des Tasters

 if (Tasterstatus==HIGH)                //Wenn der Tasterstaus HIGH ist..  
 {
  TasterZeit=millis();                  //Aktualisieren der Tasterzeit
  Tastergedruckt = 1;                   //Speichern, dass der Taster gedrückt wurde
  digitalWrite(LEDRueckmeldung, HIGH);  //Die RückmeldeLED wird auf HIGH gesetzt
 }

 //Wenn die gewählte Entprellzeit vergangen ist und der Taster gedrückt wurde
 if ((millis() - TasterZeit > Entprellzeit) && Tastergedruckt == 1)
 {
  Lichtmodus++;                       //Lichtmodus wird um eins hochgezählt
  Tastergedruckt = 0;                 //Variable Tastergedrückt wird auf 0 gesetzt
  digitalWrite(LEDRueckmeldung, LOW); //Die RückmeldeLED wird auf LOW gesetzt
 }
}

void Potiabfrage() {
  
 intervall = analogRead(Poti);    //Auslesen des Potis
 
}

void Lauflichtprogramm1(){

  if (Lichtmodus==0){
    if (millis()- letzterwechsel1 > intervall){
      letzterwechsel1 = millis();                //aktuelle Zeit speichern
      Startwert = !Startwert;                   //Zustand der LED wechseln

      digitalWrite(LEDPin1, Startwert);         //Zustand an den Ausgang 6 & 7 schreiben
      digitalWrite(LEDPin2, Startwert);
  
    }
  }
}

void Lauflichtprogramm2(){

  if (Lichtmodus==1){
    unsigned long aktuellezeit = millis ();        //Greift die Zeit für den wechsel der LED ab
  
  if (aktuellezeit - letzterwechsel2 > intervall){ //Überprüft, ob die Differenz aus der aktuellen Zeit minus den letzten Wechsel größer als der Intervall ist 
    digitalWrite(LEDPin3[aktuelleLED], LOW);       //Aktuelle LED wird auf LOW gesetzt
    aktuelleLED = (aktuelleLED + 1) % 2;           //Aktuelle LED wird um 1 erhöht und durch 2 geteilt
    digitalWrite(LEDPin3[aktuelleLED], HIGH);      //Aktuelle LED wird auf HIGH gesetzt
    letzterwechsel2 = aktuellezeit;                //Weist die aktuellezeit den letztenwechsel2 zu
  
  }
}
}

Den Taster hatte ich übersehen und der Counter muss in den Led-Funktionen erhöht werden (counter bis 6, da ja jede Funktion 2 Zustände hat).

//Einbinden der Bibliothek (Für den EEPROM)
#include <EEPROM.h> 

//Konstanten für den Tater und RückmeldeLED
const int Taster = 3;
const int LEDRueckmeldung = 2;

//Variablen für den Tater
int Tasterstatus = 0;             //Aktuelles Signal vom Taster
int Tastergedruckt = 0;           //Abfrage ob Taster gedrückt wurde
int TasterZeit = 0;               //Zeit beim drückeb des Taster
int Entprellzeit = 200;           //Entprellzeit (200ms)


//Variable für den Lichtmodus
int Lichtmodus = 0;
int counter=0;
boolean ende = true;

//Variable für den Poti
int Poti = A0;
int intervall;

//Variablen für das Lauflichtprogramm1
boolean Startwert = LOW;        //Startwert der LED
unsigned long letzterwechsel1;  //Speichert, wie viele Sekunden seit der letzten Änderung vergangen sind
int LEDPin1 = 6;                //LEDPin1 ist der Pin6
int LEDPin2 = 7;                //LEDPin2 ist der Pin7

//Variablen für das Lauflichtprogramm2
int LEDPin3 []= {6,7};          //Variable, die die Ausgänge zu einer Variablen mit den Namen LEDPins zusammenfasst   
unsigned long letzterwechsel2;  //Variable, die speicher, wann von einer LED zu anderen gesprungen wurde
int aktuelleLED = 1;            //Legt den Startwert der LED fest

void setup() {
  // put your setup code here, to run once:

pinMode (Taster, INPUT);
pinMode (LEDRueckmeldung, OUTPUT);
pinMode (LEDPin1, OUTPUT);
pinMode (LEDPin2, OUTPUT);

for (int i=0; i < 2; i++){      //For-Schleife mit der Variable i, die von 0-2 hochgezähglt wird
  pinMode(LEDPin3[i], OUTPUT);  

}

 

}

void Lauflichtprogramm1(){

  if (Lichtmodus==0){
    if (millis()- letzterwechsel1 > intervall){
      letzterwechsel1 = millis();                //aktuelle Zeit speichern
      Startwert = !Startwert;                   //Zustand der LED wechseln

      digitalWrite(LEDPin1, Startwert);         //Zustand an den Ausgang 6 & 7 schreiben
      digitalWrite(LEDPin2, Startwert);
      counter++;
    }
  }
}

void Lauflichtprogramm2(){
  if (Lichtmodus==1){
    unsigned long aktuellezeit = millis ();        //Greift die Zeit für den wechsel der LED ab
 
    if (aktuellezeit - letzterwechsel2 > intervall){ //Überprüft, ob die Differenz aus der aktuellen Zeit minus den letzten Wechsel größer als der Intervall ist
      digitalWrite(LEDPin3[aktuelleLED], LOW);       //Aktuelle LED wird auf LOW gesetzt
      aktuelleLED = (aktuelleLED + 1) % 2;           //Aktuelle LED wird um 1 erhöht und durch 2 geteilt
      digitalWrite(LEDPin3[aktuelleLED], HIGH);      //Aktuelle LED wird auf HIGH gesetzt
      letzterwechsel2 = aktuellezeit;                //Weist die aktuellezeit den letztenwechsel2 zu
      counter++;
    }
  }
}

void loop() {

if (!ende) {
    Lauflichtprogramm1(); 
    Lauflichtprogramm2(); 
    if (counter >= 6 { // An und aus je 3 Mal
      counter = 0;
      Lichtmodus++;
    }
    if (Lichtmodus > 1) ende = true;
  }
  Tasterabfrage();
Potiabfrage();
}

void Tasterabfrage() {

 Tasterstatus = digitalRead(Taster);    //Auslesen des Tasters

 if (Tasterstatus==HIGH)                //Wenn der Tasterstaus HIGH ist..  
 {
  TasterZeit=millis();                  //Aktualisieren der Tasterzeit
  Tastergedruckt = 1;                   //Speichern, dass der Taster gedrückt wurde
  digitalWrite(LEDRueckmeldung, HIGH);  //Die RückmeldeLED wird auf HIGH gesetzt
 }

 //Wenn die gewählte Entprellzeit vergangen ist und der Taster gedrückt wurde
 if ((millis() - TasterZeit > Entprellzeit) && Tastergedruckt == 1)
 {
    ende = false;                         // es geht los
    Lichtmodus=0;                       //Lichtmodus wird auf 0 gesetzt
  Tastergedruckt = 0;                 //Variable Tastergedrückt wird auf 0 gesetzt
  digitalWrite(LEDRueckmeldung, LOW); //Die RückmeldeLED wird auf LOW gesetzt
 }
}

void Potiabfrage() {
  
 intervall = analogRead(Poti);    //Auslesen des Potis
 
}

ich hoffe, jetzt geht es. Ohne zu Testen ist es immer fehlerfreudig.

Gruß Tommy

Danke es funktioniert soweit, könnten Sie mir villeicht noch erklären, wass in diesem Teil passiert und warum beide lauflichtprogramm dann nur dreimal durchlaufen werden?

if (!ende) {
Lauflichtprogramm1();
Lauflichtprogramm2();
if (counter >= 6 { // An und aus je 3 Mal
counter = 0;
Lichtmodus++;
}
if (Lichtmodus > 1) ende = true;
}

Wie könnte ich es den realisieren, dass beide Funktionen hintereinander dreimal druchlaufen werden und dann das programm in einer Endlosschleife abläuft also.

Wenn der Tasterstaus == 2 ist, das Lauflichtprogramm1 dreimal druchlaufen, dann das Lauflichtprogramm2 dreimal durchlaufen und wieder mit den Lauflichtprogramm1 starten, dass dann wieder 3 mal druchläuft?

Wir sind hier eigentlich beim Du.

if (!ende) { // ! heißt nicht, d.h. wenn ende == true ist, ist !ende false und damit gehen wir nicht in den Block
                 // Da sich das Ganze ja nicht immer wiederholen soll, müssen wir uns merken, ob wir die LEDs steuern wollen oder nicht
                 // am Anfang wird ende auch auf false gesetzt, damit es erst nach dem Taster los läuft
    Lauflichtprogramm1();  // hier wird jeweils der Counter bei jedem Statuswechsel hoch gezählt
    Lauflichtprogramm2();  // Die Programme haben immer 2 Zustände und die mal 3
    if (counter >= 6 { // An und aus je 3 Mal erfüllt
      counter = 0;       // dann counter wieder auf 0 für den nächsten Lauf
      Lichtmodus++;  // den Lichtmodus um 1 erhöhen
    }
    if (Lichtmodus > 1) ende = true;  // Wenn wir über 1 sind, dann sind wir fertig.
  }

So etwa? Ansonsten konkret fragen.

Gruß Tommy

Danke, wenn ich die If(!ende){} Schleife änder würde das Programm dann in Endlosmodus ablaufen, sprich wenn der Tasterstatus==2 ist, dann soll das Lauflichtprogramm1 dreimal durchlaufen werden, dann das lauflichtprogramm2 dreimal und dann wieder mit den lauflichtprogramm´1 gestartet werden.

Dann mußt Du anstelle von

if (Lichtmodus > 1) ende = true;

schreiben:

if (Lichtmodus > 1) Lichtmodus = 0;

Du kannst es aber auch bereits jetzt durch neuen Tastendruck wieder starten.

Gruß Tommy

Okay Danke erstmal.
Also das void lauflichtprogramm1 und void Lauflichtprogramm2 wollte ich gerne beibehalten und ein neues void Automatikbetrieb hinzufügen, dass dann gestartet wird, wenn der Lichtmodus==2 ist.
Könntest du mir villeicht erklären, wie ich den Teil von dir in den void Automatikbetrieb einfügen müsste und gibt es noch eine andere Möglichkeit, wie man mein Vorhaben realiseren kann.
So dass der erste Lauflichtprogramm und das zweite lauflichtprogramm dreimal durchlaufen werden in der void Automatikprogramm, wenn der Lichtmodus==2 ist?

Ich glaube, jetzt müssen wir mal von vorn anfangen und etwas Struktur in die Sache bringen.
Was soll das "Automatikprogramm machen und wodurch soll es ausgelöst werden?
Einfach so nach 2?

Gruß Tommy

Das Automatikprogramm soll mir das Lauflichtprogramm1 dreimal durchlaufen und dannach das lauflichtprogramm2 dreimal durchlaufen und zwar in einer Endlosschleife, die durch ein weiteres betätigen des Tasters (Taster 3 mal betätigt) beendet werden kann.

Also folgender Maßen:

-Arduino mit Strom versorgt ---> Lauflichtprogramm1 ausführen

-Taster erstes mal betätigt ---> Lauflichtprogramm2 ausführen

-Taster zweites mal betätigt ---> Lauflichtprogramm1 dreimal durchlaufen, dannach Lauflichtprogramm2 dreimal durchlaufen (Im einer Endlosschleife, wie wenn der Programmteil im LOOP stehen würde).

-Taster drittes mal betätigt ---->Wieder mit den Lauflichtprogramm 1 starten.

Das mir das Lauflichtprogramm1 ausgeführt wird, wenn der Arduino mit Strom versorgt wird habe ich in meinem Sketch ja geschafft, sowie wie mir das Lauflichtprogramm2 ausgeführt wird, wenn ich den Taster das erste mal betätige.
Was mir jetzt nur Schwierigkeiten verursacht ist der Automatikbetrieb des aktiviert werden soll, wenn der Taster das zweite mal betätigt wird.
Könntest du mir vielleicht dabei helfen?

Das solltest Du eigentlich aus dem vorhandenen Code selbst zusammen bauen können.

Wennn in Automatik und Taster, dann ende = true;
Alles andere ist bekannter Code. Lediglich für Automatik brauchst Du eine eigene Variable, weil Du ja 0 und 1 trotzdem brauchst.

Gruß Tommy

okay wie realisiere ich das den, dass mir das Lauflichtprogramm1 und 2 dreimal nacheinander durchlaufen wird?

Probier mal:

boolean automatik = false;

alt:
if (Lichtmodus > 1) ende = true;

neu:
if (automatik) {
  if (Lichtmodus > 1) Lichtmodus = 0;
}
else if (Lichtmodus > 1) ende = true;

Das Setzen der Variablen automatik auf true oder false beim Tastendruck kannst Du selbst.

Gruß Tommy