Teil eines Programms zufallsgesteuert ablaufen lassen

Guten Abend,
eine Frage, die sich über die Suchfunktion nicht beantworten ließ:
ein Programmteil soll nur alle paar Sekunden (wahlfreie Zeit) mit ablaufen.
wo und wie baue ich jetzt ein Quasi Start und Stop ein?
Meine Versuche über die If millis()…else etwas zu bewerkstelligen sind, wie immer, kläglich gescheitert.

Das Programmteil :

int ledPin = 3;
int ledStatus[6];
long Zufall;
int i;

void setup() 
{
pinMode(ledPin, OUTPUT);
randomSeed(analogRead(0));
ledStatus[0] = random(10, 100);
ledStatus[1] = random(10, 100);
ledStatus[2] = random(10, 100);
ledStatus[3] = random(10, 100);
ledStatus[4] = random(10, 100);
ledStatus[5] = random(10, 100);
}
void loop()
 
{
analogWrite(ledPin, ledStatus[i]); 
Zufall = random(-150, 200); 
ledStatus[i] += Zufall; 
 if (ledStatus[i] > 200) 
 { 
 ledStatus[i] = 100; 
 }
 if (ledStatus[i] < 20) 
 {
 ledStatus[i] = 0;
 }
 delay(50); 
}

Im Deklarationteil muss sicherlich unsigned long für die Startzteit hinen.
nur dann weiter?
Dieser funktionierender Sketch soll/ kann an’s Ende der “großen” Programms.
vielen Dank schon jetzt für alle Tipps und Hilfen.

wbr. Flötzinger

hi,

ich bin zwar nicht sicher, was genau gemeint ist, aber:

falls es alle zb. fünf sekunden GENAU einmal laufen soll, am ende der routine momentane millis messen und dann in der loop schauen, wann diese fünf sekunden vergangen sind.

falls es innerhalb von zb. drei bis sieben sekunden GENAU einmal laufen soll, am ende der routine eine zufallszahl zwische 3 und 7 generieren lassen, momentane millis messen und dann in der loop schauen, wann diese zufälligen sekunden vergangen sind.

in beiden fällen natürlich in der setup die millis messen, damit Du dafür einen anfangswert hast.

gruß stefan

Meine Versuche über die If millis()....else etwas zu bewerkstelligen sind, wie immer, kläglich gescheitert.

Man hat BlinkWithoutDelay leider erst verstanden, wenn man es auch anders verwenden kann.

unsigned long lastRun;
unsigned int randomZeit;

void loop() {
  // die "normale" Verarbeitung
  
  if (millis() - lastRun > randomZeit ) {
      ProgrammTeil();
      lastRun = millis();
      randomZeit = random(3000,7000);
  } 
}

void ProgrammTeil() {
     Serial.print ( millis() );
     Serial.println (F("  Programmteil kommt alle 3 .. 7 sec einmal dran"));
}

moin, ewig und andauernd kommt einen die Arbeit in die Quere.
So das ich erst heute wieder ein wenig Zeit habe, eure Tips zu probieren.
gibt, je nach verfügbarer Zeit, dann auch eine Rückmeldung.

Danke schon mal vorab.

wbr. Flötzinger

Moin,
"Man hat BlinkWithoutDelay leider erst verstanden, wenn man es auch anders verwenden kann."
stimmt.
Vorschlag hat geklappt, also nach ein paar Versuchen.

Wirft aber glatt eine neue Frage auf:
Programmteile mit/ über Void Programmteilname einzufügen/ abzuarbeiten.
sollte ich darüber mal ein neues Thema beginnen, um meine Fragen und eure Antwortenfür die allgemeine Leserschaft bereit zustellen?

wbr. Flötzinger