
Ein Artikel darĂŒber, wie man eine speicherprogrammierbare Steuerung aus einem billigen chinesischen GerĂ€t erstellt. Ein solches GerĂ€t findet seine Anwendung sowohl in der Hausautomation als auch als praktische Lektion in der Schulinformatik.
Als Referenz arbeitet das Sonoff Basic-Programm standardmĂ€Ăig mit der mobilen Anwendung ĂŒber den chinesischen Cloud-Dienst. Nach der vorgeschlagenen Ănderung wird jede weitere Interaktion mit diesem GerĂ€t im Browser möglich.Abschnitt I. AnschlieĂen von Sonoff an MGT24
Schritt 1. Erstellen Sie ein Control Panel
Registrieren Sie sich auf der
mgt24- Website (falls Sie sich noch nicht registriert haben) und melden Sie sich unter Ihrem Konto an.
Klicken Sie auf die SchaltflĂ€che "+", um ein Bedienfeld fĂŒr ein neues GerĂ€t zu erstellen.
Beispiel fĂŒr die Panel-Erstellung Nachdem das Panel erstellt wurde, wird es in der Liste Ihrer Panels angezeigt.
Suchen Sie auf der Registerkarte "Setup" des erstellten Bedienfelds die Felder "GerĂ€te-ID" und "AutorisierungsschlĂŒssel". Diese Informationen werden in Zukunft beim Einrichten des Sonoff-GerĂ€ts benötigt.
Schritt 2. Flashen des GerÀts
Laden Sie mit dem Dienstprogramm
XTCOM_UTIL die
Sonoff Basic PLC- Firmware auf das GerÀt herunter.
Dazu benötigen Sie einen USB-TTL-Konverter. Hier ist die
Anweisung und
Videoanweisung .
Schritt 3. Konfigurieren Sie das GerÀt
Schalten Sie das GerĂ€t ein, nachdem die LED aufleuchtet, drĂŒcken Sie die Taste und halten Sie sie gedrĂŒckt, bis die LED regelmĂ€Ăig gleichmĂ€Ăig zu blinken beginnt.
Zu diesem Zeitpunkt wird ein neues WLAN-Netzwerk mit dem Namen "PLC Sonoff Basic" angezeigt. Verbinden Sie Ihren Computer mit diesem Netzwerk.
Ăffnen Sie einen Internetbrowser und geben Sie den Text "192.168.4.1" in die Adressleiste ein. Gehen Sie zur Seite mit den Netzwerkeinstellungen des GerĂ€ts.
FĂŒllen Sie die Felder wie folgt aus:
- "Netzwerkname" und "Passwort" (um das GerÀt an Ihren WLAN-Heimrouter zu binden).
- "GerĂ€te-ID" und "AutorisierungsschlĂŒssel" (um das GerĂ€t fĂŒr den MGT24-Dienst zu autorisieren).
Beispiel fĂŒr die Einstellung von GerĂ€tenetzwerkparametern Speichern Sie die Einstellungen und starten Sie das GerĂ€t neu.
Hier ist ein
Video-Tutorial .
Schritt 4. Sensoren anschlieĂen (optional)
Die aktuelle Firmware unterstĂŒtzt bis zu vier ds18b20-Temperatursensoren. Hier ist ein
Video-Tutorial zur Montage von Sensoren. Anscheinend wird dieser Schritt der schwierigste sein, da direkte HÀnde und ein Lötkolben erforderlich sind.
Abschnitt II. Visuelle Programmierung
Schritt 1. Skripterstellung
Blockly wird als Programmierumgebung verwendet. Die Umgebung ist leicht zu erlernen, sodass Sie kein Programmierer sein mĂŒssen, um einfache Skripte zu erstellen.
Ich habe spezielle Blöcke zum Schreiben und Lesen von GerĂ€teparametern hinzugefĂŒgt. Der Zugriff auf einen beliebigen Parameter erfolgt ĂŒber den Namen. Zusammengesetzte Namen werden fĂŒr Remote-GerĂ€teparameter verwendet: "parameter @ device".
Dropdown-Liste der Optionen Ein Beispiel fĂŒr ein Szenario des zyklischen Ein- und Ausschaltens der Last (1 Hz):

Ein Beispielszenario, das den Betrieb von zwei separaten GerÀten synchronisiert. Das Relais des ZielgerÀts wiederholt nÀmlich den Betrieb des Relais des entfernten GerÀts.

Szenario fĂŒr Thermostat (ohne Hysterese):

Um komplexere Skripte zu erstellen, können Sie Variablen, Schleifen, Funktionen (mit Argumenten) und andere Konstrukte verwenden. Ich werde das alles hier nicht im Detail beschreiben, das Netzwerk hat bereits ziemlich viel
Schulungsmaterial ĂŒber Blockly .
Schritt 2. Skriptreihenfolge
Das Skript wird kontinuierlich ausgefĂŒhrt und sobald es sein Ende erreicht hat, wird es erneut gestartet. Es gibt zwei Blöcke, mit denen das Skript vorĂŒbergehend angehalten werden kann: "Verzögerung" und "Pause".
Der Verzögerungsblock wird fĂŒr Millisekunden- oder Mikrosekundenverzögerungen verwendet. Dieses GerĂ€t hĂ€lt das Zeitintervall strikt ein und blockiert den Betrieb des gesamten GerĂ€ts.
Der Pausenblock wird fĂŒr zweite (möglicherweise weniger) Verzögerungen verwendet und blockiert nicht die AusfĂŒhrung anderer Prozesse im GerĂ€t.
Wenn das Skript in sich eine Endlosschleife enthĂ€lt, in deren Hauptteil keine âPauseâ vorhanden ist, leitet der Interpreter unabhĂ€ngig eine kleine Pause ein.
Wenn der zugewiesene Speicherstapel erschöpft ist, stoppt der Interpreter die AusfĂŒhrung eines solchen unersĂ€ttlichen Skripts (seien Sie vorsichtig mit rekursiven Funktionen).
Schritt 3. Debuggen von Skripten
Um ein bereits in das GerĂ€t geladenes Skript zu debuggen, können Sie die Programmablaufverfolgung schrittweise ausfĂŒhren. Dies kann Ă€uĂerst nĂŒtzlich sein, wenn das Verhalten des Skripts nicht dem vom Autor beabsichtigten entspricht. In diesem Fall kann der Autor mithilfe der Ablaufverfolgung schnell die Ursache des Problems finden und den Fehler im Skript beheben.
Das Skript zur Berechnung der FakultÀt im Debug-Modus:

Das Debugging-Tool ist sehr einfach und besteht aus drei HauptschaltflĂ€chen: "Start", "Ein Schritt vorwĂ€rts" und "Stopp" (wir werden auch nicht vergessen, den Debugging-Modus zu betreten und zu verlassen). ZusĂ€tzlich zur schrittweisen Ablaufverfolgung können Sie fĂŒr jeden Block einen Haltepunkt festlegen (indem Sie auf den Block klicken).
Verwenden Sie den Druckblock, um die aktuellen Werte der Parameter (Sensoren, Relais) im Monitor anzuzeigen.
Hier ist ein
Ăbersichtsvideo zur Verwendung des Debuggers.
Abschnitt fĂŒr Neugierige. Aber was ist unter der Haube?
Damit die Skripte auf dem ZielgerĂ€t funktionieren, wurden ein Bytecode-Interpreter und ein Assembler fĂŒr 38 Anweisungen entwickelt. In den blockartigen Quellcode wurde ein spezieller Codegenerator integriert, der visuelle Blöcke in Assembler-Anweisungen konvertiert. In Zukunft wird dieses Assembler-Programm in Bytecode konvertiert und zur AusfĂŒhrung auf das GerĂ€t ĂŒbertragen.
Die Architektur dieser virtuellen Maschine ist recht einfach und es macht keinen Sinn, sie zu beschreiben. Im Internet finden Sie viele Artikel zum Design einfacher virtueller Maschinen.
FĂŒr den Stapel meiner virtuellen Maschine ordne ich normalerweise 1000 Bytes zu, dies reicht mit einem Rand aus. NatĂŒrlich können tiefe Rekursionen jeden Stapel erschöpfen, aber es ist unwahrscheinlich, dass sie eine praktische Anwendung finden.
Der resultierende Bytecode ist ziemlich kompakt. Beispielsweise betrÀgt der Bytecode zur Berechnung derselben FakultÀt nur 49 Bytes. Dies ist seine visuelle PrÀsentation:

Und das ist sein Assembler-Programm:
shift -1 ldi 10 call factorial, 1 print exit :factorial ld_arg 0 ldi 1 gt je 8 ld_arg 0 ld_arg 0 ldi 1 sub call factorial, 1 mul ret ldi 1 ret
Wenn das Assembler-Darstellungsformular keinen praktischen Wert hat, sieht die Registerkarte "Javascrit" im Gegensatz dazu vertrauter aus als visuelle Blöcke:
function factorial(num) { if (num > 1) { return num * factorial(num - 1); } return 1; } window.alert(factorial(10));
Was die Leistung betrifft. Als ich das einfachste Blinkerszenario startete, bekam ich auf dem Oszilloskopbildschirm einen 47-kHz-MĂ€ander (bei einer Prozessortaktrate von 80 MHz).


Ich denke, das ist ein gutes Ergebnis, zumindest ist diese Geschwindigkeit fast zehnmal schneller als die von
Lua und
Espruino .
Der letzte Teil
Zusammenfassend möchte ich sagen, dass wir durch die Verwendung von Skripten nicht nur die Logik eines einzelnen GerÀts programmieren können, sondern auch mehrere GerÀte zu einem einzigen Mechanismus verbinden können, wobei einige GerÀte das Verhalten anderer beeinflussen.
Ich stelle auch fest, dass die gewÀhlte Methode zum Speichern von Skripten (direkt auf den GerÀten selbst und nicht auf dem Server) das Umschalten vorhandener GerÀte auf einen anderen Server vereinfacht, z. B. auf die Home-Himbeere. Hier ist die
Anweisung .
Das ist alles, ich freue mich ĂŒber RatschlĂ€ge und konstruktive Kritik.