Diese Seite ist nicht editierbar. Sie können den Quelltext sehen, jedoch nicht verändern. Kontaktieren Sie den Administrator, wenn Sie glauben, dass hier ein Fehler vorliegt. ====== Mod-Übersicht: Lua-Controller (mesecons) ====== ===== Beschreibung ===== <grid cols="33% 33% 33%" rows="16rem"> <box grid-row="1 span 1" grid-col="1 span 1" border-width=1em round=.25em>{{img:mods:luacontroller:luacontroller-thumb.jpg?nolink|Luanti-Figur steht auf Druckplatte, die mit einem Lua-Controller verbunden ist und auf einem Monitor anzeigt, wie oft die Platte betätigt wurde.}}</box> <box grid-row="1 span 1" grid-col="2 span 2" border-width=1em>Setze den Lua-Controller ein, um deinen Bauwerken und Ideen mehr Interaktivität zu verleihen. </box></grid> Der Lua-Controller ist ein Mikrocontroller, mit dem du Türen, Maschinen und Displays steuern kannst und der auf Sensoren reagieren kann. Der Controller lässt sich mit vielen [[mods:mesecons|Mesecons-Blöcken]], mit Digilines und mit [[mods:pipeworks|Pipeworks]] kombinieren, um komplexe Geräte oder automatische Farmen und Fabriken umzusetzen. ===== Verwendung ===== {{:img:mods:luacontroller:luacontroller-inventory.jpg?600|Luanti-Inventar mit hervorgehobenem Lua-Controller auf der rechten Seite.}} Du findest den Lua-Controller im Inventar (Standardtaste: ''i''). Gib den Begriff ''mesecon'' oder ''luacontroller'' in die Suchleiste ein und wähle den Controller durch einen Klick aus. Der Lua-Controller hat vier Anschlussports, die für die Eingabe und für die Ausgabe genutzt werden können. Mit einem direkt neben dem Lua-Controller platzierten [[mods:mesecons|Mesecons-Kabel]] kannst du empfangen, ob dieses gerade an- oder ausgeschaltet wurde und kannst auch selbst das Signal aktivieren oder deaktivieren. Oder platziere ein Digilines-Kabel direkt neben dem Lua-Controller, um Daten zu empfangen oder an andere Geräte zu senden. Mit einem Rechtsklick auf den Lua-Controller öffnest du dessen Programmieroberfläche. So wie die Modifikationen in Luanti wird auch der Lua-Controller in der Skriptsprache Lua programmiert. Lua ist einfach zu erlernen, wird in vielen Produkten und Spielen eingesetzt und hat viele Gemeinsamkeiten mit anderen Programmiersprachen. Um den Programmcode auf dem Lua-Controller auszuführen, klickst du auf den Button ''Execute''. ===== Beispielprogramme ====== ==== Ports am Controller schalten ===== Mit dem Lua-Controller kannst du die vier Ports an den Seiten programmieren und auch ihren jetzigen Zustand auslesen. {{:img:mods:luacontroller:luacontroller-portsschalten.jpg?900|Lua-Controller mit zwei daran angeschlossenen, leuchtenden Meseconleuchtsteinen.}} Das nachfolgende Beispiel zeigt einen Lua-Controller, der der zwei Meseleuchtsteine anschaltet. <code lua> port.a = true port.c = true </code> Zuerst wird der Ausgang A (''port.a'') aktiviert (Zeile 1). Das geschieht mit einem Gleichheitszeichen und einem Wahrheitswert, auch Boolean genannt: ''true'' Dann wird der Ausgang C (''port.c'') aktiviert (Zeile 2). Der Befehl wird gleich geschrieben, nur wird "A" durch "C" ersetzt, um den Ausgang C zu aktivieren. ==== Bedingungen ===== Um die Meseleuchtsteine in Abhängigkeit von einem Zustand zu schalten, nutzen wir Bedingungen. {{:img:mods:luacontroller:luacontroller-bedingungen.jpg?900|Lua-Controller mit daran angeschlossener Druckplatte und Meseconleuchtstein.}} Das nachfolgende Beispiel zeigt einen Lua-Controller, der mit einer Druckplatte als Auslöser und einem grünen Meseleuchtstein als Signal verbunden ist. Wenn du den Programmcode in den Lua-Controller einträgst und auf "Execute" drückst, wird der grüne Meseleuchtstein aktiviert, sobald sich jemand auf die Druckplatte stellt. <code lua> if pin.d == true then port.c = true end </code> Eingänge, die ausgelesen werden, heissen im Controller immer ''pin'', Ausgänge, die geschaltet werden immer ''port''. Um den Zustand des Eingang herauszufinden, wird eine if-Bedingung verwendet (Zeile 1). Sie überprüft, ob eine gewisse Aussage wahr ist. Um Eingänge abzufragen, wird Pin anstatt von Port geschrieben. Außerdem setzen wir den Zustand nicht mit einem Gleichheitszeichen, sondern möchten wissen, ob er einem gewissen Zustand entspricht. Das passiert mit zwei Gleichheitszeichen. Wenn das zutrifft, dann wird der eingerückte Befehl ausgeführt: Port C wird aktiviert (Zeile 2). Das Wort ''end'' zeigt dem Lua-Controller, wo die Bedingung aufhört (Zeile 3). ==== Logik und Bedingungen verwenden ===== Du kannst mehrere Zustände kombinieren, um die Ausgänge zu steuern. {{:img:mods:luacontroller:luacontroller-logik-bedingungen.jpg?900|Lua-Controller mit zwei Permanentschaltern und einem leuchtenden Meseconleuchtstein.}} Im nachfolgenden Beispiel aktiviert der Lua-Controller das lilafarbene Licht nur, wenn die Eingänge A und D gleichzeitig aktiviert sind. <code lua> if pin.a == true and pin.d == true then port.c = true end </code> Dazu wird wieder eine ''if''-Bedingung verwendet. Nun fragt sie aber gleichzeitig nach zwei einzelnen Zuständen, nämlich ob Pin A und Pin D aktiviert sind. Nur dann wird der Befehl in der Zeile 2 ausgeführt. Die Verknüpfung der beiden Fragen erfolgt mit einem ''and'' (Zeile 1). Um logische Verknüpfungen zu nutzen, kannst du die Wörte ''and'', ''or'' und ''not'' verwenden. Es ist auch möglich mit Hilfe von Gleichheitszeichen Gleichheit (''=='') oder Ungleichheit (''~='') abzufragen. Verwende Klammern, um bestimmte Abfragen zu einem Wahrheitswert zu kombinieren. ==== Verzweigte Bedingungen ===== Um nicht nur nach einem Zustand zu fragen, sondern zwischen mehreren Zuständen wechseln zu können, kannst du verzweigte Bedingungen einsetzen. {{:img:mods:luacontroller:luacontroller-verzweigte-bedingungen.jpg?900|Lua-Controller mit ausgeschaltetem Meseconleuchtstein, da niemand auf der daran angeschlossenen Druckplatte steht.}} Das nachfolgende Beispiel zeigt einen Lua-Controller, der mit einer Druckplatte als Auslöser und einem grünen Meseleuchtstein als Signal verbunden ist. Der grüne Leuchtstein wird durch Drücken der Platte aktiviert und schaltet sich wieder aus, wenn niemand auf der Platte steht. <code lua> if pin.d == true then port.c = true else port.c = false end </code> Mit Hilfe der ''if...then''-Bedingung entscheidet der Controller mit Hilfe von zwei Gleichheitszeichen, ob Pin D angeschaltet ist (Zeile 1 im Code): Wenn ja, dann wird Port C durch eine Zuweisung mit einem Gleichheitszeichen aktiviert (Zeile 2). Wenn Pin D nicht aktiv ist (Zeile 3), dann wird Port C mit einem Gleichheitszeichen deaktiviert (Zeile 4). Damit der Controller weiß, wo diese Schleife endet, kommt das ''end''-Wort (Zeile 5). Alle Zeilen, die zeigen, was passiert, wenn eine Bedingung zutrifft, werden mit zwei Leerzeichen eingerückt. ==== Wiederholungen und Timer verwenden (Interrupts) ===== Um wiederholt Befehle im Lua-Controller auszuführen, kannst du Interrupts einsetzen. Sie starten den Controller nach eine bestimmten Zeit neu und können optional ein Signal übergeben, mit dem du steuern kannst, welcher Programmteil des Controllers neugestarten werden soll. {{:img:mods:luacontroller:luacontroller-interrupts.jpg?900|Lua-Controller mit daran angeschlossenem Meseconleuchtstein.}} Das nachfolgende Beispiel lässt den am Lua-Controller angebrachten orangefarbenen Meseleuchtstein jede Sekunde den Zustand wechseln: An, Aus, An, Aus, ... <code lua> port.c = not pin.c interrupt(1) </code> Am Anfang setzt der Controller den Ausgang C (''port.c'') auf den Zustand, den der Eingang C (''pin.c'') gerade nicht hat: Aus ''true'' wird ''false'' und andersherum (Zeile 1). Danach wird ein Interrupt aktiviert, der eine Sekunde wartet und den Controller dann neustartet (Zeile 2). Der Code beginnt von neuem und der Controller invertiert den Zustand des Leuchtsteins. Die Zahl 1 in den Klammern hinter ''interrupt'' gibt an, wie lange gewartet werden soll, bevor der Interrupt entsteht. Dieser Wert wird in Sekunden angegeben und kann auch eine Kommazahl sein, zum Beispiel ''0.3'' für 0,3 Sekunden. Verwende den Befehl ''interrupt(1, "Eventname")'', um optional einen Namen zu übergeben, um den Programmablauf beim nächsten Start zu verändern. ==== Auf Ereignisse reagieren (Events) ===== Der Lua-Controller kann auch Befehle ausführen, wenn ein externes Ereignis eintritt. Du kannst abfragen, ob ein Mesecons-Signal aktiviert (''event.type == "on"'') oder deaktiviert (''event.type == "off"'')wurde, ob der Lua-Controller gerade programmiert wurde (''event.type == "program"''), ob ein Interrupt kam (''event.type == "interrupt"'') oder ob ein Digilines-Signal empfangen wurde (''event.type == "digiline"''). {{:img:mods:luacontroller:luacontroller-events.jpg?900|Lua-Controller mit daran angeschlossenem Meseconleuchtstein und Tastatur, die mit Digilines-Kabel verbunden ist.}} Das nachfolgende Beispiel zeigt einen Lua-Controller, der so eingestellt wurde, dass er den blaufarbenen Meseleuchtstein aktiviert, sobald über eine angeschlossene Tastatur das Wort "an" gesendet wurde. <code lua> if event.type == "digiline" and event.msg == "an" then port.c = true else port.c = false end </code> Zuerst wird mit einer Bedingung überprüft, ob das Ereignis ein Digilines-Ereignis ist und ob die damit verknüpfte Nachricht ''an'' lautet (Zeile 1). Falls ja, dann wird der Ausgang C (''port.c'') aktiviert (Zeile 2). Falls nicht (Zeile 3): Dann wird der Ausgang C (''port.c'') ausgeschaltet (Zeile 4). Das Wort ''end'' signalisiert, dass die Bedingung zu Ende ist (Zeile 5). Das Kapitel 5 der [[https://mesecons.net/luacontroller|Onlinedokumentation der Mesecons]] gibt mehr Informationen über die Events und ihre teilweise mitgelieferten Zusatzinformationen wie zum Beispiel ''event.msg''. ==== Variablen und Speicher nutzen ===== Der Lua-Controller kann mit Hilfe von Variablen Werte zwischenspeichern. Mit Hilfe seines Speichers kann der Lua-Controller auch dauerhaft (bis zur Neuprogrammierung oder wenn der Controller abgebaut wird) Dinge speichern. {{:img:mods:luacontroller:luacontroller-variablen-speicher.jpg?900|Lua-Controller mit angeschlossenem Monitor, auf dem die Betätigungen der angeschlossenen Druckplatte gezählt werden.}} Im nachfolgenden Beispiel wird gespeichert, wie oft die an den Controller angebaut Druckplatte betätigt wurde. Das Ergebnis wird auf einem angeschlossenen Monitor angezeigt. <code lua> if event.type == "program" then mem.count = 0 end if event.type == "on" then mem.count = mem.count + 1 local text = tostring(mem.count) .. " Betätigungen" digiline_send("display", text) end </code> Zuerst wird mit Hilfe einer Bedingung überprüft, ob der Lua-Controller gerade programmiert wurde (Zeile 1). In diesem Fall wird der Speicher von ''count'' auf Null gesetzt. ''mem'' ist ein besonderes Objekt, mit dem du Daten auf dem Lua-Controller speichern kannst. Das Wort ''end'' zeigt an, dass die Bedingung hier zu Ende ist (Zeile 3). Als nächstes wartet der Controller mit einer Bedingung darauf, dass ein Mesecons-Signal ankommt (Zeile 5). In diesem Fall wird der Wert von ''mem.count'' um Eins erhöht und wieder in ''mem.count'' gespeichert. Aus 1 wird 2, aus 2 wird 3, usw. (Zeile 6). Als nächstes wird mit einer Variable der Zahlenwer der Variable ''mem.count'' mit der Funktion ''tostring'' in einen oder mehrere Buchstaben verwandelt. Mit Hilfe der zwei Punkte wird diese Anzahl mit dem Wort '' Betätigungen'' verbunden und in die Variable ''text'' gespeichert (Zeile 7). Nun wird eine Nachricht über die Digilines gesendet, die den Kanal ''display'' benutzt und als Inhalt den Inhalt der Variable ''text'' enthält (Zeile 8). Das Wort ''end'' zeigt an, dass die Bedingung hier zu Ende ist (Zeile 9). Beachte, dass die Funktion ''digiline_send'' keine Angabe des Ports benötigt, da Digilines auf allen Ausgängen gesendet werden. Hier werden Kanäle genutzt, um das richtige Gerät zu finden. ==== Überhitzung ===== Wenn ein Lua-Controller zu viele Befehle in zu kurzer Zeit ausführt oder der Speicher voll ist, dann überhitzt er, was du an einem rot glühenden Controller erkennen kannst. In diesem Fall muss der Programmcode neu aktiviert werden. Die Überhitzung ist eine Schutzfunktion für die BLOCKALOT-Spaces. Die Standardlimits für den Controller liegen bei 20 Operationen pro Sekunde beziehungsweise 100 Kilobyte Speicher. ==== Weitere Informationen ===== Ein englisches Tutorial zum Lua-Controller findest du auf der Seite der offiziellen Seite der Mesecons: [[https://mesecons.net/luacontroller|Lua-Controller-Dokumentation]] ==== Beispielmechanismen ==== ==== Passwort-Tür mit Code ===== Nutze den Lua-Controller zusammen mit Mesecons-Kabeln oder -Blöcken, mit einer Tür aus Stahl und mit einer Tastatur, um eine Passwort-Tür zu bauen. {{:img:mods:luacontroller:luacontroller-example-door.jpg?900|Tür mit Passworteingabe und Lua-Controller.}} Im nachfolgenden Beispiel wartet der Controller, ob über die Diglines die Nachricht ''passwort'' eingeht (Zeile 1). Falls ja, aktiviert er den Ausgang B, der mit der Tür verbunden ist (Zeile 2). Falls nicht (Zeile 3), deaktiviert er den Ausgang B, wodurch sich die Tür schliesst (Zeile 4). <code lua> if event.type == "digiline" and event.msg == "passwort" then port.b = true else port.b = false end </code> <alert type="success">**Tipp**: Schütze deine Passwort-Tür mit einem Störschutzblock oder -Logo, damit niemand deinen Mechanismus hacken kann!</alert> <alert type="success">**Tipp**: Nutze Interrupts, um die Tür nach einer bestimmten Zeit wieder zu schließen!</alert> ==== Begrüßung mit Kamera ===== Nutze den Lua-Controller zusammen mit einem Display und mit einer Digilines-Kamera, um Besuchende vor deiner Haustür zu begrüßen! {{:img:mods:luacontroller:luacontroller-example-camera.jpg?900|Aufbau mit Eingang und Lua-Controller, der mit einer Kamera und einem Monitor verbunden ist, auf dem eine Luanti-Figur mit Namen begrüßt wird.}} Im nachfolgenden Beispiel wartet der Lua-Controller, bis ein Digiline-Signal auf dem Kanal ''camera'' eingeht (Zeile 1). Wenn das passiert, dann wird überprüft, ob die Nachricht ''event.msg'' nur ein Element beinhaltet (Zeile 2). Falls ja, dann wird die Nachricht ''Hallo '' zusammen mit dem Namen der Person, die vor der Tür steht, über den Kanal ''display'' an das Display gesendet (Zeile 3). In Zeile 4 wird zuerst die innere Bedingung mit dem Wort ''end'' beendet, dann die Äußere (Zeile 5). <code lua> if event.type == "digiline" and event.channel == "camera" then if #event.msg == 1 then digiline_send("display", "Hallo " .. event.msg[1]) end end </code> <alert type="info">**Variation**: Was, wenn du mehrere Besuchende vor deiner Haustür hast und sie alle begrüßen möchtest? </alert> ===== Beschreibung ===== Lass' dich von den folgenden Beispielanwendungen inspirieren, in denen der Lua-Controller eine praktische Hilfe ist. Welche weiteren Anwendungen fallen dir ein? ==== Gebäude smart machen ===== Nutze den Lua-Controller zusammen mit weiteren Elementen und Sensoren, um dein Haus oder euer Gebäude smarter zu machen. Wie wäre es mit einer automatischen Beleuchtung, die sich nur aktiviert, wenn die richtige Person vor der Tür steht? ==== Lösungen für Nachhaltighaltigkeitsziele gestalten ===== Entwickle Ideen zur Erreichung der 17 Nachhaltigkeitsziele, indem du mit dem Lua-Controller und anderen Blöcken eine smarte Farm oder eine energiesparende Fabrik aufbaust. Oder entwickle einen automatischen Recyclinghof, der dir eine Statistik zu den recycelten Gegenständen auf einem Display anzeigt. ==== Rätselherausforderungen oder Break-in-Szenarien selbst entwickeln ===== Nutze Blöcke wie die Tastatur, das Display oder den Block-Detektor, um eigene Rätsel zu gestalten, die ein Passwort einen einen ganz bestimmten Block benötigen, damit du weiterkommst. Kombiniere diese Mechaniken, um komplexe Rätseldungeons zu bauen!