Bei fast allen Programmen braucht es Zeiten und oder Zähler. Vor allem dann, wenn auf den delay „warte“ Block verzichtet werden soll. In fast allen Fällen ist es am besten wenn auf die Delay Schleife verzichtet wird, da während eines Delay „warte“ Blockes das Programm nichts machen kann, auser ((warten)) „interrupt“ Blöcke ausgenommen.
Auf dieser Seite möchte ich mehrere Möglichkeiten vorstellen die Ardublock (duinoedu Version) eigenen Timer, Zeiten und Zähler anzuwenden. Auf der Startseite zur grafischen Programmierung habe ich bereits den Block "solange (millis)" vorgestellt dieser ist aber ein Block den es nur in der „letsgoink“ Version gibt.
- only_every Block, ab Version 0.70.04 heißt der Block nun "at most all"
- millis Block
- deltaT Block
- delay millis Block
- solange (millis) Block
Ardublock at most all, früher only_every Block
Der "at most all" Block führt das Programm innerhalb des "Commands" Blockes nur alle Millisekunden aus, die bei "ms" eingetragen sind. Damit kann man auf alle Delay Zeiten leicht verzichten. Mann muss lediglich Zähler einbauen.
Im Beispiel unten zeit der Serial Monitor abwechselnd jede Sekunde die Meldung LED EIN und dann LED AUS an. Hier könnten natürlich auch digitale Ausgänge oder andere Blöcke eingefügt werden. Mit verschiedenen "teste" Blöcken kann man so ganz auf die Delay Blöcke verwenden. Lädt man das Programm auf den Arduino hoch und öffnet den Serial Monitor, dann sieht man beim Drücken auf den Taster (an PIN 3) dass dieser sofort abgefragt wird.
Braucht man verschiedene Zeiten wäre es auch möglich den Block öfters einzufügen und eine andere Variable zählen zu lassen.
Der alte "only every" Block.
Ardublock millis Block
Der „millis“ Block ist ein einfacher Zähler der nach dem einschalten einfach anfängt zu zählen. Um die Millis überhaupt anzuzeigen müssen sie in einer Variablen gespeichert werden. Wird hier "nur" eine integer Variable verwendet kann der Arduino nur bis 32000 zählen und beginnt dann automatisch rückwärts in negativen Zahlen zu zählen. Damit kommt man also nicht sehr weit.
Wird "millis" in Ardublock verwendet muss deshalb immer eine "unsigned-long" variable verwenden. Diese kann "millis" wesentlich weiter zählen. Genau genommen von 0 bis 4,294,967,295. Diese Variable wird also erst nach 49,71 Tagen überlaufen, so lange kann der Arduino diese Variable zählen und mit dieser Zahl arbeiten. Nach 49 Tagen allerdings funktioniert "millis" mit Ardublock aber nicht mehr, da es in Ardublock keine Möglichkeit gibt "millis" zurückzusetzen.
Hier eine kleine Hilfe, wer millis umrechnen möchte
- Jahre0,14
- Monate1,63
- Wochen7,1
- Tage49,71
- Stunden1.193,05
- Minuten (minute)71.582,79
- Sekunden (s)4.294.967,3
- Millisekunden (ms)4.294.967.295
- Mikrosekunden (µs)4,29×1012
- Nanosekunden (ns)4,29×1015
Wird die Varaible mit den "millis" durch 1000 geteilt, erhält man einen wunderbaren Sekundenzähler.
Ardublock DeltaT (time) Block
Der deltaT Block macht nichts anderes als Zeit zu messen, genauso wie der Millis Block, nur dass diese Zeit über den "reset DeltaT" Block, zurückgesetzt werden kann. Wie der Name schon sagt geht es um ein Delta, also eine Differenz zwischen etwas und das T, steht hier für Zeit. Wer nur kurze Zeiten messen möchte kann ein "integer" Variable verwenden. Zum Beispiel wenn Taster entprellt werden sollen oder Messimpulse gegeben werden. Wer dageben lange Zeiten messen möchte, der muss eine "unsigned-long" verwenden. Zum Bespiel wenn eine Spielzeit gestoppt werden soll oder ein eine Stoppuhr gebaut wird.
Hier drei Möglichkeiten mit dem DeltaT Block zu programmmieren.
- links --> mit dem Taster D2 beginnt die Zeit im DeltaT zu zählen
- mitte --> die Zeit, die der Taster D2 gedrückt wurde, wird gemessen, hier könnte auch ein "solange" Block verwendet werden, ist aber nur wichtig wenn nach dem Taster, gleich der Reset Block kommt
- rechts --> mit dem Taster D2 wird die im DeltaT gespeicherte Zeit auf 0 gesetzt
Hier eine Kombination aus den drei vorhergegangen Programmen. Mit dem Taster D2 beginnt das DeltaT die Zeit zu zählen, die seit dem Tasterdruck vergangen ist. Sind mindestens 1000ms vergangen seit der Taster gedrückt wurde, kann erst der Reset erfolgen. Der Taster ist also ohne ein Delay entprellt. Und zuletzte wird die Zeit zurückgesetzt wenn der Taster D2 noch einmal gedrückt wird.
Der DeltaT Block zählt auch während eines Delay Block die Zeit im Hintergrund weiter. Nur wenn eine Bedingung wie oben mit dem Taster vor dem DeltaT, steht dann wird nur gezählt wenn die Bedingung erfüllt ist.
Ardublock delay millis Block
Mit dem Delay millis Block kann man auch einen einfachen Zähler programmieren. Bei diesem Zähler wird das Programm zwar auch „angehalten“ aber für so kurze Zeit, das Taster usw. selbst bei kurzem Tasterdruck abgefragt werden können. Diese Art einen Zähler zu bauen braucht zwar rel . viele Ressourcen des Arduino, schränkt das Programm ein und der Zähler wird nie genau stimmen, da zwischen dem delay Block, das verarbeiten der anderen Blöcke auch Zeit braucht. Aber eine Möglichkeit um kurze Wartezeiten für blinkende LEDs oder ähnliches zu verwenden ist es dennoch.
Ardublock "solange (millis)" Block --> nur in der letsgoink Version
Besser ist es so weit wie möglich auf „warte Millisekunden“ Blöcke zu verzichten und stattdessen, den „solange (millis)“ Block zu verwenden. Das ist zwar etwas mehr Aufwand aber es lohnt sich. Das Programm das permanent ausgeführt wird befindet im „mache“ Block. Hier werden permanent die Ausgänge geschaltet oder die Eingänge abgefragt. Und alle 1000 Millisekunden, also jede Sekunde wiederholt sich einmal der Block Unterhalt des „warte Millisekunden“ Block. Hier können dann variablen gesetzt werden die die vergangen Zeit zählen. Diese Variablen mit der vergangenen Zeit können dann im „mache“ Block ausgelesen werden.
Alle zwei Sekunden wird die Variable Zeit um eine einen Zähler nach oben gezählt, somit ist die vergangen Zeit von "zwei Sekunde" in der Variablen "zeit" gespeichert. An der Geschwindigkeit mit der der "Serial Print" aktualisiert wird kann man sehen dass das Programm nicht durch einen „warte Millisekunden“ Block unterbrochen wird. Nach 20 Sekunden wird die Variable dann wieder auf 0 gesetzt und beginnt dann vor vorne zu zählen. Würde die Zeit von 2000 auf 1000 gesenkt würden, wäre ein Zähler eine Sekunde, bei 5000 hatte der Zähler einen Wert von 5 Sekunden usw. .
In diesem Beispiel gehen die LEDs an den PINs 2,3 und 4 nach je einer Sekunde an. In der vierten Sekunde gehen alle wieder aus, es wird dann noch sechs Sekunden gewartet und dann beginnt alles wieder von vorne. In diesem Beispiel setze ich in die „falls“ Bedingungen, einfach die Sekunden nach der die LEDs an und bzw. aus gehen sollen.
Durch den Einsatz von „solange (millis)“ und variablen kann ich fast alle „warte Millisekunden“ Blöcke aus dem „mache“ Block entfernen. Durch das verändern der „Zeit“ ändert sich der Abstand in dem das Programm einen „Durchlauf“ macht. Hier noch das "hello world" ohne Delay. Im "mache" Block können nun weitere Taster, Ausgänge oder Potis eingebaut werden ohne dass das Programm durch "delay" gestoppt wird.