[ Easy Elektro Start ] [ Seitenende ] [ zurück ]

 

 

 

Easy Elektro Start – Programmieren 1

 

 

Programmieren mit den „micro:bit“- und „Calliope mini“-Rechnern

 

> Der BBC micro:bit ist ein preiswerter Einplatinencomputer, der von der British Broadcasting Corporation im Juli 2015 vorgestellt wurde. Vorrangiges Ziel des Projekts ist die Verbesserung der Schulbildung im Bereich der Informationstechnik. Das Gerät ist als Einplatinencomputer auf der Basis eines ARM-Mikrocontrollers realisiert und kann mittels verschiedener webbasierter Entwicklungsumgebungen programmiert werden.

 

Der BBC micro:bit wurde ab 2014 von der BBC entwickelt und im Juli 2015 vorgestellt. Nachdem ursprünglich die Auslieferung im Oktober des gleichen Jahres beginnen sollte, ist das Gerät nach Verzögerungen seit März 2016 verfügbar. Seitdem wurden mit Unterstützung verschiedener Partner mehr als eine Million Geräte kostenlos an 11- bis 12-jährige Schüler in Großbritannien verteilt. Vergleichbare Initiativen gibt es außerdem in den Niederlanden und in Island.

Der Name des Geräts nimmt Bezug auf den Heimcomputer BBC Micro des britischen Computerunternehmens Acorn, der in den 1980er Jahren verfügbar war und von der BBC für Lehrzwecke unterstützt wurde. Die Verantwortung für die weitere Verbreitung und Unterstützung des BBC micro:bit, der über verschiedene Elektronikhändler auch für Privatpersonen erhältlich ist, wurde ab Oktober 2016 an eine gemeinnützige Stiftung mit dem Namen Micro:bit Educational Foundation übertragen.

Mit dem Calliope mini ist seit August 2017 über den Cornelsen Verlag ein vergleichbarer, deutlich teurerer Computer erhältlich, der in Deutschland entwickelt wurde. Dieser ist auf Grund abweichender Pinbelegung weitgehend Code-kompatibel zum BBC micro:bit, besitzt jedoch zusätzlich zu dessen Hardware-Ausstattung weitere Bauteile wie einen Lautsprecher, ein Mikrofon und eine RGB-Leuchtdiode.

Der Preis des BBC micro:bit für Privatanwender beträgt je nach Anbieter rund 11–13 £ beziehungsweise rund 16–30  (Stand August 2017). < (Quelle: Wikipedia)

 

 

(Zum Vergrößern bitte auf das Bild klicken!)

 

Der micro:bit“-Rechner der BBC verfügt über den gleichen Prozessor vom Typ „Cortex M0“ des Herstellers ARM Ltd. wie das deutsche Pendant „Calliope mini.

 

Allerdings hat der „Calliope mini“ einige Sensoren mehr als der „micro:bit“ und verfügt darüber hinaus über einen sogenannten MOS-FET-Transistor, sodass sich mit diesem auch Glühlampen und kleine Motoren an einer externen Spannungsquelle mit höherer Spannung und größerem Motorstrom betreiben lassen.

 

Mit beiden Einplatinencomputer lassen sich bunte „Block“-Programme programmieren, die sich in der jeweiligen Entwicklungs- und Programmierumgebung in die höheren JavaScript“- oder MicroPython“-Programmiersprachen umwandeln lassen, die dann wiederum auf beiden Hardware-Plattformen laufen und zueinander kompatibel sind.

 

>> Der Calliope mini ist ein Einplatinencomputer, der für Bildungszwecke entwickelt wurde und an deutschen Grundschulen eingesetzt wird. Ziel ist es, Schülern ab der dritten Klasse einen spielerischen Einstieg in das Programmieren und algorithmische Denken zu ermöglichen. Neben Schülern sollen auch Lehrkräfte und das Bildungssystem erreicht werden, damit langfristig mehr digitale Inhalte an Schulen vermittelt werden können. Die Programmierung des Mikrocontrollers ist über unterschiedliche, webbasierte Entwicklungsumgebungen möglich. (…)

Der Calliope mini wurde im Jahr 2015 parallel und auf Grundlage des BBC micro:bit entwickelt und mithilfe von Lehrkräften erweitert. Im Vergleich zu dem BBC micro:bit besitzt der Calliope mini zusätzliche Bauteile wie einen Lautsprecher, ein Mikrofon und eine RGB-Leuchtdiode, zwei Grove-Konnektoren, erweiterte In- und Output Optionen und eine für Kinder kurzschlussvermeidende Sternenform. Seit Sommer 2017 ist der Mikrocontroller käuflich zu erwerben.

Hinter der Weiterentwicklung steckt die Calliope gemeinnützige GmbH. Gesellschafter sind die Professorinnen Gesche Joost und Franka Futterlieb, der Psychologe Stephan Noller, der Designer Jørn Alraun, der IT-Berater Maxim Loick und der Wirtschaftswissenschaftler Klaus Jürgen Buß.

Der Name "Calliope mini" bezieht sich auf die griechische Muse Kalliope, eine Tochter des Zeus und Schutzgöttin der Wissenschaft, der Philosophie und der epischen Dichtung. Sie gilt unter Informatikern als die „Tabletmuse“, da sie früher häufig mit einer Schreibtafel dargestellt wurde. Informatiker bezeichnen sie als eine frühe Vorbotin digitaler Bildungsideale. << (Quelle: Wikipedia)

 

 

 

(Zum Vergrößern bitte auf das Bild klicken!)

 

Wir legen gleich los und steigen in die Programmierung des „micro:bit“- und „Calliope mini“ ein. Und zwar direkt in der online Entwicklungsumgebung im Browser [ weiterlesen ]

 

Wir greifen das „Block“-Programm „mini-programm_01_04.hex“ auf,

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_01.hex)

 

und erweitern dieses wie folgt:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope-prog_01_02.hex)

 

„Auf dem Zweiten sieht man besser!“ so lautet der Werbespruch beim Zweiten Deutschen Fernsehen (ZDF). In unserem Fall aber müsste es heißen „Auf den zweiten Blick sieht man besser! Und, die „Suppe wird nie so heiß gegessen, wie sie gekocht wurde!“ Was sagt uns das? Wenn man sich auf den ersten Blick das obenstehende Programm calliope-prog_01_02.hex“ anschaut, dann bekommt man schon Respekt vor dem Programmieren, weil sich die Funktionsweise des Programms eben nicht auf den ersten Blick erschließt.

 

„Aber alles hat ein Ende, nur die Wurst hat zwei!“ Zum Glück hat unser Programm aber nur ein Ende und auch nur einen Anfang. Und der heißt „beim Start“.

 

Wie wir ja bereits wissen, wird der Programmblock „beim Start gleich beim Starten des Programms aufgerufen, gestartet und abgearbeitet:

 

 

(Zum Vergrößern bitte auf das Bild klicken!)

 

Das obenstehende Programm begrüßt den Anwender mit „Blitz & Donner“, um uns dann noch mitzuteilen, dass sich mit dem Programm die drei Taster „A“, „B“ und „A&B“ bedienen lassen. Aber in Wirklichkeit gibt es auf dem „Calliope mini“ und auf dem „micro:bit“ nur die die beiden Taster „A“ und „B“, sodass der dritte Taster „A&B“ nur virtuell existiert und sich aus der Tastenfolge Taste „A“ drücken, festhalten und dann zusätzlich noch den Taster „B“ drücken, zusammensetzt! Macht zusammen Taster „A&B“!

 

Die umgekehrte Reihenfolge geht dabei natürlich auch: zuerst Taste „B“ drücken, festhalten und dann zusätzlich noch den Taster „A“ drücken, macht zusammen Taster „B&A“!

 

Und damit sind wir schon wieder bei der booleschen Algebra, d.h. dem Rechnen mit wahren und unwahren bzw. richtigen (= „true“) und falschen (= „false“) Werten:

 

UND“- Gatter = „

 

Das Sybol „ für das UND-Gatter ist nach unten geöffnet!

 

(0 UND 0)10 = (0  0)2 = 02 = 0 * 20 = 0 * 1 = 010      Taster „A“  „B“ nicht gedrückt = kein Taster „A&B“

 

(0 UND 1)10 = (0  1)2 = 02 = 0 * 20 = 0 * 1 = 010      Taster „A“ nicht gedrückt  Taster „B“ gedrückt = A&B

 

(1 UND 0)10 = (1  0)2 = 02 = 0 * 20 = 0 * 1 = 010      Taster „A“ gedrückt  „B“ nicht gedrückt = A&B

 

(1 UND 1)10 = (1  1)2 = 12 = 1 * 20 = 1 * 1 = 110      Taster „A“  „B“ gedrückt = Taster „A&B“

 

ODER“- Gatter = „

 

Das Sybol „ für das ODER-Gatter ist nach oben geöffnet!

 

(0 ODER 0)10 = (0  0)2 = 02 = 0 * 20 = 0 * 1 = 010      Taster „A“ nicht gedrückt      Taster „B“ nicht gedrückt!

 

(0 ODER 1)10 = (0  1)2 = 12 = 1 * 20 = 1 * 1 = 110      Taster „A“ nicht gedrückt      Taster „B“ gedrückt!

 

(1 ODER 0)10 = (1  0)2 = 12 = 1 * 20 = 1 * 1 = 110      Taster „A“ gedrückt      Taster „B“ nicht gedrückt!

 

(1 ODER 1)10 = (1  1)2 = 02 = 0 * 20 = 0 * 1 = 010      Taster „A“ gedrückt      Taster „B“ gedrückt!

 

Übrigens: Auf dem „Calliope mini“ oder dem „micro:bit“ lassen sich die beiden Taster „A“ und Taster „B“ niemals gleichzeitig drücken, auch wenn man sich noch so große Mühe gibt!

 

Der Grund dafür ist physikalischer bzw. elektrotechnischer Natur, weil sich nämlich der elektrische Strom mittels atomphysikalischer Stoßimpulse auf frei bewegliche Valenzelektronen fortpflanzt [siehe Animation von DemonDeLuxe (Dominique Toussaint) - Eigenes Werk, CC BY-SA 3.0, Wikipedia ].

 

Während sich also mit dem rechten Taster „B“ die Sekundenzahl der Variablen „time_sekunden“ von 4 Sekunden schrittweise um +1 erhöhen lässt, lässt sich die die Sekundenzahl mit dem linken Taster „A“ von 4 Sekunden schrittweise um -1 herabsetzen!

 

Dabei kann es natürlich vorkommen, dass die Sekundenzahl für die gestoppte Zeitdauer zwischen Blitz und Donner kleinere Werte als Null annimmt, d.h. negativ wird: time_sekunden < 0. Wie aber bereits gesagt, kann die Zeit physikalisch niemals rückwärts laufen. Demzufolge kann es zwischen Blitz und Donner auch keine negative Entfernungsangabe darüber geben, wie weit das Gewitter noch von unserem Standort aus entfernt ist!

 

Wenn wir also nicht wollen, dass der Anwender unser schönes Programm „Blitz & Donner“ als dilettantisch (= unfachmännisch, stümperhaft) programmiert abtut, dann sollten wir auf den Fall, dass die Sekunden und damit natürlich auch die Entfernung des Gewitters gegenüber dem eigenen Standort negativ werden, unbedingt reagieren und das Berechnen der Entfernung mit negativen Werten ausschließen:

 

 

(Zum Vergrößern bitte auf das Bild klicken!)

 

Wie man in der obenstehenden „Wenn … dann …“-Bedingung sieht, werden negative Sekundenwerte der Variablen „time_sekunden“ mit dem

 

·        Statement < wenn  time_sekunden  <  0  dann >

 

abgefangen und die weitere Berechnung mit dem

 

·        Statement < setze  rechne_boolean  auf  falsch  >

 

mittels des Parameters „falsch“ verhindert.

 

Wenn die Abfrage der Variablen „time_sekunden“ einen Wert < 0 ergibt, dann wird als Erstes die Lichtfarbe der RGB-LED auf Rot gesetzt und damit zugleich eingeschaltet, sodass diese hell leuchtet. Als Zweites wird der Bildschirminhalt gelöscht und die Laufschrift „Wert < 0 unzulässig!“ angezeigt. Nachdem die Laufschrift durchgelaufen ist, wird die RGB-LED wieder ausgeschaltet. Demzufolge leuchtet die RGB-LED nur so lange bis Laufschrift durchgelaufen ist!

 

Wie man im Programmteil dauerhaft (= Endlosschleife) sieht, wird dann als Nächstes die „Wenn … dann …“-Abfrage gestartet, ob der eingetastete Sekundenwert der Variablen „time_sekunden“ im Bereich [ 0,   , 3 ] liegt. Dies ist nämlich der Bereich im dem sich das Gewitter praktisch über dem Standort des Anwenders befindet bzw. von diesem nur noch s = v * t = 343,2 m/s * 3 s = 1 029,6 m entfernt ist!

 

Je nachdem wie schnell das Gewitter in Richtung des Standorts des Anwenders zieht, kann es dann nämlich schnell gefährlich werden. Deshalb wird die Warnmeldung „Achtung! Gefahr! Das Gewitter befindet sich direkt ueber dir! Sofort in Sicherheit begeben!“ als Laufschrift angezeigt, währenddessen die RGB-LED rot leuchtet, um dem Anwender zu signalisieren, dass es gefährlich wird:

 

 

(Zum Vergrößern bitte auf das Bild klicken!)

 

Damit der Anwender den Warnhinweis besser einschätzen kann, geht es nach der Laufschrift direkt zur Entfernungsberechnung (siehe roter Kasten):

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_02.hex)

 

Nach der Laufschriftanzeige über die berechnete Entfernung, wie weit das Gewitter noch vom Standort des Anwenders entfernt ist, wird die Endlosschleife im Programmblock dauerhaft verlassen und damit es keine weiteren Entfernungsanzeigen mehr gibt bzw. geben kann, wird die boolesche Variable rechne_boolean auf den booleschen Wert = „falsch gesetzt (siehe grüner Kasten).

 

Demzufolge muss die Entfernungsberechnung nebst Laufschriftanzeige ab sofort wieder mittels der Tastenfolge Taste „A&B“ neu gestartet werden, wenn der Anwender neue Sekundenwerte mittels

 

·        des linken Tasters „A“

(= Sekundenwert dekrementieren, d.h. t = t - 1) oder

 

·        des rechten Tasters „B“ (= Sekundenwert inkrementieren, d.h. t = t + 1)

 

eintastet und sich das Berechnungsergebnis anzeigen lassen will. -

 

So, nun wird es langsam Zeit, dass wir uns das „Block“-Programm calliope_prog_01_02.hex“ (siehe weiter oben) auch mal in die professionelle Python“-Programmiersprache übersetzen lassen. Und das geht in der online Programmier-Weboberfläche des „Calliope mini“ oder des micro:bit einfacher als man denkt. Zu diesem Zweck muss man nämlich oben in der Bedien- und Menüleiste einfach nur auf die Schaltfläche <Python> klicken und schon bekommt man den übersetzten „Python“-Sourcecode wie folgt angezeigt:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_02.py)

 

Da es sich bei dem „Calliope mini“ und dem „micro:bit“ um Einplatinencomputer mit nur einem Prozessor bzw. einem Prozessorkern handelt, sind diese natürlich nicht so leistungsfähig wie z.B. Windows-PCs mit Windows 10 und Mehrkernprozessoren von Intel oder AMD, kosten dafür aber nur einen Bruchteil eines Windows-PC.

 

Wegen des kleineren Arbeitsspeichers (RAM), der geringeren Taktfrequenz des Prozessors und damit der geringeren Leistungsfähigkeit arbeiten sowohl der „Calliope mini“ als auch der „micro:bit“ als Einplatinenrechner nur mit einem abgespeckten Python, dem sogenannten MicroPython, das den analogen und digitalen Regel- und Steuerungszwecken von Mikrocontrollern angepasst wurde.

 

Wie bereits gesagt wurde, sind die beiden Einplatinencomputer „calliope mini“ und „micro:bit“ wegen des gleichen ARM Cortex M0 Prozessors zueinander kompatibel. Des Weiteren verhält es sich so, dass beide Programmier-Entwicklungsumgebungen im Browser vom Microsoft entwickelt wurden. Und trotzdem sind die mit der „Block“-Programmierung erstellen Programme vom Typ „hex“, das ist der Dateierweiterungsname, nicht zueinander kompatibel.

 

Dazu muss man wissen, dass es sich z.B. bei dem Programm calliope_prog_01_02.hex“ um ein Quellkode-Programm wie z.B. dem „Block“-Programm vom „Calliope mini“ oder dem „micro:bit“ handelt, das mittels eines speziellen Compilers (= Übersetzungsprogramm in Maschinenkode) in den Maschinen-/Prozessorkode kompiliert, d.h. „übersetzt“ wurde. Demzufolge enthält die „hex“-Datei nur hexadezimalen Kode mit hexadezimalen Ziffern von [ 0,   , 9, …, A, B, C, D, E, F ]2 = [ 0,   , 9, 10, 11, 12, 13, 14, 15 ]10 .

 

Ferner verhält es sich so, dass das in Prozessorkode kompilierte Programm nur hexadezimalen Kode enthält, der nur von dem jeweiligen „Calliope mini“- oder „micro:bit“-Prozessor verstanden wird. Demzufolge lassen sich in das „hex“-Format kompilierte Programme zwischen dem „Calliope mini“ und „micro:bit“ nicht tauschen.

 

Aber trotzdem gibt es natürlich eine Möglichkeit, den Sourcekode, der auf einem „Calliope mini“ erstellt wurde auf einen „micro:bit“ zu übertragen und dort zu kompilieren! Dabei heißt das Zauberwort engl. „Copy & Paste“, d.h. Kopieren und Einfügen:

 

 

(Zum Vergrößern bitte auf das Bild klicken!)

 

Bei dem Copy & Paste von Sourcecode ist es natürlich wichtig und unumgänglich, dass sich beide Editoren vom „Calliope mini“ und „micro:bit“ im selben Programmiermodus befinden, d.h. mit der gleichen Programmiersprache wie z.B. Python arbeiten (siehe obenstehendes Bild)!

 

Die in der Entwicklungsumgebung von „Calliope mini“ und „micro:bit“ integrierten Editoren sind natürlich nicht so leistungsfähig und komfortabel wie z.B. spezielle Editoren für das Programmieren sogenannter Hochsprachen wie z.B. Java, C/C++ oder Python. Ein beliebter und allseits bekannter (Programmier-) Editor (6,2 Mio. Downloads beim Computerportal www.chip.de) ist der sogenannte Notepad++“-Editor, den man sich [ hier ] aus dem Internet kostenlos herunterladen kann:

 

 

(Zum Vergrößern bitte auf das Bild klicken!)

 

Wie man im obenstehenden Bild sieht, lässt sich der Sourcecode im „Notepad++“-Editor ähnlich einem Gummiband auseinanderziehen oder, wenn man auf das Quadrat mit dem „-“ klickt (siehe roter Kreis), zusammen stauchen, sodass nur die für das Programmieren relevanten Programmzeilen angezeigt werden, während die anderen ausgeblendet werden.

 

Selbstverständlich lässt sich das „Copy & Paste“ auch in Verbindung mit dem „Notepad++“-Editor nutzen und der mit der Maus markierte Sourcecode von einem Editor in den anderen übertragen und abspeichern:

 

 

(Zum Vergrößern bitte auf das Bild klicken!)

 

Weiter geht’s mit der „Block“-Programmierung. Da die Einplatinenrechner „Calliope mini“ und „micro:bit“, aber auch der „Arduino UNO“ in ihren Kommunikationsmöglichkeiten beschränkt sind, weil es bis jetzt kein echtes LCD-Display gibt, machen wir uns die serielle „RS-232“-Schnittstelle am seriellen Port „COM4“ (= Calliope mini) zu nutze, die nach außen über den USB-Anschluss mittels des

 

·        Statements < seriell Umleitung auf USB >

 

zugänglich gemacht wird.

 

Des Weiteren müssen wir die seriellen Schnittstelle dahingehend konfigurieren, dass wir die Übertragungsgeschwindigkeit mit 9600 Baud (= Zeichen, d.h. Ziffern, Symbole pro Sekunde) mittels des

 

·        Statements < seriell setze Baudrate auf 9600 >

 

festlegen.

 

Bisher wurde das „Blitz & Donner“-Programm so gut wie möglich kommunikativ, d.h. selbstredend programmiert, indem dieses dem Anwender mitteilt, welche Bedientasten, nämlich die Taster „A“, „B“ und „A+B“ nebst entsprechenden Funktionen, zur Verfügung stehen. Da das auch weiterhin so bleiben soll, müssen wir die selbstredenden Mitteilungen (= Laufschrift) auch über die serielle Schnittstelle nach außen kommunizieren:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_03.hex)

 

Die über die serielle Schnittstelle gesendeten Textstrings in Form von Textzeilen kann man sich auf dem „PuTTY“-Programm wie folgt anschauen:

 

 

(Zum Vergrößern bitte auf das Bild klicken!)

 

Selbstverständlich muss das „PuTTY“-Programm als Erstes gestartet und ausgeführt werden, damit es später die seriell übertragenen Textstrings in der „PuTTY“-Konsole anzeigen kann!

 

Werfen wir der Vollständigkeit halber noch einen Blick auf die Konfiguration bzw. das Profil „Calliope mini“ des „PuTTY“-Programms, das sich auch abspeichern lässt:

 

 

(Zum Vergrößern bitte auf das Bild klicken!)

 

Falls man nicht (mehr) weiß, über welchen seriellen „COM“-Port der „Calliope mini“ seriell Daten überträgt, so kann man das im „Geräte-Manager“ von Windows nachschlagen:

 

 

(Zum Vergrößern bitte auf das Bild klicken!)

 

Bei Windows 7, 8 und 10 lässt sich der „Geräte-Manager“ mittels der Tastenfolgen/Mausklicks auf <Start>, <Windows System>, <Systemsteuerung>, <Hardware und Sound> und <Geräte-Manager> erreichen (siehe obenstehendes Bild).

 

Das Programm calliope_prog_01_03.py“ im Webverzeichnis hat den Nachteil, dass die anzuzeigenden Textstrings bzw. Textzeilen jeweils doppelt programmiert werden müssen. Und zwar einmal für die Laufschrift auf dem „Calliope mini“ im 5x5 Matrix LED-Display und zweitens für die serielle Ausgabe über den USB-Anschluss auf z.B. die „PuTTY“-Konsole (siehe weiter oben).

 

Ergonomischer wäre es natürlich, wenn die anzuzeigenden Textstrings bzw. Textzeilen nicht jeweils doppelt programmiert werden müssten!

 

Um das doppelte Programmieren der anzuzeigenden Textstrings bzw. Textzeilen zu vermeiden, muss man diese nur in eine Schublade werfen. Und zwar in eine Schublade mit insgesamt vier Schubfächern  - ähnlich einem Besteckkasten in der Küchenschublade -  , da ja bis zu vier Textstrings systematisch geordnet abgelegt werden müssen.

 

Diesbezüglich handelt es sich bei dem Besteckkasten um einen besonderen, der über eine waagrechte Besteckzeile mit vier senkrechten Besteckspalten verfügt:

 

 

Tabellenzeile

 

Tabellenelement

Tabellenelement

Tabellenelement

Tabellenelement

 

Spalte 0

Spalte 1

Spalte 2

Spalte 3

 

Blitz & Donner!

Taste B =

+ Sekunden ein!

Taste A =

- Sekunden ein!

Taste A+B =

Entfernung anzeigen!

 

Wie man anhand der obenstehenden (Besteckkasten-) Tabelle sieht, werden die einzelnen Spalten-Elemente von Null an gezählt und zwar im Spalten-Bereich [ 0, …, 3 ]; das macht nach Adam Riese vier Spalten-Elemente! Das Durchnummerieren der Spaltenelemente nennt man indexieren  - nicht indizieren -  und die laufende Nummer nennt man Index.

 

Im Englischen nennt man eine Zeilen und Spalten orientierte Tabelle gleich Array (siehe auch Wikipedia). Dabei lässt sich das Array mit einem Schachbrett vergleichen. Auch beim Schachbrett gibt es Zeilen (= waagrecht) und Spalten (= senkrecht).

 

Bei der sogenannten Tabellenkalkulation , engl. „Spreadsheet“, d.h. gespreiztes (Rechen-) Blatt, werden auch Zeilen und Spalten verwendet!

 

Merkregel: Erst die Zeilen, dann die Spalten! Siehe Matrizenrechnung in der Höheren Mathematik)!

 

Beim nachfolgenden „Block“-Programm calliope_prog_01_04.hex“ wird das Array „text_array“ mit vier Textstrings initialisiert, d.h. mit Werten versehen:

 

·        Statement < setze text_array auf   Array von „Blitz & Donner!“- +   >

 

Das Ab- und Aufrufen einzelner Array-Elemente geschieht dann durch Bennennung des Array-Namens, gefolgt vom jeweiligen Index:

 

·        Statement < zeige Text   text_array   rufe Wert ab bei  0  >

 

Wie man im nachfolgenden Bild sieht, bietet das Array „text_array“ den Vorteil, dass man die Textstrings jetzt nur noch ein einziges Mal eintasten muss:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_04.hex)

 

Wie man im obenstehenden Screenshot sieht, werden die einzelnen Array-Elemente noch von Hand durchnummeriert bzw. indexiert.

 

Wie man im nachfolgenden Bild sieht, lässt sich der Index zum Array „text_array“ auch automatisch Schritt für Schritt durchführen. Dazu muss man dann eine sogenannte „for … next“-Schleife mit dem

 

·        Statement <  für  Index  von 0 bis  3  mache>

 

programmieren.

 

Wie man sieht, muss man dazu Anfangswert 0 und den Endwert 3 für den Index als Schleifenzähler setzen, damit dieser später den Bereich [ 0, …, 3 ] durchläuft:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_05.hex)

 

Das Heraufsetzen des „Index“-Schleifenzählers am Ende der „for … next“-Schleife geschieht automatisch ohne weiteres Zutun.

 

Demzufolge gibt es bei der „Block“-Programmierung einer „for … next“-Schleife keinen expliziten „next“-Befehl nebst Inkrementierung ( Index = Index + 1 oder Index += 1 ) des „Index“-Schleifenzählers wie bei anderen Programmiersprachen. Oder vielleicht doch?!

 

Höchste Zeit, dass wir uns jetzt mal den „Python“-Sourcekode anschauen, indem wir in der Entwicklungsumgebung vom „Calliope mini“ von „Blöcke“ auf „Python“ umschalten:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_05.py)

 

Wie man im obenstehenden Bild bei der „for … next“-Schleife sieht, wird der Schleifenzähler „Index“ abgefragt, ob sich dieser im Bereich, engl. „range“, von 0 bis 3 befindet: 0 <= Index < 4.

 

Dabei wird der Schleifenzähler „Index“ = 4 zwar erreicht, die „for … next“-Schleife aber vor dem Erreichen des Schleifenzählers „Index“ = 4 bereits verlassen:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_06.py)

 

Wenn man sich unsicher fühlt und befürchtet, das mit der

 

·        Abfragebedingung < in range = [ 0, …, 3 ] > bzw. < in range >= 0 oder < 4 >

 

doch noch nicht so richtig verstanden zu haben, der kann sich den Wert des Schleifenzählers „Index“ hilfsweise wie folgt innerhalb und außerhalb der „for … next“-Schleife anzeigen lassen (siehe oben):

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_06.py)

 

Interessant und beachtenswert ist noch, dass der Schleifenzähler „Index“ bei der „Block“-Programmierung nach dem Abarbeiten der „for … next“-Schleife wieder automatisch auf Index = 0 gesetzt wird:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_06.hex)

 

Werfen wir zum besseren Verständnis deshalb noch einen Blick auf die „Block“-Programmierung des „Block“-Programms calliope_prog_01_06.hex:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_06.hex)

 

Neben der „for … next“-Schleife gibt es noch eine weitere Schleife, nämlich die „do … while“-Schleife, die sich beim „Block“-Programmieren mit dem „Calliope mini“ auf Deutsch „während … mache …“ heißt.

 

Grammatikalisch besser müsste es heißen „tue, mache … solange …“ bis die

 

·        Bedingung Index <= text_array_elemente

 

erfüllt ist. Dabei handelt es sich bei der Variablen „text_array_elemente“ um eine Zählvariable, die die Anzahl der Array-Elemente enthält. Demzufolge muss die „während … mache …“-Schleife so oft durchlaufen werden, bis alle Elemente des Arrays „text_array“ abgearbeitet sind:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_07.hex)

 

Wie man im obenstehenden Bild anhand der grünen Kästen sieht, muss man sich bei der „während … mache …“-Schleife selbst um das Initialisieren des Schleifenzählers „Index“ kümmern:

 

·        Statement <  setze  Index  auf  0  >

 

Das gilt auch für das Inkrementieren (= Erhöhen um +1) des Schleifenzählers „Index“ am Ende der Schleife:

 

·        Statement <  ändere  Index  um  1  >

 

Wenn die Variable „text_array_elemente“, die ja die Anzahl der Array-Elemente speichert, im weiteren Verlauf der Programmierung nicht mehr benötigt wird, kann man sie auch weglassen und den

 

·        Parameter < Array-Länge  text_array   >

 

direkt in die Abfragebedingung der „während … mache …“-Schleife einsetzen (siehe grüner Kasten):

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_08.hex)

 

So, nun kennen wir die beiden Schleifenarten der „for“- und der „while“-Schleife, sodass sich die Frage aufdrängt, welche von den beiden die bessere ist bzw. sein könnte.

 

Wenn es schnell gehen und unkompliziert sein soll, dann wäre der „for“-Schleife mit dem Parameter „in range“ (in Python) bzw. der „für“-Schleife mit dem Parameter „von … bis “ (in Blocks) der Vorzug zu geben.

 

Wenn es darum geht, dass man in das Schleifengeschehen eingreift, z.B. indem man den Schleifenzähler Sprünge machen lässt oder einzelne Schleifendurchläufe überspringt, wiederholt oder den Schleifenzähler während des Betriebs mittendrin auf einen höheren Zählwert setzt, diesen also manipuliert, dann wird man der „while“-Schleife (in Python) bzw. der „während … mache“-Schleife (in Blocks) den Vorzug geben (siehe grüne Kästen):

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_08.py)

 

Wir vervollständigen das obenstehende „Blitz & Donner“-Programm, indem wir die beiden rot markierten Programmblöcke aus dem „Python“-Programm „calliope_prog_01_02.py“ an der mit rotem Pfeil gekennzeichneten Stelle in das „Python“-Programm „calliope_prog_01_08py“ einfügen und das Ganze als neues „Python“-Programm „calliope_prog_01_09.py“ abspeichern:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_09.py)

 

Wie man im nachfolgenden Screenshot sieht, fügen wir im „Python“-Programm calliope_prog_01_09.py ein weiteres Textarray „text_array_2“ für die Laufschriftanzeige bei den Funktionsaufrufen wie folgt hinzu:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_09.py)

 

Wie man im obenstehenden Bild im grünen Kasten sieht, wird im

 

·        Textarray-Element „text_array_2[3]“ der Textstring „Das Gewitter = “ und im

 

·        Textarray-Element „text_array_2[4]“ der Textstring „m entfernt!“

 

gespeichert.

 

Bei der späteren Entfernungsberechnung zwischen Blitz und Donner wird dann die Entfernung zusammen mit den beiden Textarray-Elementen [3] und [4] wie folgt angezeigt:

 

·        „Das Gewitter = 1372.8 m entfernt!“      als Laufschrift auf dem 5x5 Matrix LED-Display

 

·        „Das Gewitter = “

„1372.8“

„m entfernt!“      als Zeilendarstellung im „PuTTY“-Konsolefenster

 

 

(Zum Vergrößern bitte auf das Bild klicken!)

 

Schuld an der Zeilendarstellung im „PuTTY“-Konsolefenster (siehe roter Kasten im obenstehenden Bild) ist die Programmierung der zeilenweisen Textanzeige in der Endlosschleife „on_forever()“ ( siehe grüner Kasten):

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_09.py)

 

„Wenn man weiß, wie es geht, wie die Dinge funktionieren, dann sind sie ganz einfach zu verstehen!“ könnte man meinen.

 

Okay, ich gebe es zu, bisher wussten wir noch nicht, dass sich auch in Python einzelne Zeichenketten, engl. „strings“, miteinander verbinden und dann als Ganzes z.B. in der Laufschrift im 5x5 Matrix LED-Display anzeigen lassen.

 

Dabei gilt es zu beachten, dass numerische Variablen wie z.B. die Variable „entfernung“ vor dem Verbinden mit einer Zeichenkette mittels des Befehls „str(entfernung)“ in einen String umgewandelt werden müssen ( siehe grüner Kasten):

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_10.py)

 

Da wir beim „Calliope mini“ und dem „micro:bit“ entweder im Texteditor auf der Entwicklungsumgebung im Browser oder in einem externen Editor wie z.B. „Notepad++“ programmieren, der entwickelte Quellkode in Maschinenkode übersetzt wird und Webseiten, die mit HTML 4.0/5.0 erstellt wurden, auch herkömmlichen ASCII- oder ANSI-Text verstehen bzw. im Browser darstellen können, lässt sich unser „Python“-Programm calliope_prog_01_10.py auch direkt im Browser publizieren, weil eine einfache Textdatei ohne Formatierung wie eine Webseite ohne HTML-Kodierung ist!

 

Hier ein kleines Beispiel für eine einfache HTML-Webseite:

 

<HTML>

 

<TITLE>Meine erste Webseite!</TITLE>

 

<BODY>

 

<H2><I>Meine erste, einfache Webseite!</I></H2>

<P>Hallo und herzlich willkommen

<P>auf meiner <U>ersten</U> <B>Webseite</B>, die ich einfach so erstellt habe!

<BR>

<BR>Das was man hier im <B>Browser</B> sieht, ist der reine ASCII-Text.

<P>Das was man <u>nicht</u> sieht, ist die <B>HTML-Kodierung</B>,

<BR>weil der <B>Browser</B> diese <font color=red><u>nicht</u></font> anzeigt!

 

</BODY>

 

</HTML>

 

Und so sieht die einfache Webseite im Browser aus:

 

 

(Auf den Screenshot klicken, um die Webseite anzuzeigen!)

 

Das „Blitz & Donner“-Programm ist für’s Erste ziemlich ausgereift, sodass es sich anbietet, das „Python“-Programmieren

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_10.py)

 

mit dem „Block“-Programmieren

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis calliope_prog_01_10.hex)

 

zu vergleichen.

 

Wenn man früher oder später als professioneller Programmierer arbeiten und damit seinen Lebensunterhalt verdienen will, dann müsste man sich rechtzeitig vom „Block“-Programmieren verabschieden, um den Aufstieg vom Hobby-Programmierer zum Profi-Programmierer zu schaffen.

 

Aber ob man das „Block“-Programmieren dem „Python“-Programmieren vorzieht oder umgekehrt, ist nicht nur eine Frage des Geschmacks, sondern vielleicht auch eine Frage, welcher Lerntyp man selbst ist.

 

So gibt es z.B. Lerntypen, die dann am besten lernen, wenn sie die Dinge anfassen, in die Hand nehmen und im sprichtwörtlichen Sinne „begreifen“ können. Andere wiederum lernen am besten in Bildern, in bunten Bildern, die ihre Fantasie anregt und sie besonders motiviert, während wiederum andere mehr das Abstrakte, das Puristische mögen, nämlich den reinen, schnörkellosen Text bzw. den strukturierten Quellkode als simplen Text.

 

Ich persönlich mag das „Block“-Programmieren, wenn es darum geht, sich komplett in eine neue Programmiersprache einzuarbeiten. Da man beim „Block“-Programmieren links vom eigentlichen Programm den kompletten Befehlsumfang schön bunt aufgelistet bekommt, lässt es sich gut experimentieren, lassen sich neue Dinge gut ausprobieren.

 

Was ich beim „Block“-Programmieren auf Dauer nicht mag, ist, dass man Befehle, Parameter, Verbindungsglieder usw. immer wieder mit der Maus hin- und herschieben muss und dabei den Mauszeiger nicht zu früh loslassen darf, damit z.B. der Parameter zur richtigen Zeit an der richtigen Stelle einrastet.

 

Wenn darüber hinaus ein „Block“-Programm sehr umfangreich wird, dann fühle ich mich von den vielen bunten Statements erschlagen, fängt es an mich zu nerven, sehne ich mich nach herkömmlich, klar strukturierten „Python“-Programmkode.

 

Wenn man hingegen neu in das „Python“-Programmieren einsteigt und anfangs nicht weiß, wo und wie man am besten anfängt, weil man noch überhaupt keine Befehle kennt, dann braucht es schon viel Geduld und Ergeiz, die neue Programmiersprache Stück für Stück zu erforschen und auszuprobieren.

 

Wenn man allerdings schon mit anderen Programmiersprachen gearbeitet hat, dann stellt man überraschend fest, dass es Parallelen gibt, dass die verschiedenen Programmiersprachen voneinander gelernt und abgekupfert haben, sodass einem vieles vertraut vorkommt.

 

Demzufolge dürfte uns nachfolgend das Übersetzen des obenstehenden „Python“-Programms in die „C++“-Programmierung für den Arduino UNO nicht so schwer fallen.

 

 

Programmieren mit dem „Arduino UNO“-Rechner

 

Wir setzen die für den Arduino abgespeckte „C++“-Programmierung namens Sketch im Kapitel „Blitz und Donner programmieren fort und zwar mit dem neuen „Arduino UNO“-Programm sketch_prog_01_08.ino (siehe auch Webverzeichnis).

 

Wie wir bereits wissen, verfügen der „Calliope mini“ als auch der „micro:bit“ beide über zwei Taster „A“ und „B“, die sich für Steuerungszwecke programmieren lassen.

 

Der „Arduino UNO“ hingegen hat zwar von Haus aus keine Taster „A“ und „B“, was aber letztlich kein Problem darstellt, da sich mittels der analogen und digitalen Ein- und Ausgänge zwei Eingänge so programmieren lassen, dass sich mit diesen zwei Taster „A“ und „B“ abfragen lassen. Das wäre dann sozusagen die Lösung mittels Hardware.

 

Aber es gibt natürlich auch eine Lösung mittels Software, indem wir mittels eines „Sketch“-Programms (= C++ für den Arduino UNO) die USB-Tastatur des Desktop-PCs abfragen, auswerten und auf einzelne Tastaturanschläge reagieren. Das wiederum zu programmieren dürfte nicht so schwierig sein, handelt es sich doch bei der USB-Tastatur um eine solche, die über die serielle „RS-232“-Schnittstelle abgefragt wird.

 

Da es bei unseren Tastaturanschlägen darum geht, einzelne Tastendrücke wie z.B. von einzelnen Buchstaben abzufragen, müssen wir uns seitens der „Sketch“-Programmierung zuerst mit dem Umgang einzelner Zeichen (= Ziffern, Buchstaben, Sonderzeichen) beschäftigen. Dabei gilt es zu beachten, dass sich nur mit Zahlen rechnen lässt, aber eben nicht mit Ziffern!

 

Demzufolge sieht man es einer Ziffer wie z.B. „1“, „2“, …, „9“, …, „A“, …, „F“ nicht an, ob diese später als hexadezimale Zahl interpretiert werden soll, um mit dieser rechnen zu können oder eben nicht. Demzufolge muss die Anzeige der aktuellen Uhrzeit auf der Ziffernblattanzeige einer Analoguhr vom Anwender ebenfalls interpretiert werden. Und, da das Ziffernblatt nur Ziffern von 1 bis 12 bzw. zusätzlich eventuell auch noch von 13 bis 24 aufgedruckt hat, muss der Anwender die Uhrzeitanzeige auch dahingehend interpretieren, ob es sich bei dieser um engl. „a.m.“ (=„at morning”, morgens) oder „p.m.“ (=„past morning”, nachmittags) handelt.

 

Im nachfolgenden „Arduino UNO“-Programm „sketch_prog_01_08.ino“ (siehe Webverzeichnis) geht es also darum, dass wir uns mit dem Programmieren von engl. char, d.h. einzelnen Zeichen im Sinne von Ziffern und Buchstaben befassen. Dabei lassen sich aber auch mehrere Buchstaben und Ziffern zu einer Zeichenkette, engl. „string“ zusammensetzen. Und zwar auch dann, wenn wir dem String den Datentyp „char“ zuweisen!

 

Beim

 

·        Statement < char textString_0; >

 

handelt es sich um die Deklarierung der Variablen „textString_0“, d.h. der Zuordnung zum Datentyp „char“, wobei der Variablen noch kein Inhalt in Form eines Textstrings zugewiesen wird.

 

Die Initialisierung des Textstrings „Hallo Welt!“ erfolgt also erst später und zwar im

 

·        Statement < textString_0 = “Hallo Welt!“; >

 

Das Interessante dabei ist nun, dass sich der zugewiesene Textstrings „Hallo Welt!“ wider Erwarten nicht in der Variablen „textString_0“ (ab-) speichern lässt, weil dieser zwar der Datentyp „char“ zugewiesen wurde, aber kein Parameter über die Größe des Speicherplatzes zum Abspeichern des Textstrings (siehe im Konsolefenster „COM5“).

 

Obwohl also die „char“-Variable „textString_0“ mangels Speicherplatz keine Information des Textstrings „Hallo Welt!“ enthält, muss genau die Information, dass kein Speicherplatz zugewiesen wurde, gespeichert werden! Deshalb liefert das

 

·        Statement < Serial.println(sizeof(textString_0)); >

 

das Ergebnis „1” im Konsolefenster „COM5“:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis sketch_prog_01_08.ino)

 

Wenn man der Variablen „textString_1“ vom Typ „char“ Speicherplatz zwecks späterer Aufnahme einzelner Zeichen zuordnen will, dann muss man diesen in Form einer eckigen Klammer [ ] nebst Angabe einer Zahl für die Anzahl der zu speichernden Zeichen wie folgt hinzufügen, d.h. deklarieren:

 

·        Statement < char textString_1[5]; >

 

Jetzt erst ist die Variable „textString_1[5] in der Lage bis zu fünf Zeichen jedweder Art in Form von Buchstaben, Ziffern, Symbolen aufzunehmen und zu speichern.

 

Dabei hindert einen niemand daran, der Variable „textString_1[5] auch einen längeren Textstring wie z.B. „Hallo Welt!“ zuzuweisen,

 

·        Statement < char textString_1[5] = “Hallo Welt!“; >

 

sodass aber entsprechend dem zugewiesenen Speicherplatz nur fünf Zeichen abgespeichert werden, der Rest also abgeschnitten wird!

 

Fassen wir kurz zusammen:

 

·        Auch Variablen vom Typ „char“ lassen sich nur, d.h. ohne Wertzuweisung deklarieren:

 

Statement < char textString_0; >

 

Dabei lässt sich auch festlegen, wie viel Zeichen die Variable aufnehmen und speichern soll:

 

Statement < char textString_0[5]; >

 

·        Nachdem eine Variable vom Typ „char“ deklariert wurde, lässt sie sich anschließend auch initialisieren, lassen sich dieser Werte (= Inhalte wie einzelne Ziffern, Buchstaben, Sonderzeichen, Zeichenstrings) zuordnen:

 

Statement < char textString_1[5]; >

 

Statement < textString_1 = “Hallo Welt!“; >

 

Wenn dabei der Zeichenstring “Hallo Welt!“ länger ist als der reservierte Speicherplatz von z.B. [5] Zeichen, dann werden beim Initialisieren die überzähligen Zeichen des Zeichenstrings einfach abgeschnitten!

 

·        Wenn man sich beim Deklarieren oder auch Initialisieren noch nicht festlegen will oder kann, wie viele [?] Zeichen als Platzhalter für das Speichern in der Variable vom Typ „char“ reserviert werden sollen, dann lässt man dies einfach offen, dann werden unterschiedlich lange Teststrings als Ganzes gespeichert:

 

Statement < char textString_1[ ]; >

 

Statement < textString_1 = “Hallo Welt!“; >

 

oder kürzer

 

Statement < char textString_1[ ] = “Hallo Welt!“; >

 

·        Gemäß dem bisherigen Wissensstand verhält es sich so, dass die beiden kombinierten Statements

 

Statement < char tempString[ ] = “Hallo Welt!“; >

Statement < char textString_1[ ] = tempString; > 

 

nicht funktionieren!

 

Der Grund dafür ist der, dass sich es bei den „char“-Statements in Wirklichkeit um sogenannte engl. arrays (= Datenfelder mit z.B. einer Zeile, aber mehreren Spalten, Paneel, d.h. Holztafel) handelt, die sich dynamisch, d.h. ohne statische Festlegung der Feldgröße von z.B. [15] Zeichen, deklarieren lassen.

 

Und genau das bedingt, dass es sich bei dem zugeordneten Textstring um einen konstanten handeln muss, der sich dann eben nicht durch eine Variable wie z.B. tempString ersetzen lässt!

 

 

Handwerklich und programmiertechnisch interessant ist der nachfolgende Programmkode im roten Kasten des nachfolgenden Screenshots, wenn es darum geht, dass man die Anzahl der Zeichen des Textstrings „Das Pferd frisst keinen Gurkensalat!“, der in der Variablen „textString_1“ vom Typ „char“ gespeichert werden soll, wie folgt dynamisch programmiert.

 

Zu diesem Zweck schafft man die temporäre Hilfsvariable tempString[ ] vom Typ „char“. Da diese Hilfevariable einen beliebig langen Textstring aufnehmen können soll, muss diese wie folgt initialisiert werden:

 

·        Statement < char tempString[ ] = "Das Pferd frisst keinen Gurkensalat!"; >

 

Anschließend ermittelt man die Stringlänge „stringLaenge“ der Hilfsvariablen tempString:

 

·        Statement < int stringLaenge = sizeof(tempString); >

 

Die ermittelte Stringlänge des Textstrings "Das Pferd frisst keinen Gurkensalat!" beträgt 37 Zeichen (siehe „COM5“-Konsole der seriellen Schnittstelle), obwohl es eigentlich nur 36 Zeichen sind! Der Grund dafür ist der, dass der Stringlänge = 36 Zeichen noch eine „0“ als Abschlusszeichen der Zeichenkette hinzugefügt wird!

 

Jetzt wo wir die Stringlänge des Textstrings in der Variablen „stringLaenge“ gespeichert haben, lässt sich diese wie folgt bei der Deklarierung der Variablen „textString_1“ vom Typ „char“ nebst der Reservierung von Platzhalterstellen wie folgt vornehmen:

 

·        Statement < char textString_1[stringLaenge]; >      stringLaenge = 37 Zeichen

 

Wenn es jetzt noch darum geht, die Variablen „textString_1“ vom Typ „char“ mit dem Textstring in einem Stück zu initialisieren, dann müssen wir leider feststellen, dass das

 

·        Statement < char textString_1[stringLaenge] = tempString; >

 

zu der übersetzten Fehlermeldung „Das Array muss mit einem in Klammern eingeschlossenen Initialisierer initialisiert werden” führt. Was auch immer dies bedeuten mag.

 

Was aber fehlerfrei funktioniert, sind die beiden aufgeteilten Statements (siehe roten Kasten):

 

·        Statements

 

< char textString_1[stringLaenge]; >

< strcpy(textString_1, tempString); >

 

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis sketch_prog_01_09.ino)

 

Beim Arbeiten mit Textstrings gibt es zwei Befehle die von Bedeutung sind und die man früher später braucht:

 

·        Statement < int Textstring_laenge_1 = sizeof(textString_1); >

 

Mit dem Befehl sizeof(textString_1) lässt sich die Größe des reservierten Speicherplatzes der Variablen „textString_1“ ermitteln.

 

Dabei gilt es zu beachten, dass sich die Größe von z.B. 37 Zeichen (siehe grüner Kasten) aus 36 + 1 Zeichen für das Ende des Speicherplatzes zusammen setzt!

 

·        Statement < int Textstring_laenge_2 = strlen(textString_1); >

 

Mit dem Befehl strlen(textString_1) lässt sich die definitive Länge des Textstrings, der der Variablen „textString_1“ zugeordnet ist, ermitteln.

 

Interessant ist auch noch, dass sich ein längerer Textstring der Variablen „textString_2“ auf bzw. über einen kürzeren Textstring der Variablen „textString_1“ kopieren lässt!

 

Dazu muss man wissen, dass der ursprünglich reservierte Speicherplatz der Variablen „textString_1“ automatisch auf den reservierten Speicherplatz der Variablen „textString_2“ angepasst wird, sodass beim längeren Textstring nichts abgeschnitten wird (siehe blauer Kasten im obenstehenden Bild)! Demzufolge wird der kürzere Textstring „Das Pferd frisst keinen Gurkensalat!“ durch den längeren Textstring „Das Pferd frisst keine Tomaten und auch keinen Gurkensalat!“ ausnahmslos ersetzt! -

 

Beim „Blitz & Donner“-Programm (siehe Programm „calliope_prog_01_10.py“) geht es hauptsächlich darum, mittels der Schallgeschwindigkeit die Entfernung zwischen Blitz und Donner zu berechnen, wozu man die zwischen Blitz und Donner verstrichene Laufzeit des Schalls in Sekunden zählen und diesen Wert zwecks weiterer Berechnung eintasten muss. Da aber weder der „Calliope mini“, der „micro:bit“ noch der „Arduino UNO“ über eine Tastatur verfügen, muss man sich zwecks der Dateneingabe etwas anderes einfallen lassen.

 

Wenn man wie im vorliegenden Fall davon ausgeht, dass sich das Gewitter in unmittelbarer Nachbarschaft befindet, weil man den Donner nicht von beliebig weit her hören kann, dann muss man den Defaultwert (= voreingestellter, vorgegebener Wert) von tSchall = 4 s nur um einige +/- Sekunden nach oben oder unten verändern können. Beim „Calliope mini“ und „micro:bit“ lassen sich zu diesem Zweck die beiden Taster „A“ und „B“ entsprechend nutzen. Und zwar Taster „A“ zum Herunterzählen und Taster „B“ zum Heraufzählen. Mit der Tastenkombination „A&B“ lässt sich jederzeit die Berechnung starten, wobei der jeweils zuletzt eingetastete Wert berücksichtigt wird.

 

Damit aber der Anwender des „Blitz & Donner“-Programms weiß, dass es die Taster „A“ und „B“ nebst der Tastenkombination „A&B“ gibt, muss das Programm diesen darüber informieren:

 

 

(Zum Vergrößern bitte auf das Bild klicken!)

 

Wie man anhand des obenstehenden Screenshots in der „Arduino UNO“-Konsole sieht, werden die vier anzuzeigenden Textstrings mit dem laufenden Index [ 0, …, 3] in der Array-Variablen „text_array“ abgespeichert, wobei das Array über eine Datenzeile mit je vier Datenspalten verfügt.

 

Bezüglich der Anzeige in der Konsole darf man vermuten, dass diese über eine endliche Schleife erfolgt, wobei diese von null an bis zu viermal durchlaufen wird:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis | sketch_prog_01_10.ino)

 

Dass in der „Arduino UNO“-Konsole auf Veranlassung des Programms insgesamt vier Textstrings unterschiedlicher Zeichenlänge von zusammen 15 + 25 + 25 + 32 = 97 Zeichen angezeigt in der (Array-) Variablen „text_arry“ gespeichert und untereinander dargestellt werden sollen, geht auf das Programm und dessen Programmierung zurück (siehe blauer Kasten im obenstehenden Screenshot).

 

Wie aber lässt sich aus Stringlänge = 97 Zeichen herausrechnen, dass sich diese auf 4 Spalten aufteilen?

 

Wenn jede der 4 Spalten über eine max. Stringlänge von 24 Zeichen verfügt, dann macht das zusammen 24 Zeichen/Spalte * 4 Spalten = 96 Zeichen:

 

Spalte 1: 24 Zeichen – 15 Zeichen = +9 restliche   Zeichen

Spalte 2: 24 Zeichen – 25 Zeichen =  -1 restliches Zeichen

Spalte 3: 24 Zeichen – 25 Zeichen =  -1 restliches Zeichen

Spalte 4: 24 Zeichen – 32 Zeichen =  -8 restliche   Zeichen

 

        = 15/24 + 25/24 + 25/24 + 32/24 = 97/244 Spalten! (siehe roter Kasten oben)!

 

Umgekehrt folgt: 97 Zeichen / 4 Spalten24 Zeichen/Spalte!

 

Im obenstehenden Screenshot gibt es noch die Berechnungsformel zwecks Berechnung der Spaltenzahl

 

·        sizeof(text_array) / sizeof(String),

 

die übrigens identisch ist mit

 

·        sizeof(text_array) / sizeof(text_array[0])

 

Setzt man die im Konsolefenster angezeigten Werte ein, so folgt rechnerisch:

 

sizeof(text_array) / sizeof(text_array[0]) = 24 / 6 = 4 Spalten bezogen auf insgesamt ≈ 96 Zeichen!

 

Wenn das Programm zur Initialisierung der Variablen „text_array“ gelangt, dann weiß es, dass das Array insgesamt 97 Zeichen lang ist und aus 4 Spalten besteht. Demzufolge hat jedes der 4 Arrayelemente bzw. der 4 Felder insgesamt = 97 Zeichen / 4 Spalten ≈ 24 Zeichen/Spalte (siehe oben).

 

Erweitert man den Quotienten 24 Zeichen/Spalte mit 4, so folgt:

= 24 Zeichen * 4 / (1 Spalte * 4) = 96 Zeichen / 4 Spalten þ = 24 Zeichen / 1 Spalte. þ

 

Jetzt wo wir wissen, wie sich die Anzahl aller Spalten aus der gesamten Zeichenzahl (≈ 96 Zeichen) aller Arrayelemente (= 4 Spaltenfelder) berechnet können wir diese der Variablen „i_max“ wie folgt zuordnen:

 

·        Statement < int i_max = sizeof(text_array) / sizeof(text_array[0]); >,

 

sodass sich der Schleifzähler i den Bereich [ 0, …, i_max ] durchläuft und dabei die einzelnen Array-Elemente in Form der Textstrings in der Konsole angezeigt werden:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis | sketch_prog_01_11.ino)

 

Wie bereits an anderer Stelle erläutert wurde, gibt es neben der „while”-Schleife (siehe oben im grünen Kasten) auch noch die „for … next“-Schleife (siehe unten im roten Kasten):

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis | sketch_prog_01_12.ino)

 

Wie man im obenstehenden Screenshot bei der „for … next“-Schleife sieht, gibt es im Schleifenkopf insgesamt drei Parameter, die sich alle auf den Schleifenzähler i beziehen bzw. mit diesem zu tun haben (siehe oben im roten Kasten):

 

·        der Parameter i = 0

 

legt fest, ab welchem Anfangswert der Schleifenzähler i zu zählen anfangen soll,

 

·        der Parameter i < i_max

 

legt fest, bis zu welchem Schleifenzählerwert i < 4 und wie oft die Schleife durchlaufen werden soll,

 

·        der Parameter i++

 

legt fest, dass der Schleifenzähler i nach jedem Schleifendurchlauf, d.h. am Ende der Schleife um den Wert = +1 erhöht (= inkrementiert) werden soll: i = i + 1 oder kurz i++ .

 

Wir wenden das gelernte Wissen über das Erzeugen und Anlegen von Textarrays des Typs „String“ nebst Konsoleanzeige derselben mittels einer „for … next“-Schleife auf das „Donner & Blitz“-Programm an.

 

Und zwar in Anlehnung an das zuletzt programmierte „Python“-Programm calliope_prog_01_10.py, das sich auch als „Block“-Programm mit dem „Calliope mini“ oder dem „micro:bit“ (ohne RGB-LED) nutzen lässt:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis | calliope_prog_01_10.py)

 

Wie man im Vergleich des obenstehenden „Python“-Programms des „Calliope mini“ mit dem „Sketch“-Programm des „Arduino UNO“ sieht, ähneln sich die Programmiersprachen, gibt es praktisch in jeder Programmiersprache die Möglichkeit, Arrays anzulegen oder mit „while“- oder „for“-Schleifen zu arbeiten:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis | sketch_prog_01_13.ino)

 

Im Unterschied zum „Python“-Programm des „Calliope mini“ gibt es beim „Arduino UNO“ von Haus aus kein einfaches 5x5 Matrix LED-Display, sondern nur die Möglichkeit, die Textstrings der beiden Arrays „text_array“ und „text_array_2“ im Konsolefenster der „Arduino“-Entwickleroberfläche anzeigen zu lassen:

 

 

(Zum Vergrößern bitte auf das Bild klicken!)

 

Nachdem wir in den obenstehenden Screenshots die beiden Textarrays für die Kommunikation des Programms mit dem Anwender programmiert haben und die Displayanzeigen in der Arduino-Konsole bisher nur unidirektional, d.h. einseitig in Richtung des Anwenders arbeiten, geht es nachfolgend darum, auch den Anwender mittels Tastatureingaben mit dem Programm kommunizieren zu lassen.

 

Da der „Arduino UNO“ weder über ein 5x5 Matrix LED-Display noch über zwei integrierte Taster „A“ und „B“ verfügt, behelfen wir uns dahingehend, dass wir anstelle der Taster die PC-Tastatur einsetzen, um Tastatureingaben durch den Anwender vornehmen zu lassen.

 

Da der Anwender unabhängig von der jeweiligen Tageszeit einfach jederzeit Tastatureingaben tätigen können soll, müssen wir das Tastatur-Abfrageprogramm wie folgt in die Endlosschleife „void loop()“ packen:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis | sketch_prog_01_14.ino)

 

Wir probieren das Programm „sketch_prog_01_14.ino“ aus, indem wir es starten, das Arduino-Konsolefenster aufrufen, in der Eingabezeile der Reihe nach die Tastatureingaben „b“, „a“ und „r“ eintasten und diese jeweils einzeln durch Mausklick auf die Schaltfläche <Senden> bestätigen:

 

 

(Zum Vergrößern bitte auf das Bild klicken!)

 

Weiter geht’s mit der Programmierung der Funktionen „on_button_pressed_b()“, „on_button_pressed_a()“ und „on_button_pressed_r()“.

 

Dabei müsste die Funktion „on_button_pressed_r()“ in Anlehnung an das „Python“-Programm „calliope_prog_01_10.py eigentlich „on_button_pressed_ab()“ heißen, aber die Programmierung der Abfrage Taster „A“ und „B“ direkt nacheinander und unter Einhaltung der Reihenfolge ist nicht so einfach, wie es zunächst den Anschein hat. Deshalb wird zunächst nicht die Tastenkombination „A&B“ abgefragt, sondern einfach nur die Tastaturabfrage nach dem Buchstaben „r“, d.h. „r“ wie rechnen, da ja die Entfernung des Gewitters zum Standort des Anwenders berechnet werden soll (siehe die beiden Screenshots weiter oben):

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis | sketch_prog_01_15.ino)

 

Wie man im obenstehenden Screenshot sieht, müssen die Funktionen „on_button_pressed_b()“, „on_button_pressed_a()“ und „on_button_pressed_r()“ außerhalb der Funktionen „void setup()“ und „void loop()“ programmiert werden, damit sie global über alle Funktionen hinweg nutzbar sind!

 

Dazu muss man wissen, dass es bei der Programmierung von höheren Programmiersprachen wie z.B. mit Sketch (= abgespecktes C++ für den „Arduino UNO“), MicroPython (= abgespecktes Python u.a. für ARM Cortex-M“-Prozessoren beim „micro:bit“ und „Calliope mini“) sowohl

 

·        globale Variablen und Funktionen

 

als auch

 

·        lokale Variablen und Funktionen

 

gibt.

 

Dabei lassen sich globale Variablen und Funktionen über alle anderen Variablen und Funktionen hinweg global nutzen, während lokale Variablen und Funktionen nur lokale Gültigkeit haben und sich demzufolge lokale Variablen und deren Inhalte nur innerhalb einer lokalen Funktion ansprechen, austauschen oder kopieren lassen, sodass diese nach außen hin abgeschottet sind und von außen global nicht erreichbar sind.

 

Demzufolge stellen lokale Funktionen und deren lokale Variablen eine engl. Black Box (= schwarzer Kasten) dar, auf dessen Innenleben man nicht zugreifen kann. Wenn man trotzdem Daten in Form von Variableninhalten an die Black Box übergeben will, dann muss man dies bereits mit dem Funktionsaufruf in Form von Parametern usw. machen:

 

·        Statement < starte_Funktion_XY(Variable, Zahlenwert, Textstring) { … } >

 

Diesbezüglich verhält sich eine lokale Funktion und deren lokale Variablen zwar als „Black Box“, nicht aber als ein Schwarzes Loch, das alle Materie bzw. alle Daten aufsaugt und auf nimmer Wiedersehen verschlingt!

 

Daten in Form von Variableninhalten lassen sich nämlich mittels des

 

·        Statements < return(Variable, Zahlenwert, Textstring) >

 

wieder an das Hauptprogramm oder die aufrufende globale Funktion zurückgeben!

 

Damit es später zu keinen Verwechselungen, Irrtümern oder Fehlern kommt, sollte man es tunlichst unterlassen, globale und lokale Variablen gleichen Variablennamens zu verwenden, da man es den Variablen und Funktionen nicht ansieht, ob sie nur lokal oder aber global wirksam sind!

 

 

Wenn man sich den Quellkode vom Programm „sketch_prog_01_15.ino anschaut (bitte auf den blauen Link ï klicken!), dann stellt man unschwer fest, dass es sich bei der Array-Variablen „text_array[ ]“ in der Funktion „void setup()“ um eine lokale Variable vom Typ „String“ handelt, da sich diese in der Funktion selbst befindet. Demzufolge lässt sich die lokale Array-Variablen „text_array[ ]“ nur innerhalb der Funktion „void setup()“ nutzen!

 

Bei der Array-Variablen „text_array_2[ ]“ ganz zu Beginn des Hauptprogramms handelt es sich hingegen um eine globale Variable vom Typ „String“, da sich diese in keiner lokalen Funktion befindet, sondern vielmehr innerhalb des Hauptprogramms. Demzufolge lässt sich die globlae Array-Variable „text_array_2[ ]“ über das gesamte Programm hinweg  - auch innerhalb von lokalen Funktionen(!) -  nutzen! -

 

Schauen wir uns als Nächstes noch die Tastaturabfragen „b“, „a“ und „r“ und die zugehörigen Funktionsaufrufe an.

 

Dabei gilt es zu beachten, dass die Tastaturabfragen permanent, d.h. fortwährend, ununterbrochen erfolgen, sodass diese innerhalb der Funktion „void loop()“ programmiert werden müssen:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis | sketch_prog_01_15.ino)

 

Während also die Taster „A“ und „B“ beim „Calliope mini“ und „micro:bit“ bzw. deren äquivalenten Tastatureingaben „a“ und „b“ ausschließlich dazu dienen, den voreingestellten Zeitwert der Variablen „time_sekunden“ = 4 (Sekunden) zu erhöhen (= Taster „b“) oder zu verringern (= Taster „a“), dient die Tastatureingabe „r“ (= [be-] rechne die Gewitter-Entfernung) dazu, auf die Tastatureingaben zu reagieren, diese auszuwerten und entsprechende Warnhinweise (siehe Variable „text_array_2[ ]“) im Konsolefenster anzuzeigen:

 

 

(Bild vergrößern: auf Bild klicken! Webverzeichnis | sketch_prog_01_16.ino)

 

So, nun sind wir mit dem „Sketch“-Programm „sketch_prog_01_16.ino für den „Arduino UNO“ an einem Punkt angelangt, wo wir für den Anfang schon recht gut programmieren und darauf stolz sein können.

 

Weiter geht es nun endlich zum Versuch 1 „Spannung, Strom und Widerstand“ des KOSMOS Experimentierkasten „Easy Elektronik Start“ [ weiterlesen ]

 

 

 

[ Easy Elektro Start ] [ Seitenanfang ] [zurück ]