Einführung ins Espruino-Board

Seite 3: Eigene Funktionen schreiben

Inhaltsverzeichnis

Eigene Funktionen definiert man ebenfalls wie gewohnt. Die folgende Funktion invertiert zum Beispiel bei jedem Aufruf den Status der grünen LED:

>function toggle() {
: on = !on;
: digitalWrite(LED2, on);
:}
=function () {
on = !on;
digitalWrite(LED2, on);
}

Ruft man toogle auf, wenn die grüne LED aus ist, dann wird die LED eingeschaltet. Andernfalls wird sie ausgeschaltet. Die Variable on ist eine globale Variable, die vom Interpreter bei der ersten Verwendung automatisch erzeugt wird. Sie hat zuerst einmal den Wert undefined. Weil in JavaScript der Ausdruck !undefined aber zu true wird, kann man on ohne Deklaration bequem als Boolesches Flag verwenden.

Um die LED in einem festen Intervall blinken zu lassen, kann man die Funktion setInterval verwenden:

>var toggler = setInterval(toggle, 1000)
=1

Danach blinkt die LED im Sekundentakt (1000 Millisekunden) und die Variable toggler enthält eine Referenz auf das Intervall-Objekt. Damit lässt sich das Blinken jederzeit wieder abbrechen:

>clearInterval(toggler)
=undefined

Feste Zeitintervalle zur Steuerung von Aktionen sind in vielen Fällen hilfreich. Genauso hilfreich ist es aber, Aktionen an Ereignisse zu knüpfen, wie zum Beispiel an die Zustandsänderung eines GPIO-Pins.

Das folgende Programm verwendet die Funktion setWatch, um den Status des frei programmierbaren Druckschalters auf dem Espruino-Board zu überwachen (das ist der Drucktaster, der am weitesten vom USB-Anschluss entfernt ist):

setWatch(function() {
LED1.set();
setTimeout("LED1.reset(); LED2.set();", 500);
setTimeout("LED2.reset(); LED3.set();", 1000);
setTimeout("LED3.reset()", 1500);
}, BTN, { repeat: true, edge: "rising" });

Wann immer man den Taster drückt, leuchten die drei LEDs in der Reihenfolge rot, grün und blau.

Die setWatch-Funktion erwartet eine Funktion, die im Falle einer Zustandsänderung eines Pins auszuführen ist und sie erwartet den zu überwachenden Pin. Im obigen Beispiel repräsentiert die globale Konstante BTN, die von der Laufzeit-Umgebung automatisch angelegt wird, den Pin. Darüber hinaus akzeptiert setWatch eine Reihe von Optionen, mit denen sich das Überwachungsverhalten steuern lässt.

Schon bei einem solch kleinen Beispiel muss man sich Gedanken über die beschränkten Ressourcen des Boards machen. Betätigt man den Taster ausreichend oft, wird die Laufzeitumgebung irgendwann die Fehlermeldung “Out of memory” ausgeben. Das Problem sind vermutlich die Timeout-Objekte, die bei jedem Aufruf von setTimeout erzeugt, aber nie mit der Funktion clearTimeout zerstört werden. In einer Produktionslösung muss man also deutlich mehr Sorgfalt walten lassen.

Wenn man etwas länger in der Shell des Interpreters gearbeitet hat, wird man die bisherigen Erfolge irgendwann sichern wollen. Dazu gibt es mehrere Möglichkeiten.

>dump()
function toggle() {
on = !on;
digitalWrite(LED2, on);
}
var on = false;
=undefined

dump gibt den aktuellen Zustand des Interpreters als Text aus, so dass man durch simples Kopieren denselben Zustand in einer weiteren Interpreter-Instanz erzeugen kann. Zurücksetzen kann man den Interpreter mit der Funktion reset. Die save-Funktion dient dazu, den aktuellen Zustand im Flash-Speicher zu hinterlegen und beim nächsten Start automatisch zu laden.

>save()
=undefined
Erasing Flash.....................
Programming 36000 Bytes.......................................
Checking...
Done!
>>