INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 1 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
millis (); nacheinander...
24.01.2021, 19:59
Beitrag #9
RE: millis (); nacheinander...
Die for-Schleifen gehören da nicht hin. Jedesmal, wenn die Zeit abläuft musst Du den Zähler um 1 erhöhen.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.01.2021, 20:33
Beitrag #10
RE: millis (); nacheinander...
(24.01.2021 13:54)nbk83 schrieb:  geh mal gedanklich davon weg, dass nach 5 Sekunden, nach 10 Sekunden, nach 15 Sekunden...
sondern alle 5 Sekunden soll Deine Anzeige wechseln.
...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.01.2021, 21:52
Beitrag #11
RE: millis (); nacheinander...
(24.01.2021 19:59)MicroBahner schrieb:  Die for-Schleifen gehören da nicht hin.

Ich rate jetzt: Wink Es gibt sie schon, nur nicht da !?

Zitat:Jedesmal, wenn die Zeit abläuft musst Du den Zähler um 1 erhöhen.

In Verbindung mit @Jan`s erneuter Wiederholung glaube ich zu ahnen wo ihr mich hinführen wollt:
Es gibt (wie auch immer) nur ein millis() das immer wieder bis fünf Sekunden hoch zählt. Beim erreichen der 5. Sekunde wird der Zähler um 1 erhöht. Erneuter millis() Durchlauf -> wieder um 1 erhöht und noch einmal bis ich beim Zählerstand "3" angekommen bin. Dann wird der Zähler auf "0" gesetzt und alles beginnt von vorn.
Gleichzeitig wird der Zählerstand abgefragt. Bei 1 erfolgt der erste Funktionsaufruf, bei 2 der zweite usw.

Soweit habe ich das verstanden, nur kriege ich das programmiertechnisch nicht umgesetzt. Meine einfacher "Versuchsaufbau" dazu mit dem seriellen Monitor druckt den Zaehler 1/2/3 immer gleichzeit auf den Monitor und nicht im Abstand von 5 Sekunden.

Was weiß ich noch nicht? ;-)

Danke erst mal,

Code:
unsigned long Timer = 0;
int zaehler;

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

void loop() {
    
    if (millis() > 5000 + Timer ) {
    Timer = millis();

    for (int zaehler =0 ; zaehler < 4; zaehler++){
    
    if (zaehler = 1){
    Serial.print("Zaehler ist =  ");      
    Serial.println(zaehler);
    }
    
    if (zaehler = 2){
    Serial.print("Zaehler ist =  ");      
    Serial.println(zaehler);
    }
    
    if (zaehler = 3){
    Serial.print("Zaehler ist =  ");      
    Serial.println(zaehler);  
    }
    }
    }
}

bis dann,
Steinspiel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.01.2021, 22:05
Beitrag #12
RE: millis (); nacheinander...
(24.01.2021 21:52)Steinspiel schrieb:  Ich rate jetzt: Wink Es gibt sie schon, nur nicht da !?
Nein, die for-Schleifen gehören ganz weg. Die bringen nur alles durcheinander.

(24.01.2021 21:52)Steinspiel schrieb:  Es gibt (wie auch immer) nur ein millis() das immer wieder bis fünf Sekunden hoch zählt. Beim erreichen der 5. Sekunde wird der Zähler um 1 erhöht. Erneuter millis() Durchlauf -> wieder um 1 erhöht und noch einmal bis ich beim Zählerstand "3" angekommen bin. Dann wird der Zähler auf "0" gesetzt und alles beginnt von vorn.
Das ist der richtige Ansatz. In der millis-Abfrage musst Du hochzählen. Die for-Schleifen stören nur.

(24.01.2021 21:52)Steinspiel schrieb:  Meine einfacher "Versuchsaufbau" dazu mit dem seriellen Monitor druckt den Zaehler 1/2/3 immer gleichzeit auf den Monitor und nicht im Abstand von 5 Sekunden.
Das liegt an den for-Schleifen, die weg müssen. Die zählen ohne Zeitverzögerungen hoch.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.01.2021, 22:17
Beitrag #13
RE: millis (); nacheinander...
Und ändere bitte in den if-Abfragen die '=' in '==' (Stichwort: Vergleichsoperator in der Arduino-Referenz), sonst suchst Du Dir nachher einen Wolf bei merkwürdigem Verhalten.
Aber Du bist schon dicht dran Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2021, 20:06
Beitrag #14
RE: millis (); nacheinander...
Hiho, bin neu da und dein thread war das erste wa sich gestern gefunden habe - eigentlich war ich auf der suche nach einer Lösung für mein Problem. Nun musste ich aber anscheinend 2 Tage warten bis ich Antworten darf...

naja wie dem auch sei mit millis() habe ich mich bereist viel gespielt daher dachte ich ich kann dir - als auch noch lernender - helfen.


In deinem ersten Sketch führt du alle 5 Sekunden eine Prozedur durch.

Da du immer genau 5 Sekunden Abstände zwischen den 3 unterschiedlichen Prozeduren gewählt hast tritt immer nur der erste auf weil er vor den anderen liegt.

5,10,15...

nach 5 sekunden wird der erste aufgerufen nach weiteren 5 sekunden sind 10 sekunden erreicht und du hättest gern, dass Prozedur 2 aufgerufen wird. nur nach 5 Sekunden sind nicht nur 10 sekunden vergangen sondern erneut 5 Sekunden

Also es wird immer bei 5 Sekunden triggern.

Weiters ist auch relevant wie lange eine der Prozeduren anzeigt - das musst du mit einberechnen.


Eine schnelle Lösung wäre andere Zeiten zu wählen.

z.B.: 5s, 7s, 9s
allerdings würde dann erneut bei sekunde 10 der erste auslösen.

Die Herangehensweise aus deinem Sketch ist - so sehe das zumindest ich - gut wenn man Hintergundprozesse zu bestimmten Zeiten aufrufen will wenn es nicht darum geht wie lange in welchen abständen etwas dem User angezeigt wird.



Besser wäre eventuell etwas mit einem Int-Zähler. Wie es eh schon erwähnt wurde.


Du kannst natürlich auch mit schleifen arbeiten dass die schleife solange aktiv bleib bis die zeit erreicht ist damit lässt sich auch viel machen. Bei folgendem bleibt auch jede anzeige 5 Sekunden (wenn ich mich nicht verschaut habe)
Code:
    do {
        if (millis() - zeitstempel >= 5000)
        {
                        ToSomethingOne();
            zeitstempel = millis();
            break;
        }
    } while (millis() - zeitstempel < 5100);

    do {
        if (millis() - zeitstempel >= 5000)
        {
                        ToSomethingTwo();
            zeitstempel = millis();
            break;
        }
    } while (millis() - zeitstempel < 5100);

    do {
        if (millis() - zeitstempel >= 5000)
        {
                        ToSomethingThree();
            zeitstempel = millis();
            break;
        }
    } while (millis() - zeitstempel < 5100);


Oder mit einer "check" Variable

Code:
setup()
{
bool done_check[3] = { false, false, true};
}

loop()
{
        if (millis() - zeitstempel >= 5000 && !done_check[0] && done_check[2])
        {
                        ToSomethingOne();
            zeitstempel = millis();
            done_check[2] = false;
            done_check[0] = true;
        }
        if (millis() - zeitstempel >= 5000 && !done_check[1] && done_check[0])
        {
                        ToSomethingTwo();
            zeitstempel = millis();
            done_check[0] = false;
            done_check[1] = true;
        }
        if (millis() - zeitstempel >= 5000 && !done_check[2] && done_check[1])
        {
                        ToSomethingThree();
            zeitstempel = millis();
            done_check[1] = false;
            done_check[2] = true;
        }
}


sodala ich hoffe mein code funktioniert auch hahaha Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2021, 20:35
Beitrag #15
RE: millis (); nacheinander...
Zu Deiner do... Variante: Du hast schon eine Schleife: loop. mehr brauchst Du nicht.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.01.2021, 20:47
Beitrag #16
RE: millis (); nacheinander...
Moin,

(24.01.2021 22:05)MicroBahner schrieb:  [...]
Das liegt an den for-Schleifen, die weg müssen. Die zählen ohne Zeitverzögerungen hoch.

Wie Du unten siehst, sind sie das jetzt auch... Ich habe es verstanden und eigentlich ist das voll logisch was ich da mit eurer Anleitung gemacht habe. Smile

Danke für Deine Hilfe, ach ja, die Displayanzeige mit meinen Umweltwerten wechselt seit geraumer Zeit vor sich in, so wie ich es wollte! Wink

bis dann,
Steinspiel
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Smile Frage zu Millis im Loop - ESP32 Stargazer 5 1.064 27.12.2020 06:41
Letzter Beitrag: N1d45
  Ticker.h und millis() miq19 6 713 15.12.2020 12:26
Letzter Beitrag: miq19
  millis vs delay rev.antun 15 2.823 04.05.2020 23:47
Letzter Beitrag: rev.antun
  Kriege keinen Intervall mit millis() hin, gutschy 12 3.812 16.09.2019 15:30
Letzter Beitrag: Fips

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste