Befehl einmalig in einem Loop mehrerer Schleifen ausführen

Hallo Coder,

habe hier ein Codeschnipsel:

if (Stunde == 0 && Minute == 0) {
    // null
    Serial.print("null"); 
  }
  if (Stunde == 1 && Minute == 0) {
    //  oans
    Serial.print("oans");
  }
  if (Stunde == 2 && Minute == 0) {
    // zwoa
    Serial.print("zwoa");
  }
  if (Stunde == 3 && Minute == 0) {
    // drei
    Serial.print("drei"); 
  }
  if (Stunde == 4 && Minute == 0) {
    Serial.print("viere");//  viere
  }
  if (Stunde == 5 && Minute == 0) {
    Serial.print("fünfe");// fünfe
  }

// hier die Funktion die immer nur 1x laufen soll.
void SetFunk(){
//hier mein weiterer code
// der immer einmalig ausgeführt werden soll
}

Diese Abfragen laufen im Dauer Loop. Soweit alles gut.
Nun aber zum Problem. Wie man vielleicht erkennt, schaltet hier jede Stunde eine andere IF Schleife ein. Diese ist dann auch für 1 Stunde zutreffend.
Die Stunden berechne ich by the Way mit einer Millis() -Funktion, also kein Delay :slight_smile:

Ich habe nun versucht, einmalig eine void SetFunk() aufzurufen, wenn der Code in eine IF Schleife eintritt.

Also jedes mal, wenn eine neue IF Schleife zutrifft soll exakt einmal die untenstehende Funktion ausgeführt werden.
Trifft die nächste IF zu, soll die Funktion wieder nur einmal durchlaufen werden.
Die If Abfragen sind ja immer genau 1 Stunde zutreffend, da erst nach 1 Stunde die nächste If zutrifft.

Leider finde ich einfach kein passenden Code. Habs mit Zählen versucht, mit Flanken, mit State-Änderungen und sogar mit mehreren entgegengesetzten Flanken.

Ich benutze häufig Flanken für einmalig ausführbare Dinge, jedoch ist das Problem leicht anders, da das ja immer wieder erneut einmalig ausgeführt werden muss und von mehreren "Parteien" aufgerufen wird (von den ganzen if schleifen).

Hat wer irgendeine Idee dazu? oder einen Denkanstoß? Wäre super dankbar :slight_smile:
VG Franz

Ihr Beitrag wurde an seinen aktuellen Speicherort verschoben, da er besser geeignet ist.

warum bringst Du das nicht komplett.

benutze einen Merker, in dem Du den letzten Eintritt merkst.
Ist der letzte Eintritt != dem aktuellen Eintritt, sende.

Zum Nachlesen: http://if-schleife.de/

Und Hinweis: Du bist heute zum zweiten Mal verschoben worden - bitte gewöhne Dir an, das von vornherein zu vermeiden. Die Mods sind freiwillig unterwegs...
Thx @UKHeliBob :wink:

mach dir einen Merker.
merk dir im Merker die Stunde in der du etwas ausgeführt hast
Prüfe in deinen if Bedingungen auch auf die letzte gemerkte Stunde

Das würde ich nicht machen, solange nicht klar ist, was da passieren soll.
Das Ausgangspost:

Die ist nur für eine Minute an...

Wenn ich nur einmal in der Stuunde senden will, merke ich mir die Stunde:

uint8_t lastStunde = 61;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
}

void loop()
{
  if (Stunde == 0 && Minute == 0)
  {
    // null
    Serial.print("null");
  }
  if (Stunde == 1 && Minute == 0)
  {
    //  oans
    Serial.print("oans");
  }
  if (Stunde == 2 && Minute == 0)
  {
    // zwoa
    Serial.print("zwoa");
  }
  if (Stunde == 3 && Minute == 0)
  {
    // drei
    Serial.print("drei");
  }
  if (Stunde == 4 && Minute == 0)
  {
    Serial.print("viere");//  viere
  }
  if (Stunde == 5 && Minute == 0)
  {
    Serial.print("fünfe");// fünfe
  }
  if (lastStunde != Stunde)
  {
    setFunk();
    lastStunde = Stunde;
  }
}
// hier die Funktion die immer nur 1x laufen soll.
void SetFunk()
{
  //hier mein weiterer code
  // der immer einmalig ausgeführt werden soll
}

:wink:
Und wenn ich ganz gut bin, werte ich noch aus, ob SetFunk erfolgreich war...

  if (lastStunde != Stunde)
  {
    if (setFunk())
    lastStunde = Stunde;
  }

Ich bitte um Verzeihung, wird beachtet beim nächsten Post :wink:

Wie @my_xy_projekt schon geschrieben hat, weicht Deine Aussage

Diese ist dann auch für 1 Stunde zutreffend.

vom Sketch ab ... Wenn Du eine ganze Stunde lang mit maximaler Serial-Geschwindigkeit "oansoansoansoans..." auf dem Monitor sehen möchtest, könntest Du das so schreiben;

uint8_t lastStunde = 61;
uint8_t Stunde = 0;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
}

void loop() {
  if (lastStunde != Stunde) {
    SetFunk();
    lastStunde = Stunde;
  }
  switch (Stunde) {
    case 0:  Serial.print("null");
      break;
    case 1: Serial.print("oans");
      break;
    case 2: Serial.print("zwoa");
      break;
    case 3: Serial.print("drei");
      break;
    case 4: Serial.print("viere");
      break;
    case 5: Serial.print("fünfe");
      break;
    default:
      break;
  }
}

// hier die Funktion die immer nur 1x laufen soll.
void SetFunk() {
  //hier mein weiterer code
  // der immer einmalig ausgeführt werden soll
}

Soll die Uhrzeit auch nur einmal pro Stunde angezeigt werden, verschiebt man den switch(){} Anteil in die if-Bedingung, z.B. hinter lastStunde = Stunde;

So wie es oben steht (die erste Minute einer Stunde lang), sähe das so aus:

uint8_t lastStunde = 61;
uint8_t Stunde = 0;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
}

void loop() {
  if (lastStunde != Stunde) {
    SetFunk();
    lastStunde = Stunde;
  }
  if (minute == 0) {
    switch (Stunde) {
      case 0:  Serial.print("null");
        break;
      case 1: Serial.print("oans");
        break;
      case 2: Serial.print("zwoa");
        break;
      case 3: Serial.print("drei");
        break;
      case 4: Serial.print("viere");
        break;
      case 5: Serial.print("fünfe");
        break;
      default:
        break;
    }
  }  
}

// hier die Funktion die immer nur 1x laufen soll.
void SetFunk() {
  //hier mein weiterer code
  // der immer einmalig ausgeführt werden soll
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.