Es gibt eine kurze und eine lange Antwort. Zuerst die kurze: das tmr.delay() ist Schuld.
In der Doku steht dazu
Und jetzt die längere Antwort. Auf dem ESP läuft ein kooperatives Multitasking System. Neben dem Netzwerkstack und anderen Tasks ist der Luainterpreter nur eine weitere. Eine Task in einem kooperativen System darf den Prozessor aber nicht blockieren. Tut eine Task es aber doch, schlägt auf dem ESP der Watchdog zu und löst einen Reset aus. Das ist das, was du beobachtest.Busyloops the processor for a specified number of microseconds.
This is in general a bad idea, because nothing else gets to run, and the networking stack (and other things) can fall over as a result. The only time tmr.delay() may be appropriate to use is if dealing with a peripheral device which needs a (very) brief delay between commands, or similar. Use with caution!
Programme auf dem lua NodeMCU müssen anders aufgebaut werden, als man das sonst so macht. Die klassische "while(1)" Schleife gibt es nicht, sie würde das System blockieren. Die Funktionen, die das System ausführen soll, werden ereignissgesteuert ausgeführt. Als Beispiel: über W-Lan kommt eine Nachricht, sie wird interpretiert und umgesetzt. Ein Inputpin ändert seinen Zustand, es wird die passende Funktion aufgerufen. Findet man für seinen Zweck kein passendes Ereigniss, kann man einen Timer aufsetzen, der die Funktion startet. Wenn du die Doku zum NodeMCU System mit lua durchgehst, findest überall Stellen, wo du deine Funktionen als Callbacks eintragen kannst.
Solche Ereignissgesteuerten System sind (besser waren) bei Anwenderprogrammen eher selten. Bei Programmen, die mit einer GUI laufen, sind sie aber üblich. Ein System ohne GUI ist die Javascript Umgebung ohne Browser, genannt node.js. Die Verwendung von node bei NodeMCU ist nicht zufällig. Hier mal etwas zu einlesen, es wird aber als alleinige Literatur nicht reichen.
Nun zu deinem Beispiel. Du möchtest einen Pin toggeln eine LED blinken lassen. Dazu ist es als erstes nötig, den passenden Pin als Output zu konfigurieren.
LED_PIN = 2
gpio.mode(LED_PIN, gpio.OUTPUT)
Dann setzt du einen Timer auf, der eine Funktion aufruft, wenn er abgelaufen ist.
Hier das mal im Zusammenhang
Wenn du diesen Code z.B. mit dofile geladen hast, wird deine LED im Takt des Timers blinken. Auf der Konsole hast du wieder den Lua-Prompt. Mit den Funktionen aus dem Timer-Modul könntest du jetzt interaktiv die Tickerzeit verändern oder den Timer auch abschalten. Statt das interaktiv zu tun, könnte das natürlich auch im Callback beim Empfang eines W-Lan Paketes passieren.Code:LED_PIN = 2 gpio.mode(LED_PIN, gpio.OUTPUT) ticker = tmr.create() ticker:register(1000, tmr.ALARM_AUTO, function () if(gpio.read(LED_PIN) then gpio.write(LED_PIN. 0) else gpio.write(LED_PIN, 1) end end) ticker:start()
Ich hab zwar einen ESP hier an meinem Rechner, aber keinen freien IO mit LED. Der Code ist also nicht getestet.
MfG Klebwax
PS: in lua wird ein einzeiliger Kommentar mit "--" aufgemacht, ein mehrzeiliger startet mit "--[[" und endet mit "--]]". "//" gehört nicht in lua-Code
Lesezeichen