Millis

Hey,

bin immer noch am rumspielen und üben/lernen mit Millis.

Hab hier mal eine kleine Funktion gebaut, die eine random Zahl rauswirft, und dann im Speed Takt aufzählt bis zur Random erzeugten Zahl, dann von vorne Startet.
Nur zum üben mal.

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

void loop() {
Button29(500);
}

void Button29(int Speed) {

 
  byte b = random(0, 11);
  Serial.println(b);

  for (byte i = 0; i < 1; i++) {
    for (byte bb = 0; bb <= b; bb++) {
      Serial.println(bb);
      delay(Speed);
    }
  }
}

Wollte da jetzt eigentlich Millis einbauen, statt dem Delay();

Hab das hier bisher rausgebracht.
Habe Millis eingebunden, da bin ich mir sicher dass das richtig ist.
Jetzt muss ich doch irgendwie die for mit dem Delay() öffnen und anderweitig darstellen.
Das gelingt leider nicht. Hatte bisher nur for Schleifen in denen das Delay in der ersten Schleife war, hier ist es ja in der zweiten drin. Jeder Versuch endete in chaos. :smiley:
Außerdem muss bestimmt vor das byte b = random(0, 11); eine abfrage, damit die nicht jeden Zyklus ein neues b bestimmt. Ist bestimmt wieder total einfach, aber ich sehs halt wieder mal nicht… :confused: :o

void Button29(int Speed) {

  unsigned long currentMillis = millis();
  static unsigned long previousMillis = 0;

  if ((currentMillis - previousMillis) >= Speed) {
    previousMillis = currentMillis;

    byte b = random(0, 11);
    Serial.println(b);

    for (byte i = 0; i < 1; i++) {
      for (byte bb = 0; bb <= b; bb++) {
        Serial.println(bb);
        delay(Speed);
      }
    }
  }

Gruss Franz

Hallo,

du musst die for Schleife durch if ... ersetzen.

Schreib einen Sketch der keine Zeit braucht. Und daher meistens gar nichts tun muss sondern nur merkt, dass er mal wieder viel zu früh dran ist um was neues zu machen.
Du ersetzt also delay() durch if (genug_gewartet) {machwas;worauf_warten_wir_jetzt;}.

Oder noch besser, du denkst erst gar nicht an delay(), dann brauchst du den Sketch auch nicht umzuschreiben, was gar nicht so einfach ist, weil das was du willst, ein ganz anderer Ansatz ist.

Hallo,

Du hast Dir ein Beispiel ausgesucht in dem man das nicht so einfach 1:1 ersetzen kann. Da gibt es einfachere Beispiele. Es wird aber wie immer mehre Möglichkeiten geben. Unten meine, ich hoffe das ist das was Du wolltest.

Zunächst mal hast Du es mit zwei Zuständen zu tun.

  1. neue Random Zahl erzeugen
    2 die Ausgabe in einen festen Zeittakt bis zu diese Zahl und anschliessend auf Status 1 setzen.

insofern ist eigendlich eine Ablaufsteuerung (State Maschine) ein geeigneter Ansatz. Da es aber hier nur um zwei Zustände geht, die sich einfach mit einer bool Variable abbilden lassen, hab ich darauf mal verzichtet, auch um es einfach zu halten.

millis() wird ja verwendet um nicht blokierend zu arbeiten, eine for () schleife blokiert ja auch, insbesondere wenn da auch noch ein delay() enthaten ist. Also für einen Controller denkbar ungeeignet. Es wir also immer die gesamte loop schleife abgearbeitet und mit if entschieden ob gerade etwas gemacht werden soll oder nicht.

Heinz

unsigned long altzeit;// letzte Zeit der Ausgabe
unsigned long Speed = 1000; // Ausgabe Takt
byte i; // Ausgabe 
byte zahl;// erzeugte Zufallszahl
bool neu= true; // status neu random Zahl bilden

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

void loop() {
  if (neu) { // neue Rando Zahl bilden
    zahl = random(0, 11);
    Serial.print("neue Zahl ");
    Serial.println(zahl);
    neu = false;
  }
// soll eine Ausgabe erfolgen 
  if ( millis() - altzeit >= Speed && !neu) {
    altzeit = millis(); // alte AusgabeZeit setzen
    Serial.println(i);  // Zahl ausgeben
    i++;                // erhöhen
    if (i > zahl){// Wenn ende erreicht
      neu = true; // Staus setzen 
      i=0;        // reset 
      
    }
    //delay(Speed); 

  }
}