Frage zu millis in Funktion

Hallo, ich frage mich, wie es genau mit den millis() funktioniert, wenn man einmalig eine Funktion mit millis aufruft :thinking:
Werden die dann im Hintergrund weitergezÀhlt? :roll_eyes:

Pseudo

  if (server.hasArg("count")) {
    down();
  }


void down() {
  static unsigned long vorherigeMillis {0};
  if (millis() - vorherigeMillis >= INTERVALL) {
    vorherigeMillis = millis();
...mache was
  }
}

Die void down () steht in auf einem separaten Tab (wird also im loop nicht stÀndig aufgerufen... da wÀre mir die Funktion auch klar).

Kann man das so machen? :innocent:

Danke mal wieder fĂŒr das Licht im Dunklen :slight_smile:

der Wert den du ĂŒber millis() abfragst "zĂ€hlt im Hintergrund weiter".
"Immer."
Bis er ĂŒberlĂ€uft und wieder bei 0 anfĂ€ngt.

OK und die IF Anweisung auch? Weil es muss ja immer wieder verglichen werden, sonst wird sie ja nie war
?

Das ist mir nun völlig unklar. Alle Tabs werden vor dem Übersetzen zusammenkopiert, und eine Funktion lĂ€uft dann, wenn sie aufgerufen wird. Ich wĂŒrde mal raten, dass schon das if in deinem Pseudo nicht so oft drankommt. Sondern nur wenn ein server.handleClient() in eine deiner mit server.on verkettete Callback-Funktion verzweigt...

Aber das hat meine Glaskugel nur geraten...

Wenn du die Funktion nicht aufrufst, findet auch kein Vergleich statt.
Das if kann nicht wissen, was du dir wĂŒnscht.
Es kommt nicht aus eigenem Antrieb an die Reihe.

Ja,
Aber bedenke:
Nur wenn .hasArg("count") wahr ist, wird auch die Funktion down() aufgerufen.
Das kann beim ersten Mal passen,oder erst nach zigMillionen Aufrufen.

Besser:
Wenn der Vergleich wahr ist, eine bool Variable setzen.
Solange die bool gesetzt ist, die Funktion aufrufen und dort bei
...mache was die bool inhaltlich löschen.

Danke euch!

Wenn ich dich richtig verstehe:
Die void down() im Loop aufrufen und ĂŒber eine bool-Variable „scharf schalten“ ?

Ich habe irgendwo mal gesehen, dass man so eine millis() Funktion auch mit Parametern fĂŒttern kann, so dass man sie fĂŒr 3 verschiedene Aufgaben nutzen kann

Zum Beispiel LED blinken, Countdown und noch was.

Geht das auch parallel dann?

Nein, millis() kennt keine Parameter.

Eine Funktion sollte genau eine Sache tun.
Nicht mehr, und auch nicht weniger.

Mir scheint, du eierst um ein Problem herum, welches du nicht klar benennen magst.
Zudem rate ich dir zu einem schönen dicken C++ Buch.

Es könnten auch mehrere Probleme sein, z.B. ein Webserver, der auf eine Anforderung reagieren soll, und eine Steuerung, die einige Zeit dauert. Oder mehrere Sachen, die parallel laufen und einige Zeit dauern. Und ja, die Arduino-Funktion millis() kann bei solchen Sachen verwendet werden, aber das ist eher nebensÀchlich.

Bei millis() wird ein ZÀhler jede Millisekunde eins rauf gezÀhlt. Unterschiedliche Aufgaben sind mit statischen Variablen, die zu millis() eine Differenz bilden, möglich:

const byte tasterPin = 2;
const byte led1Pin = 8;
const byte led2Pin = 12;
const byte led3Pin = 13;
uint32_t jetzt;

void setup()
{
  pinMode (tasterPin, INPUT_PULLUP);
  pinMode (led1Pin, OUTPUT);
  pinMode (led2Pin, OUTPUT);
  pinMode (led3Pin, OUTPUT);
}
//
void loop()
{
  jetzt = millis();
  blink1();
  blink2( !digitalRead(tasterPin) );
  blink3();
}

void blink1()
{
  const uint32_t intervall = 111;
  static uint32_t vorhin = 0;

  if (jetzt - vorhin >= intervall)
  {
    vorhin = jetzt;
    digitalWrite(led1Pin, !digitalRead(led1Pin));
  }
}

void blink2(bool taster)
{
  const uint32_t intervall = 500;
  static uint32_t vorhin = 0;

  if (taster)
  {
    if (jetzt - vorhin >= intervall)
    {
      vorhin = jetzt;
      digitalWrite(led2Pin, !digitalRead(led2Pin));
    }
  }
  else
  {
    digitalWrite(led2Pin, LOW);
  }
}

void blink3()
{
  const uint32_t intervall = 200;
  static uint32_t vorhin = 0;
  
  if ( jetzt != vorhin && !(jetzt % intervall) )
  {
    vorhin = jetzt;
    digitalWrite(led3Pin, !digitalRead(led3Pin));
  }
}
1 Like

blind geschrieben... Wenns nicht geht, musst Du suchen.
Ich las jetzt nur 3 leds unterschiedlich blinken, nachdem die "scharf" sind....
[edit] Zeile aus dem setup gelöscht siehe #22[/edit]

const byte anzahl = 3;
const byte blinkPin[anzahl] = {10, 11, 12};
uint32_t lastblink[anzahl] = {0, 0, 0};

const byte taste = 2;
bool tasteGedrueckt = false;

void setup()
{
  Serial.begin (115200);
  Serial.println (F ("Start.."));
  for (byte b = 0; b < anzahl; b++)
  {
    pinMode (blinkPin[b], OUTPUT);
  }
  pinMode (taste, INPUT_PULLUP);
}

void loop()
{
  if (!digitalRead(taste)) tasteGedrueckt = true;
  for (byte b = 0; b < anzahl; b++)
  {
    blinken (blinkPin[b], (1 + b) * 500UL, lastblink[b]);
  }
}

void blinken (const byte pin, const uint32_t freq, uint32_t &lastmillis)
{
  if (!tasteGedrueckt) return;
  if (millis() - lastmillis >= freq)
  {
    lastmillis = millis();
    digitalWrite (pin, !digitalRead (pin));
  }
}
1 Like

Danke euch fĂŒr die Beispiele :slight_smile:
So etwas habe ich gesucht.
Als Einsteiger ist es nicht immer leicht, es genau zu erklÀren, was man meint :wink:
Ich werde die mal durcharbeiten!

1 Like

Danke fĂŒr die RĂŒckmeldung. Und bei Fragen bitte fragen :slightly_smiling_face:

mit erklÀrenden Kommentaren wÀre es leichter verstÀndlich.
Wenn jemand nur Spaß am Lernen hat wenn er Code StĂŒck fĂŒr StĂŒck analysieren muss, dann ist das schon "zu leicht" verstĂ€ndlich.
vgs

@StefanL38 krieg dich wieder ein.
Wenn du einen besseren Code hast, poste ihn in Code Tags.

@my_xy_projekt
Ă€ndere vieleicht dein Beispiel #12
Zeile 14 auf pinMode (blinkPin[b], OUTPUT);
Zeile 23ff

  for (byte b = 0; b < anzahl; b++)
  {
    blinken (blinkPin[b], (1 + b) * 500UL, lastblink[b]);
  }
2 Likes

GlĂŒcklichweise haben wir alle eine unterschiedliche Steigung in der Lernkurve, mal ein bißchen steiler oder flacher.
Denk mal nach:
Der Beispiel von my_xy_projekt ist PSEUDOCODE!

Have a nice day and enjoy coding in C++.
ДаĐčтД ĐŒĐžŃ€Ńƒ ŃˆĐ°ĐœŃ!

1 Like

Sagen wir mal, ich sitze bei McDoof beim FrĂŒhstĂŒck, nutze das WLAN und schaue auch beim Arduino-Forum vorbei. Da gibt es ein Thema, wo ich helfen möchte und schreibe kaffeeschlĂŒrfend ein Programm, das ich aber mangels Hardware nicht testen kann. Das lade ich dann hoch und schreibe fairerweise dazu, daß ich es nicht getestet habe.

Was ist daran falsch?

Meine Meinung: Ich kann nichts erkennen, was solch einen Aufschrei rechtfertigt!

Der Einsatz der Pauke erscheint mir hier gĂ€nzlich fehlplatziert, bitte ĂŒberdenke Deinen Text!

1 Like

Also ich finde das was my_xy_projekt macht besser als sowas wie, kaufe dir das Buch und lerne es selber. OK. es ist vielleicht oft auch besser selber was zu lernen, aber das funktioniert jedenfalls bei mir am besten mit Beispielen. Und als ich hier im Forum zuletzt wegen dem Auslesen einer Speicherkarte gefragt habe bin sowas von leer in der Birne gewesen, weil ich bei der Aufgabe echt keinen Hauch einer Ahnung hatte, wie ich das angehe. UNd da habe ich von my_xy_projekt ein Programm bekommen, das mir saubere DatensĂ€tze gemacht hat, und die Befehle, die er dafĂŒr benutzt hat, sind auch in fetten BĂŒchern eigentlich nur "erwĂ€hnt", nicht wirklich erklĂ€rt gewesen. Also die hĂ€tte ich auch in meinen vorhandenen BĂŒchern nicht gefunden. Da hast du BĂŒcher im RĂŒcken, mit 500-1000 Seiten je Buch, aber findest den Befehl nur erwĂ€hnt. Also so wie, es gibt auch noch den Befehl ....... Ende, sonst nichts. Dann suchst du im Netz und findest dort dann etwas mehr dazu, was dann aber oft wieder recht schwer verstĂ€ndlich erklĂ€rt ist. Ich wĂ€re ohne dieses Beispiel von my_xy_projekt ziemlich im Regen gestanden.

Jaaaaa, Dinge die man leicht selber finden kann, sollten man vielleicht auch suchen und finden mĂŒĂŸen, weil man die natĂŒrlich dann wirklich verstanden hat, wenn man sie sich selber zusammensuchen mußte, aber es gibt auch Dinge, da findet man nichts. Wie gesagt, da sind die Infos sogar spĂ€rlich, wenn man nach den Befehlen sucht. Auch sind die ErklĂ€rungen oft nur von dem zu verstehen, der sie geschrieben hat. Absicht? ....wer weiß.

Franz

1 Like

Wenn ich auch meine, dass Stefan eben etwas ĂŒberzogen hat, finde ich das my_xy Dingen auch etwas widerlich, arg borniert usw.

Aber immerhin bedient er die Fraktion, mit welcher ich nun wirklich herzlich wenig zu tun haben will, die "Macht ihr mal fĂŒr mich, weil ich zu doof oder zu faul bin um das selber zu tun/lernen" Fraktion.