kk logo

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

0 ardublock tutorial zeiten zaehler ohne delay warte 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. 

arduino at most all tuorial

 

Braucht man verschiedene Zeiten wäre es auch möglich den Block öfters einzufügen und eine andere Variable zählen zu lassen. 

ardublock arduino at most all tuorial

 

Der alte "only every" Block. 

1 only every arduino zaheler zeiten ardublock

 

 

 

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. 

5 millis ardublock tutorial ueberlauf variable

 

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.

4 ardublock millis tutorial arduino

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. 

6 millis ardublock ueberlauf verhindern

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.

 

9 ardublock delta time als zaehler

 

Hier drei Möglichkeiten mit dem DeltaT Block zu programmmieren.

  1. links --> mit dem Taster D2 beginnt die Zeit im DeltaT zu zählen
  2. 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
  3. rechts --> mit dem Taster D2 wird die im DeltaT gespeicherte Zeit auf 0 gesetzt

 

10 ardublock deltaT time arduino

 

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.

11 ardublock deltaT taster entprellen zeit messenJPG

 

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. 

12 deltaT arduino progamm bespiel projekte

 

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.

8 ardublock ohne delay block  

 

 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. 

ardublock blink without delay mills


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. .

ardublock variable in millis speichern

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.

ardublock ohne delay blink without

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.

hello world led blink ohne delay

King of my heart

Let the King of my heart
Be the mountain where I run
The fountain I drink from
Oh, He is my song

Ronnie

schwäbischer tüftler und bastler, kraftsportler, ADHS power, 43 Jahre, 1 Frau, 5 Kinder und 1003 Ideen. 

ronnie berzins at mee