delay durch millis innerhalb einer funktion ersetzen?1

ich hab jetzt mehrere sachen versucht aber die klappen nicht so recht.. leider...

ich MUSS in einigen Voids / Funktionen DRINGEND gewisse Delays einsetzten.
Diese Delays sind bedingt notwendig um ein Fremd-Bedienteil durch den Arduino auszulesen und umzuschalten.

Trotzdem weis ich jetzt nicht wo mein fehler liegt...

ich hoffe mal wieder auf eure hilfe!

Danke

Hier ein code .. im serial monitor mit #an geht die kiste los....

es sollen wirklich 3 sekunden " gewartet " werden!

Danke

String readString;                       
int Ergebnis = 0
unsigned long previousMillis = 0;        
const long interval = 1000;           

void setup() 
{
Serial.begin(19200);           
}

void loop()
{
  
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;   

leseSerial(); 
    
  }
}

void Hallo()
{
Serial.println("ich will 3 sekunden Warten");
//delay(3000);
if(milis()>(previousMillis+3000))
{
Serial.println("Ich hab 3 Sekunden gewartet");
}
}

void lese Serial()
{ Ergebnis = 0;                           //Grundwert für Ergebnis
   while (Serial.available())              //Wenn etwas hereinkommt
  {
    Ergebnis = 1;                         //wechselt Ergebnis auf 1
    delay(100);
    char c = Serial.read();
    readString += c;
  }
  if (readString.length() > 0)
  {
    readString.trim();
    Serial.println(readString);
    if (readString.indexOf("#an") >= 0)
    {
      Hallo();

    }
    readString = "";
    delay(10);
    return Ergebnis;
  }
}

ich MUSS in einigen Voids / Funktionen DRINGEND gewisse Delays einsetzten.

delay() kann man nicht 1:1 ersetzen.
Die Programmlogik, der ganze Ablauf, muss geändert werden.

Warum?

Eine Funktion mit delay() braucht nur 1 mal aufgerufen zu werden, um ihren Job zu tun.
Ein Funktion ohne delay() muss solange, so oft, aufgerufen werden, bis sie ihren Job tun kann.

also inerhalb einer funktion kann ich nur mit delay arbeiten?

ich hab eine funktion die das benötigt...

wenn diese funktion alle 8 schaltzustände ändern müsste bräuchte die funktion insgesamt 5 sekunden.

hab mir das grademal auf dem serial monitor angeschaut.... die millis () laufen weiter während der Ausführung. . aber Vergangenezeit läuft erst weiter wenn die funktion fertig ist.

rechnerisch sind das dann aber genau 5,1 sekunden.

damit kann ich leben. es stört nicht im programm denn das passiert nur einmal wenn das programm den aufruf bekommt.

es gibt definitiv keine saubere lösung ohne delay?

es gibt definitiv keine saubere lösung ohne delay?

Natürlich...
Und du kennst sie schon!

oder ich nutz die schrittkette wie von dir im beispiel?!

schritt1 daten auslesen
schritt2 ist zustand auf soll zustand bringen
schritt2a zustand1 ändern(Lüfter Stufe 15%)
delay
schritt2b zustand2 ändern(Luft Scheibe auf)
delay
schritt2c zustand3 ändern(Luft Körper zu)
delay
schritt2d zustand4 ändern(Luft Fussraum zu)
delay
schritt2f zustand5 ändern(umluft an)

das auslesen :

jede taste (luft scheibe, körper, fussraum, umluft) hat eine Led.
Diese Led greife ich per optokoppler ab und gib so bei an High oder bei aus Low auf den Arduino.

die taster sind plus steuernd. ich greife diese ab und schliesse den kontakt per printrelais.

die lueftersteuerung kann mit 2 tasten mini oder maximiert werden.
drückt man min. für 3 sekunden so wird die luefterstufe komplett runtergefahren auf 5%.
pro tastendruck auf max wächst die Lüeftergeschwindigkeit um 10%.

auch hier sind 2 print relais im einsatz.

derzeit läuft das über einen seperaten nano der mit 2 ports mit dem anderen nano verbunden ist.

ist nano1 aktiv und sendet high auf die ports vom nano2 arbeitet er los.
hat nano2 aber die zuendung vom auto erkannt (12v über relais abgegriffen und auf 5v high )

macht nano2 nichts.

drück ich ohne zündung an die tasten des bedienteils regelt der nano nach 1 sekunden nach.

eigentlich doch ne geile sache oder?
besonders weil ich mit 2 i2c portexpandern arbeite.

ein expander für input der andere für output.

nun ist meine überlegung alles in nano1 mit einzubauen... die ports sind frei.. der speicher reicht dicke.

ich weis never touch a running system...

Die generelle Idee bei sowas ist dass man die Funktion ständig aufruft und nachschaut ob die Zeit aufgelaufen ist. Wenn nicht kehrt man gleich mit "return" zurück. Wenn ja, macht man was man möchte.

Bei einem Zustands-Automaten macht man die Verzögerung aber eher in der Ablaufsteuerung. Zwischen den einzelnen Zuständen. Und nicht in den ausgeführten Funktionen selbst!

hast du rin beispiel um sich das anschsulich zu machen?

hoer173:
hast du rin beispiel um sich das anschsulich zu machen?

Aber sicher!!!

void will_dauernd(void)
{
  // tue hier das, was dauernd getan werden soll  
}

void setup() 
{
}

void loop() 
{
  will_dauernd();
}