Allumez la lumière par le pouvoir de la pensée, enfin presque

KDPV

L'écriture d'algorithmes est probablement la partie la plus intéressante pour moi en domotique. Mais même toute la masse des capteurs et des scripts ne peut pas faire face au fantasme exubérant de la vie et vous devez ajouter un moyen de contrôler directement. En tant que commandes manuelles, vous pouvez mettre une sonnette ordinaire, mais que faire si vous en voulez plus? Nous rencontrons le héros de cet article - un capteur gestuel basé sur SI1143 de Silicon Labs.

SI1143 lui-même:

SI1143

Ça a l'air vraiment futuriste.

Et combien d'avantages:

  • photodiode très sensible, ADC à faible bruit
  • Pilotes LED avec des courants de 6 à 360 milliampères
  • alimenté de 1,71 à 3,6 volts
  • et intelligent I2C - jusqu'à 3,4 mégabits par seconde

C'est juste la taille pompée seulement 5 par 3 millimètres. Ce n'est pas la première fois que vous le voyez. Eh bien, ici, vous avez besoin d'un peu plus de sangles.

Périphérique

Cela peut-il être supprimé? Demanda mon sentiment de beauté. Ensuite, j'essaierai de satisfaire la demande de ce rare invité dans notre région et de cacher le tableau dans le bâtiment, mais en attendant, vous pouvez appliquer le pouvoir et voir ce qui s'est passé.
Commentaire pour les attentifs. Il y a vraiment quelques détails de plus que prévu. Le nœud du projet Enviriot a été pris comme base. En plus du microcontrôleur STM32F051, la carte dispose également d'un émetteur-récepteur CC1101 de 868 mégahertz de Texas Instruments et après avoir rempli le firmware, il suffit de fournir de l'énergie et l'appareil se connectera au serveur MQTT-SN.


Le principe de fonctionnement est basé sur la mesure du niveau du signal réfléchi de chacune des 3 LED. Je vais essayer de l'allumer et regarder la réponse.

signal

En raison de la disposition asymétrique des LED, le signal de la LED 1 est sensiblement plus grand et les résultats de mesure devront d'abord être normalisés.

signal_norm

Et donc la dépendance est déjà tout à fait compréhensible. Je vais essayer de coder l'algorithme suivant:
UnBCD
===>
L1 +
L3 +
L1> L3
L1-
L3 +
L1> L3
L1-
L3 +
L1> L3
L1-
L3-
L1 <L3
<===
L1-
L3-
L1 <L3
L1 +
L3-
L1 <L3
L1 +
L3-
L1 <L3
L1 +
L3 +
L1> L3

Lorsque L1 + - le signal de la LED 1 augmente, L1> L3 - le signal de la LED 1 est supérieur au signal de la LED 3.

C'était lisse sur le papier, mais dans la dynamique, les problèmes ont commencé. Pour une feuille de papier blanc fixée à la même hauteur, les résultats attendus ont été obtenus dans deux cas sur trois. Lorsque j'essaie d'agiter mes mains, le signal commence à sauter et mon merveilleux algorithme a commencé à se confondre dans les lectures. Il a regardé sa main, mais il y a beaucoup de différences avec une feuille de papier blanc. Mais d'une manière ou d'une autre, cela devrait fonctionner. D'accord. Persuadé! Je vais essayer de lire la documentation.



Pour les affligés, Silicon Labs a publié AppNote AN580 - «INFRARED GESTURE SENSING». Deux méthodes de base pour déterminer les gestes et leurs combinaisons possibles sont décrites. La première méthode est la détermination de la position à chaque instant dans le temps et la détermination des gestes en fonction des coordonnées. La seconde méthode détermine le déphasage entre les signaux. Une des variantes de la première méthode a déjà été testée et elle n'était pas impressionnante. Je vais essayer de mettre en œuvre le second.

Allons-y. Il est nécessaire de mettre en œuvre jusqu'à deux points. Déterminez le moment de l'entrée et transférez ces données vers la machine d'état. Le seuil d'entrée a été déterminé expérimentalement à 1/8 du signal total. Pour me protéger du bruit, j'ajouterai le déclencheur de Schmidt, allumé de 15% et éteint de 10%.

Eh bien, la machine d'État elle-même. États 1 à 3 - mouvement vers le haut, états -1 à -3 - mouvement vers le bas et état 4 pour le cas improbable où les deux DEL fonctionnent simultanément.

ka

Essayons maintenant de décoller avec tout cela.

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){ // .      this.button = 0; } else { this.button = LSt[st*8 + this.button - 5]; } 

Les variables n1 et n3 contiennent des valeurs normalisées pour les LED correspondantes. Le résultat est dans le champ du bouton.

Pour une utilisation ultérieure, les états 2 - haut et -2 - bas sont utiles.

Le programme est écrit dans un sous-ensemble de JavaScript, puis compilé en bytecode et téléchargé sur l'appareil. JavaScript est analysé et l'AST est généré par la bibliothèque NiL.JS du camarade IaIojek , pour laquelle un grand merci à lui.

Logramm

Si l'état 2 dure moins de 0,3 seconde, les blocs A14 et A15 en sont responsables, la luminosité est réglée au maximum. Les blocs A01 et A13 mettent la luminosité à 0 pour un court mouvement vers le bas.

Lorsque vous vous déplacez vers le haut et le maintenez, les blocs A10, A09 et A04 offrent une augmentation progressive de la luminosité. Lorsque vous descendez et maintenez, les blocs A12, A11 et A08 fonctionnent et vous permettent de réduire le niveau.

Démonstration de travail. 20 mégaoctets GIF.
démo

Eh bien, c'est peut-être tout. Le client est content et je commence à penser à la prochaine version. Parmi les changements nécessaires: placez les LED à la même distance du récepteur, affichez l'indication de fonctionnement et effectuez une interrogation sur un contrôleur séparé, ce qui réduira l'intervalle d'interrogation.

Source: https://habr.com/ru/post/fr477770/


All Articles