In der unendlichen Schleife wird in jeder Runde der Inhalt einer Variablen mit dem Zeitgeber verglichen. Ist der Inhalt des Zeitgebers größer als der Inhalt der Variablen, wird die Variable neu gesetzt und eine Funktion für den Countdown aufgerufen.
Zuerst wird diese Zeitfunktion realisiert und zur Kontrolle nur die LED ein- und ausgeschaltet. Setzt man die Wartezeit z.B. auf 1000, blinkt die LED im Sekundentakt.

Zu Beginn des Programms wird der Bildschirm wieder komplett eingeschaltet. In der Funktion wird die linke obere LED nach der Wartezeit ausgeschaltet und die Spalte um 1 erhöht. Das darf natürlich nur erfolgen, wenn die Spalte kleiner als 5 ist.
Im nächsten Schritt wird der gesamte Bildschirm Zeile für Zeile gelöscht. Bei jedem Funktionsaufruf wird die Zeilennummer überprüft und die beiden Variablen für Zeile und Spalte geändert.
Gleichzeitig wird eine weiter Variable zaehler erhöht, um zu erkennen, wenn der Bildschirm komplett gelöscht ist. Das würde auch ohne zusätzliche Variable aus der Kombination von Zeile und Spalte gehen. Ist der Bildschirm gelöscht, wird die boolsche Variable countdown_an auf falsch gesetzt. Sie wird im Hauptprogram verwendet, um im Zusammenspiel mit der Zeitvariablen die Countdown-Funktion aufzurufen oder nicht.
Die LED wird beim Start des Programms auf Rot geschaltet und wird zum Ende des Bildschirmlöschens auf Grün gesetzt. Damit kann man kontrollieren, ob alles ordentlich funktioniert.
Beim CountDown mit den Wartebefehlen lässt sich während der Wartezeiten der Calliope mini nicht bedienen, er reagiert z.B. nicht auf den Druck einer Taste. Damit sind Wartebefehle für die Programmierung von Spielen ungeeignet. Durch den Einsatz des Zeitgebers können mit den beiden Tasten Aktionen durchgeführt werden.
In Make Code lässt sich das Warten einfacher vermeiden als im OpenRobertaLap. Es gibt eine Funktion, die im Hintergrund nach einer eingestellten Zeit den Code ausführt.

In der Funktion, die alle 0,5 s aufgerufen wird, werden die Zeile und die Spalte so geändert, dass LED für LED nacheinander ausgeschaltet werden.
Bisher wird noch nicht überprüft, ob die Zeilenvariable einen größeren Wert als 4 erreicht. Nachdem alle LED gelöscht sind, dürfen die Variablen ja nicht weiter erhöht werden. Das würde zwar den CountDown nicht stören, aber die Variablen laufen unkontrolliert weiter hoch. Deshalb wird der Code zum Zählen nur dann ausgeführt, wenn die Zeilenvariable kleiner als 5 ist.
Auch wenn das Vermeiden von Wartezeiten in Make Code sehr einfach zu realisieren ist, hat es doch einen Makel: Die Zeit zwischen zwei Ereignissen lässt sich nicht verändern. Gibt man als Zeit zwischen zwei Aufrufen 500 ms ein, bliebt diese Zeit unveränderlich erhalten. Der gezeigte Programmteil ändert bei jedem Aufruf die Wartezeit um 100. Das funktioniert aber nicht, der Aufruf erfolgt stur alle 200 ms.
In der unendlichen Schleife wird in jeder Runde der Inhalt einer Variablen mit dem Zeitgeber verglichen. Ist der Inhalt des Zeitgebers größer als der Inhalt der Variablen, wird die Variable neu gesetzt und eine Funktion für den Countdown aufgerufen.
Es ist jetzt möglich, die Wartezeit bei jedem Schritt kleiner zu machen, was beim Ablaufen des Programmes deutlich zu erkenn ist.
Die Funktion schritt prüft zuerst, ob überhaupt noch LED eingeschaltet sind. Dazu wird die Variable zaehler verwendet, die bei jedem Schritt um eins erhöht wird. Hat sie den Wert 25 erreicht, wird der Programmteil zum Ausschalten der LEDs nicht mehr durchgeführt.
Wenn jetzt alles richtig funktioniert, wird jede Zeile schneller als die Zeile darüber gelöscht.
Der Bildschirm besteht aus 25 LED, die man von 0 bis 24 durchnummerieren kann. Damit ist zum Ansprechen jeder einzelnen LED nur eine Schleife notwendig, die von 0 bis 24 durchläuft.
Man kann nun aus dem Schleifenzähler i die Spalten- und Zeilennummer jeder einzelnen LED berechnen:
Über das time-Modul kann man die Zeit auslesen, die seit dem Start des Programms vergangen ist (time.ticks_ms()). Damit lässt sich ein einfaches Blinklicht programmieren, dass im 0,5s-Takt die Farbe wechselt.Das soll der Ausgangspunt für das weitere Programm sein.
from calliopemini import *
import time #Zeitmodul importieren
import neopixel
np = neopixel.NeoPixel(pin_RGB, 3)
dauer=500 #Blickdauer
takt=True #True: ein Zustand, False: der andere Zustand
zeit=time.ticks_ms() #Startzeit merken
while True:
if (time.ticks_ms()-zeit)>dauer: #wenn aktuelle Zeit-Startzeit > Dauer
zeit=time.ticks_ms() #neue Startzet ist die aktuelle Zeit
if takt: #wenn takt=True
np[1]=(0,50,0)
else:
np[1]=(50,0,0)
np.show()
takt=not(takt) #takt wird negiert, aus True wird False und umgekehrt
Im nächsten Schritt wird vor der unendlichen Schleife der Bildschirm eingeschaltet und die x- und y-Werte gesetzt. Es soll wieder die mittlere LED-Reihe ausgeschaltet werden.
Im takt-Teil wird nun bei jedem Takt eine LED in der mittleren Reihe ausgeschaltet. Dazu wird der y-Wert von 0 bis zur 4 um eins nach oben gezählt. Um Fehler zu vermeiden, muss darauf geachtet werden, dass x nicht größer als 4 wird!
Wenn die mittlere Reihe im Takt gelöscht wird und es kommt KEINE Fehlermeldung, kann man sich an den gesamten Bildschirm wagen. Zu Beginn wird vor der unendlichen Schleife der y-Wert auf 0 gesetzt. Diese kleine Änderung bewirkt, dass die obere Reihe gelöscht wird. Dann muss das Programm so ergänzt werden, dass an jedem Ende der Reihe der y-Wert um eins erhöht wird. Der x-Wert muss natürlich weiterhin auf 0 gesetzt werden.
Achtung: Man muss wieder darauf achten, dass der y-Wert nicht größer als 4 wird. Ansonsten gibt es wieder eine Fehlermeldung, da eine Reihe mit dem y-Wert 5 nicht existiert.
Es wird für den Takt und das Ausschalten der einzelnen LEDs ununterbrochen der Zeitgeber abgefragt. Damit es nicht so einfach möglich, den CountDown über die Taste A zu starten. Wenn aber mit der Taste A die beiden Variablen x und y wieder auf 0 gesetzt und der Bildschirm eingeschaltet werden, beginnt der CountDown schön von vorn. Mehr ist nicht zu machen.
Wenn man während des CountDown die Taste A drückt, beginnt er von vorn. Falls das stört, kann man ja z.B. vor dem Rücksetzen von x und y prüfen, ob beide den Wert 4 haben. Dann sind nämlch alle LEDs ausgeschaltet.

Wenn man jetzt die rechte LED mit der Taste B in blau ein- oder ausschalten möchte, geht das auch dann, wenn der CountDown läuft.
Der Bildschirm besteht aus 25 LED, die man von 0 bis 24 durchnummerieren kann. Damit ist zum Ansprechen jeder einzelnen LED nur eine Variable z notwendig, die von 0 bis 24 durchläuft. Aus dieser Variablen z lassen sich die x- und y-Werte berechnen.
Man kann nun aus dem Schleifenzähler i die Spalten- und Zeilennummer jeder einzelnen LED berechnen: