Zuletzt angesehen: luacontroller

Mod-Übersicht: Lua-Controller (mesecons)

Beschreibung

Luanti-Figur steht auf Druckplatte, die mit einem Lua-Controller verbunden ist und auf einem Monitor anzeigt, wie oft die Platte betätigt wurde.
Setze den Lua-Controller ein, um deinen Bauwerken und Ideen mehr Interaktivität zu verleihen.

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 Mesecons-Blöcken, mit Digilines und mit Pipeworks kombinieren, um komplexe Geräte oder automatische Farmen und Fabriken umzusetzen.

Verwendung

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 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.

Lua-Controller mit zwei daran angeschlossenen, leuchtenden Meseconleuchtsteinen.

Das nachfolgende Beispiel zeigt einen Lua-Controller, der der zwei Meseleuchtsteine anschaltet.

port.a = true
port.c = true

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.
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.

if pin.d == true then
  port.c = true
end

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.

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.

if pin.a == true and pin.d == true then
  port.c = true
end

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.

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.

if pin.d == true then
  port.c = true
else
  port.c = false
end

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.

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, …

port.c = not pin.c
interrupt(1)

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“).

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.

if event.type == "digiline" and event.msg == "an" then
  port.c = true
else
  port.c = false
end

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 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.

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.

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

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: 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.

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).

if event.type == "digiline" and event.msg == "passwort" then
  port.b = true
else
  port.b = false
end


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!

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).

if event.type == "digiline" and event.channel == "camera" then
    if #event.msg == 1 then
      digiline_send("display", "Hallo " .. event.msg[1])
    end
end

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!