Ablaufsteuerung für Oled

Hallo Zusammen,
ich habe gerade angefangen mich mit einer Oled Anzeige zu beschäftigen.
Für Testzwecke habe ich mit delays gearbeitet, aber das ist ja nicht unbedingt die elegante Art, zumal der esp noch andere Dinge erledigen soll.
Die Anzeige schaltet zwischen verschiedenen Werten um, dann kommen wipeouts usw. überall brauche ich unterschiedliche Zeiten.
Mit unterschiedlichen Zeitgebern per Millis ist ja auch nicht schön und auch nicht besonders übersichtlich.
Wie löst man das elegant?
Vielen Dank schon mal für Eure Vorschläge
Grüße Uwe

Ds löst man so, wie du es beschrieben hast.
Per millis() und einigen Switch/case oder wenns muss auch per if-Abfragen.

Aber millis() ist genau deine Lösung.
Wenn du dir eine eigene Funktion schreibst und diese mit der jeweiligen Zeit im Aufruf startest, ist es doch schon perfekt.
Oder du nimmst fertige Timer. Z.B Interval

@TO: Welcher ESP?

Gruß Tommy

D1 mini

Also ESP8266. Da könntest Du Dir auch die MoBaTools mal anschauen.

Gruß Tommy

rentneruwe:
Die Anzeige schaltet zwischen verschiedenen Werten um, dann kommen wipeouts usw. überall brauche ich unterschiedliche Zeiten.
Mit unterschiedlichen Zeitgebern per Millis ist ja auch nicht schön und auch nicht besonders übersichtlich.
Wie löst man das elegant?

Schrittkette UND millis().

Ich hatte gerade das Vergnügen eine Mischaung aus Beidem zu bauen.

Der Sketch dort macht einen Schritt nach dem anderen und da ist auch zu sehen, wie das mit einer Wartezeit funktioniert.

rentneruwe:
...
Mit unterschiedlichen Zeitgebern per Millis ist ja auch nicht schön und auch nicht besonders übersichtlich.
Wie löst man das elegant?

Indem man einen Endlichen Automaten programmiert und genau dafür ist millis() prima. Wie übersichtlich Du das machst, hängt allein von Dir ab. Du könntest z.B. mit Klassen arbeiten, das macht vieles übersichtlich.

Gruß

Gregor

Hallo
hier kommt was aus der Sketch-Reste-Kiste.

#define ProjektName "Ablaufsteuerung für Oled"
void anzeige1() {
  Serial.println(F("Anzeige 1 für OLED"));
}
void anzeige2() {
  Serial.println(F(" Anzeige 2 für OLED"));
}
void anzeige3() {
  Serial.println(F("  Anzeige3 für OLED"));
}
void test() {
  Serial.println(F("   test"));
}
//---------------------------- 
void (*tasks[])() {
  anzeige1, anzeige2, anzeige3, test    /* Hier kommen die Funktionsnamen rein */
};
const unsigned long Pause[] {1000, 1000, 1000,5000};    //Pause in msec
//---------------------------------------------------------------------------------------------------
const unsigned int Anzahl = sizeof(Pause) / sizeof(long);
struct SCHRITTKETTE {
  unsigned long stempel[Anzahl];
  unsigned long pause[Anzahl];
  void (*task[Anzahl])();
};
SCHRITTKETTE stufe;
void setup() {
  Serial.begin(9600);
  Serial.print("File   : "), Serial.println(__FILE__);
  Serial.print("Date   : "), Serial.println(__DATE__);
  Serial.print("Projekt: "), Serial.println(ProjektName);
  pinMode (LED_BUILTIN, OUTPUT);
  for (unsigned int n = 0; n < Anzahl; n++) stufe.pause[n] = Pause[n], stufe.task[n] = tasks[n];
  Serial.println(F(".\nund los geht´s"));
}
void loop() {
  digitalWrite(LED_BUILTIN, millis() / 500 % 2);
//  unsigned long jetzt = millis();
  static int nummer = 0;
  if (millis()- stufe.stempel[nummer] >= stufe.pause[nummer]) {
    stufe.task[nummer]();
    nummer++, nummer = nummer % Anzahl;
    stufe.stempel[nummer] = millis();
  }
}

paulpaulson:

  unsigned long jetzt = millis();

if (jetzt - stufe.stempel[nummer] >= stufe.pause[nummer]) {
    stufe.tasknummer;
    nummer++, nummer = nummer % Anzahl;
    stufe.stempel[nummer] = jetzt;

Ich hab da ein Problem....
Du verlierst zwischen der Frage in der Bedingung und dem "setzen" Zeit, die Du nicht berücksichtigst.
Wenn es darum geht, das die stufe.task eine bestimmte Zeit laufen soll, musst Du die Zeit nehmen die NACH Einstellung der Stufe tatsächlich da ist.
Spart auch die Variable.

Neu:

void loop() {
  digitalWrite(LED_BUILTIN, millis() / 500 % 2);
  static int nummer = 0;
  if (millis() - stufe.stempel[nummer] >= stufe.pause[nummer]) {
    stufe.task[nummer]();
    nummer++, nummer = nummer % Anzahl;
    stufe.stempel[nummer] = milis();
  }
}

Vielen Dank für Eure Tipps,
ich mach es mit switch case, da kann man dann schön jeden Schritt einstellen.
Viele Grüße Uwe