Dadurch, dass die LED immer umgeschaltet wird, könnte es zu einer Verschiebung kommen, falls durch andere Vorgänge im Hintergrund mal mehr als eine halbe Periode übergangen wird. Natürlich ist die LED nur ein Beispiel für eine Anwendung, aber um etwas blinken zu lassen, ist es einfacher, mit dem Modulo Operator zu arbeiten: if(millis() % periodendauer > halbePeriodendauer) {} else {}. Um die Modulo Operation zu vermeiden, kann man auch eine Bitweise Operation verwenden. Das begrenzt natürlich die realisierbaren Frequenzen auf Zweierpotenzen, jedoch beschleunigt es den Code enorm: if(millis() & (1
Unsigned long Rechenoperationen sind schon recht "Arbeitsintensiv" für den Prozessor. Mit jedem Vergleich wird in diesem Beispiel zusätzlich eine -Subtraktion durchgeführt. Wenn ich einmal den Vergleichswert ausrechnen lasse, dann nur noch vergleichen lasse (in der if-Abrage), ist dann die Belastung des Prozessors nicht geringer? Bei sehr rechenintensiven Aufgaben könnte das eine Rolle spielen, denke ich.
Integer Operationen (plus minus ==) sind NICHT arbeitsintensiv, auch nicht bei "Long". Multiplikation und besonders Division dagegen schon mehr. Solange du nicht mit Zeiten im einstelligen Mikrosekunden Bereich zu tun hast, spielt das keine Rolle. Wenn du wie vorgeschlagen die Differenz nur einmalig ausrechnen lässt, funktioniert die Wartefunktion nicht, da du ja du dann ja nicht mehr die vergangenen Millisekunden mitbekommst.
Wie kann man mit der Methode eine LED in unterschiedlichen Längen blinken lassen. Z.B eine Sekunde an zwei Sekunden aus 3 Sekunden an und eine Sekunde aus?
Die Antwort von mir, kommt ein wenig spät, aber vielleicht ist sie ja trotzdem zumindest noch interessant. Also, um unterschiedliche Wartezeiten zu realisieren, kann man z.B. die Variable "Intervall" durch ein Array austauschen und über einen weiteren Zähler die jeweils gewünschte Wartezeit einstellen. D.h. in der if Abfrage würdest du abhängig vom aktuellen Zustand nach dem Umschalten auf die jeweils gewünschte nächste Wartezeit umstellen. Stelle dir Beispielsweise eine Ampel vor, in der du 3 verschiedene LEDs schaltest (Rot, Gelb, Grün, Rot + Gelb). Du hast in dem Fall 4 Takte (siehe Klammer). Dann kannst du ein Array "Wartezeit" anlegen in dem du die Wartezeit pro Takt einträgst und in der Variablen "Takt" zählst du die Takte hoch (von 0 bis 3). Bei jedem Umschaltvorgang erhöhst du "Takt" um eins und wenn Takt == 4 ist, setzt du Takt auf 0 zurück. Abhängig von "Takt" schaltest du die entsprechende LED ein, bzw. in Takt 3 schaltest du die LEDs Rot und Gelb ein.
@@jonathankremer9229 Ich hab lange probiert. Habe jetzt so um die acht Sensoren und die laufen mit millis. Meine Lösung ist: "über Setup" kommt long timer = 0; und unsigned long myTime; in void loop() { kommt: if(millis() - timer > 1000){ Hier kannst Du die 1000 ändern. Das sind die Millisekunden. Ganz am ende des Code kommt das hier: //Millis Timer Serial.print("Time: "); myTime = millis(); Serial.println(myTime); Serial.println("");
timer = millis();
delay(1000); } } So kannst Du auch sehen ob der Timer von Arduino Start weiter läuft oder neu startet nach loop.
Ich nehme einfach mal an, dass _statusLED_ gemeint ist. Dadurch wird erreicht, dass immer der gegenteilige Zustand an der LED ausgegeben wird: statusLED = true → ausschalten; statusLED = false → einschalten. Dadurch wird einfach ermöglicht, dass die LED blinkt. Mit der Nutzung der millis()-Funktion hat das übrigens nichts zu tun.
ich arbeite mit dem arduino uno; statusLed muss initialisiert werden; boolean statusLed=0;"unsigned long int" kennt mein arduino nicht; "unsigned long" kennt mein arduino. nach diesen Veränderungen funktioniert dieses Programm, danke
sehr gut erklärt!!! Danke für die Visualisierung
Sehr gut erklärt, thx. Baue das direkt in meinen automatischen fensteröffner ein 🙂
Sehr gut erklärt, Danke
Perfekt erklärt!
Nice ! Vielen Dank!
Dadurch, dass die LED immer umgeschaltet wird, könnte es zu einer Verschiebung kommen, falls durch andere Vorgänge im Hintergrund mal mehr als eine halbe Periode übergangen wird. Natürlich ist die LED nur ein Beispiel für eine Anwendung, aber um etwas blinken zu lassen, ist es einfacher, mit dem Modulo Operator zu arbeiten: if(millis() % periodendauer > halbePeriodendauer) {} else {}.
Um die Modulo Operation zu vermeiden, kann man auch eine Bitweise Operation verwenden. Das begrenzt natürlich die realisierbaren Frequenzen auf Zweierpotenzen, jedoch beschleunigt es den Code enorm: if(millis() & (1
Super erklärt.
sehr gut! danke!
Unsigned long Rechenoperationen sind schon recht "Arbeitsintensiv" für den Prozessor. Mit jedem Vergleich wird in diesem Beispiel zusätzlich eine -Subtraktion durchgeführt. Wenn ich einmal den Vergleichswert ausrechnen lasse, dann nur noch vergleichen lasse (in der if-Abrage), ist dann die Belastung des Prozessors nicht geringer? Bei sehr rechenintensiven Aufgaben könnte das eine Rolle spielen, denke ich.
Integer Operationen (plus minus ==) sind NICHT arbeitsintensiv, auch nicht bei "Long". Multiplikation und besonders Division dagegen schon mehr.
Solange du nicht mit Zeiten im einstelligen Mikrosekunden Bereich zu tun hast, spielt das keine Rolle.
Wenn du wie vorgeschlagen die Differenz nur einmalig ausrechnen lässt, funktioniert die Wartefunktion nicht, da du ja du dann ja nicht mehr die vergangenen Millisekunden mitbekommst.
Wie kann man mit der Methode eine LED in unterschiedlichen Längen blinken lassen. Z.B eine Sekunde an zwei Sekunden aus 3 Sekunden an und eine Sekunde aus?
Die Antwort von mir, kommt ein wenig spät, aber vielleicht ist sie ja trotzdem zumindest noch interessant.
Also, um unterschiedliche Wartezeiten zu realisieren, kann man z.B. die Variable "Intervall" durch ein Array austauschen und über einen weiteren Zähler die jeweils gewünschte Wartezeit einstellen. D.h. in der if Abfrage würdest du abhängig vom aktuellen Zustand nach dem Umschalten auf die jeweils gewünschte nächste Wartezeit umstellen.
Stelle dir Beispielsweise eine Ampel vor, in der du 3 verschiedene LEDs schaltest (Rot, Gelb, Grün, Rot + Gelb). Du hast in dem Fall 4 Takte (siehe Klammer).
Dann kannst du ein Array "Wartezeit" anlegen in dem du die Wartezeit pro Takt einträgst und in der Variablen "Takt" zählst du die Takte hoch (von 0 bis 3). Bei jedem Umschaltvorgang erhöhst du "Takt" um eins und wenn Takt == 4 ist, setzt du Takt auf 0 zurück. Abhängig von "Takt" schaltest du die entsprechende LED ein, bzw. in Takt 3 schaltest du die LEDs Rot und Gelb ein.
Ein Video mit zwei Sensoren und millis wäre super.
Das wäre für mich auch hilfreich. Ich habe 6 Sensoren Pumpe und Displays die versorgt werden müssen. Ich hoffe das ich mit millis machbar.
@@jonathankremer9229 Ich hab lange probiert. Habe jetzt so um die acht Sensoren und die laufen mit millis. Meine Lösung ist: "über Setup" kommt
long timer = 0;
und
unsigned long myTime;
in void loop() { kommt:
if(millis() - timer > 1000){
Hier kannst Du die 1000 ändern. Das sind die Millisekunden. Ganz am ende des Code kommt das hier:
//Millis Timer
Serial.print("Time: ");
myTime = millis();
Serial.println(myTime);
Serial.println("");
timer = millis();
delay(1000);
}
}
So kannst Du auch sehen ob der Timer von Arduino Start weiter läuft oder neu startet nach loop.
Danke Gert was mir nicht ganz klar ist warum negierst du denn wert von 1 auf 0 ?
Ich nehme einfach mal an, dass _statusLED_ gemeint ist.
Dadurch wird erreicht, dass immer der gegenteilige Zustand an der LED ausgegeben wird:
statusLED = true → ausschalten;
statusLED = false → einschalten.
Dadurch wird einfach ermöglicht, dass die LED blinkt.
Mit der Nutzung der millis()-Funktion hat das übrigens nichts zu tun.
ich arbeite mit dem arduino uno; statusLed muss initialisiert werden; boolean statusLed=0;"unsigned long int" kennt mein arduino nicht; "unsigned long" kennt mein arduino. nach diesen Veränderungen funktioniert dieses Programm, danke
gut erklärt ...
Aber geh nächstes mal dichter an dein Mikrophone.
Das Video war sehr leise.
Mfg.
schlecht erklärt !!!