Escrever algoritmos é provavelmente a parte mais interessante para mim em automação residencial. Mas mesmo toda a massa de sensores e scripts não consegue lidar com a exuberante fantasia da vida e você precisa adicionar uma maneira de controlar diretamente. Como controles manuais, você pode colocar uma campainha comum, mas e se você quiser mais? Conhecemos o herói deste artigo - um sensor de gestos baseado no SI1143 da Silicon Labs.
SI1143 em si:

Parece realmente futurista.
E quantas vantagens:
- fotodíodo altamente sensível, ADC de baixo ruído
- Drivers de LED com correntes de 6 a 360 miliamperes
- alimentado de 1,71 a 3,6 volts
- e I2C inteligente - até 3,4 megabits por segundo
Esse é o tamanho de apenas 5 por 3 milímetros. Esta não é a primeira vez que você o vê. Bem, aqui você precisa de um pouco mais de cintas.

Isso pode ser removido? Meu sentimento de beleza perguntou. Tentarei satisfazer o pedido desse hóspede raro em nossa área e ocultar o quadro no edifício, mas, enquanto isso, você poderá aplicar energia e ver o que aconteceu.
Comente para o atencioso. Existem realmente mais alguns detalhes do que o esperado. O nó do projeto Enviriot foi tomado como base. Além do microcontrolador STM32F051, a placa também possui um transceptor de 868 megahertz CC1101 da Texas Instruments e, após preencher o firmware, é suficiente para fornecer energia e o dispositivo se conectará ao servidor MQTT-SN.
O princípio de operação é baseado na medição do nível do sinal refletido de cada um dos 3 LEDs. Vou tentar ativá-lo e analisar a resposta.

Devido ao arranjo assimétrico dos LEDs, o sinal do LED 1 é visivelmente maior e os resultados da medição deverão ser normalizados primeiro.

E assim a dependência já é bastante compreensível. Vou tentar codificar o seguinte algoritmo:
Onde L1 + - o sinal do LED 1 aumenta, L1> L3 - o sinal do LED 1 é maior que o sinal do LED 3.
Era bom no papel, mas na dinâmica os problemas começaram. Para uma folha de papel branco fixada na mesma altura, os resultados esperados foram obtidos em dois casos em três. Quando tento acenar com as mãos, o sinal começa a pular e meu maravilhoso algoritmo começou a ficar confuso nas leituras. Ele olhou para a mão, mas há muitas diferenças em relação a uma folha plana de papel branco. Mas de alguma forma deveria funcionar. Ok. Persuadido! Vou tentar ler a documentação.
Para os aflitos, a Silicon Labs lançou o AppNote AN580 - “SENSOR DE GESTO INFRAVERMELHO”. Dois métodos básicos para determinar gestos e suas possíveis combinações são descritos. O primeiro método é determinar a posição em cada momento no tempo e determinar os gestos com base nas coordenadas. O segundo método determina a mudança de fase entre os sinais. Uma das variantes do primeiro método já foi testada e não foi impressionante. Vou tentar implementar o segundo.
Vamos lá É necessário implementar até dois pontos. Determine o momento da entrada e transfira esses dados para a máquina de estado. O limiar de entrada foi determinado experimentalmente em 1/8 do sinal total. Para proteger contra ruídos, adicionarei o gatilho de Schmidt, ligando 15% e desligando 10%.
Bem, a própria máquina de estado. Estados 1 a 3 - movimento ascendente, estados -1 a -3 - movimento descendente e estado 4 para o evento improvável de que os dois LEDs funcionem simultaneamente.

Agora vamos tentar decolar com tudo isso.
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){
As variáveis n1 e n3 contêm valores normalizados para os LEDs correspondentes. O resultado está no campo do botão.
Para uso posterior, os estados 2 - para cima e -2 - para baixo são úteis.
O programa é escrito em um subconjunto de JavaScript, depois compilado no código de bytes e carregado no dispositivo. O JavaScript é analisado e o AST é gerado pela biblioteca NiL.JS do camarada
IaIojek , pelo qual muitos
agradecimentos a ele.

Se o estado 2 dura menos de 0,3 segundos, os blocos A14 e A15 são responsáveis por isso, o brilho é definido no máximo. Os blocos A01 e A13 ajustam o brilho para 0 para um breve movimento descendente.
Ao subir e segurar, os blocos A10, A09 e A04 fornecem um aumento suave do brilho. Ao descer e segurar, os blocos A12, A11 e A08 funcionam e permitem reduzir o nível.
Demonstração de trabalho. GIF de 20 megabytes. Bem, talvez seja só isso. O cliente está feliz e estou começando a pensar na próxima versão. Das alterações necessárias: coloque os LEDs à mesma distância do receptor, exiba a indicação de operação e faça uma pesquisa em um controlador separado, o que reduzirá o intervalo de pesquisa.