Das Schreiben von Algorithmen ist wahrscheinlich der interessanteste Teil für mich in der Heimautomation. Aber selbst die ganze Masse an Sensoren und Skripten kann die überbordende Fantasie des Lebens nicht bewältigen und Sie müssen einen Weg finden, um die Kontrolle zu lenken. Als manuelle Steuerung können Sie eine gewöhnliche Türklingel einsetzen, aber was ist, wenn Sie mehr wollen? Wir treffen den Helden dieses Artikels - einen Gesten-Sensor, der auf SI1143 von Silicon Labs basiert.
SI1143 selbst:

Es sieht wirklich futuristisch aus.
Und wie viele Vorteile:
- hochempfindliche Fotodiode, rauscharmer ADC
- LED-Treiber mit Strömen von 6 bis 360 Milliampere
- Stromversorgung von 1,71 bis 3,6 Volt
- und Smart I2C - bis zu 3,4 Megabit pro Sekunde
Das ist nur die Größe, die nur 5 mal 3 Millimeter hochgepumpt wird. Dies ist nicht das erste Mal, dass Sie es sehen. Nun, hier brauchen Sie ein bisschen mehr Riemen.

Kann das entfernt werden? Fragte mich mein Schönheitsgefühl. Dann werde ich versuchen, die Bitte dieses seltenen Gastes in unserer Gegend zu befriedigen und die Tafel im Gebäude zu verstecken, aber in der Zwischenzeit können Sie Strom anlegen und sehen, was passiert ist.
Kommentar für den aufmerksamen. Es gibt wirklich ein paar mehr Details als erwartet. Der Knoten aus dem Enviriot-Projekt wurde als Basis genommen. Neben dem Mikrocontroller STM32F051 verfügt die Karte auch über einen 868-Megahertz-CC1101-Transceiver von Texas Instruments. Nach dem Ausfüllen der Firmware reicht die Stromversorgung aus, und das Gerät wird mit dem MQTT-SN-Server verbunden.
Das Funktionsprinzip basiert auf der Messung des Pegels des reflektierten Signals von jeder der 3 LEDs. Ich werde versuchen, es einzuschalten und mir die Antwort anzusehen.

Aufgrund der asymmetrischen Anordnung der LEDs ist das Signal von LED 1 deutlich größer und die Messergebnisse müssen erst normalisiert werden.

Und so ist die Abhängigkeit schon ganz verständlich. Ich werde versuchen, den folgenden Algorithmus zu codieren:
Wenn L1 + - das Signal von LED 1 ansteigt, ist L1> L3 - das Signal von LED 1 größer als das Signal von LED 3.
Es war glatt auf dem Papier, aber in der Dynamik begannen Probleme. Für ein weißes Blatt Papier, das auf derselben Höhe fixiert war, wurden die erwarteten Ergebnisse in zwei von drei Fällen erhalten. Wenn ich versuche, mit den Händen zu winken, beginnt das Signal zu springen und mein wunderbarer Algorithmus beginnt, in den Messwerten durcheinander zu kommen. Er sah auf seine Hand, aber es gibt viele Unterschiede zu einem flachen weißen Blatt Papier. Aber irgendwie sollte es funktionieren. Ok Überredet! Ich werde versuchen, die Dokumentation zu lesen.
Für die Betroffenen hat Silicon Labs AppNote AN580 - "INFRARED GESTURE SENSING" veröffentlicht. Es werden zwei grundlegende Methoden zur Bestimmung von Gesten und deren möglichen Kombinationen beschrieben. Die erste Methode ist die Bestimmung der Position zu jedem Zeitpunkt und die Bestimmung von Gesten basierend auf den Koordinaten. Die zweite Methode bestimmt die Phasenverschiebung zwischen den Signalen. Eine der Varianten der ersten Methode wurde bereits getestet und war nicht beeindruckend. Ich werde versuchen, die zweite umzusetzen.
Lass uns gehen. Es müssen bis zu zwei Punkte implementiert werden. Bestimmen Sie den Zeitpunkt der Eingabe und übertragen Sie diese Daten in die Zustandsmaschine. Die Eingangsschwelle wurde experimentell zu 1/8 des Gesamtsignals bestimmt. Zum Schutz vor Lärm werde ich den Schmidt-Trigger hinzufügen, der sich um 15% einschaltet und sich um 10% ausschaltet.
Nun, die Staatsmaschine selbst. Zustände 1 bis 3 - Aufwärtsbewegung, Zustände -1 bis -3 - Abwärtsbewegung und Zustand 4 für den unwahrscheinlichen Fall, dass beide LEDs gleichzeitig arbeiten.

Nun wollen wir versuchen, mit all dem davonzukommen.
var LSt = new Int8Array([-3, -3, -3, 1, 1, 3, 3, 4, -3, -3, -1, -1, 3, 3, 3, 4, -2, -2, -2, 4, 2, 2, 2, 4]); this.r1 = false; this.r3 = false; this.button = new Int8(0); if(n1 > 15) { this.r1 = true; } else if(n1 < 10) { this.r1 = false; } if(n3 > 15) { this.r3 = true; } else if(n3 < 10) { this.r3 = false; } let st = (this.r1?1:0) | (this.r3?2:0); if(st == 0){
Die Variablen n1 und n3 enthalten normierte Werte für die entsprechenden LEDs. Das Ergebnis befindet sich im Feld "Schaltfläche".
Für die weitere Verwendung sind die Zustände 2 - auf und -2 - ab nützlich.
Das Programm wird in eine Teilmenge von JavaScript geschrieben, dann in Bytecode kompiliert und auf das Gerät hochgeladen. JavaScript wird analysiert und der AST wird von der NiL.JS-Bibliothek des Genossen
IaIojek generiert , wofür er sich sehr
bedankt .

Wenn der Zustand 2 kürzer als 0,3 Sekunden dauert, sind die Bausteine A14 und A15 dafür verantwortlich, die Helligkeit wird auf das Maximum gesetzt. Die Blöcke A01 und A13 setzen die Helligkeit für eine kurze Abwärtsbewegung auf 0.
Beim Hochfahren und Halten sorgen die Blöcke A10, A09 und A04 für einen gleichmäßigen Helligkeitsanstieg. Wenn Sie gedrückt halten, arbeiten die Blöcke A12, A11 und A08 und ermöglichen es Ihnen, den Pegel zu verringern.
Demonstration der Arbeit. 20 Megabyte GIF. Nun, vielleicht ist das alles. Der Kunde ist glücklich und ich beginne über die nächste Version nachzudenken. Bei den erforderlichen Änderungen: Platzieren Sie die LEDs im gleichen Abstand zum Empfänger, zeigen Sie die Betriebsanzeige an und führen Sie eine Abfrage auf einem separaten Controller durch, wodurch sich das Abfrageintervall verkürzt.