Calliope mini - Spaß durch Programmieren

Entwicklungsumgebungen

CountDown ohne Warten

Ziel: Der CountDown läuft ohne einen Wartebefehl ab. Dazu wird der Zeitgeber verwendet.

Takt ohne Warten

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.

Eine Zeile löschen

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.

Calliope mini

Bildschirm löschen

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.

Calliope mini

Was bringt das nun?

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.

Calliope mini

Takt ohne Warten, eine Zeile löschen

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.

Bildschirm löschen

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.

Calliope mini

Überlauf vermeiden

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.

Calliope mini

Variable Wartezeiten

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.

Calliope mini

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.

Calliope mini

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.

Calliope mini

Es geht noch einfacher

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:

  • Die Spaltennummer erhält man, wenn der Zähler durch 5 geteilt wird und dann der Rest der ganzzahligen Division genutzt wird. Ist der Zähler z.B. 11, ergibt die Teilung durch 5 eine 2. Der Rest ist dann 1 und das ist genau die Spaltennummer der LED mit der Nummer 11.
  • Die Zeilennummer erhält man, wenn man den Zähler durch 5 teilt und das Ergebnis abrundet. Für die 11 ergibt das die Zeile 2, für die LED 17 entsprechend die 3.
Calliope mini-Bildschirm

Takt ohne Warten

Ü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
        

Die mittlere LED-Reihe ausschalten

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!

Calliope mini
Calliope mini

Alle LEDs ausschalten

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.

Start mit A

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.

Calliope mini

Taste B regiert immer

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.

Es geht noch einfacher

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:

  • Die Spaltennummer x erhält man, wenn der Rest der ganzzahligen Division von z durch 5 genutzt wird (Modulo-Funktion). Ist der Zähler z.B. 11, ergibt die Teilung durch 5 eine 2. Der Rest ist dann 1 und das ist genau die Spaltennummer der LED mit der Nummer 11.
  • Die Zeilennummer erhält man, wenn man den Zähler durch 5 teilt und das Ergebnis abrundet. Für die 11 ergibt das die Zeile 2, für die LED 17 entsprechend die 3.
Calliope mini-Bildschirm

zurück