
Um artigo sobre como criar um controlador lógico programável a partir de um dispositivo chinês barato. Esse dispositivo encontrará sua aplicação tanto na automação residencial quanto como uma lição prática em ciência da computação nas escolas.
Para referência, por padrão, o programa Sonoff Basic funciona com o aplicativo móvel através do serviço de nuvem chinês. Após a alteração proposta, todas as outras interações com esse dispositivo serão possíveis no navegador.Seção I. Conectando Sonoff ao MGT24
Etapa 1. Crie um painel de controle
Registre-se no site
mgt24 (se você ainda não se cadastrou) e faça login com sua conta.
Para criar um painel de controle para um novo dispositivo, clique no botão "+".
Exemplo de criação de painel Após a criação do painel, ele aparecerá na lista de seus painéis.
Na guia “Setup” do painel criado, localize os campos “Device ID” e “Authorization Key”. No futuro, essas informações serão necessárias ao configurar o dispositivo Sonoff.
Etapa 2. Piscando o dispositivo
Usando o utilitário
XTCOM_UTIL, faça o download do
firmware do
Sonoff Basic PLC para o dispositivo. Para isso, é necessário um conversor USB-TTL. Aqui estão as
instruções e
instruções em vídeo .
Etapa 3. Configure o dispositivo
Aplique energia ao dispositivo, depois que o LED acender, pressione o botão e mantenha-o pressionado até que o LED comece a piscar periodicamente uniformemente.
Neste ponto, uma nova rede wi-fi chamada “PLC Sonoff Basic” aparecerá, conecte seu computador a esta rede.
Decodificação LED indicação Abra um navegador da Internet e digite o texto "192.168.4.1" na barra de endereços, vá para a página de configurações de rede do dispositivo.
Preencha os campos da seguinte maneira:
- “Nome da rede” e “Senha” (para vincular o dispositivo ao seu roteador wi-fi doméstico).
- “Device ID” e “Authorization Key” (para autorizar o dispositivo no serviço MGT24).
Exemplo de configuração de parâmetros de rede do dispositivo Salve as configurações e reinicie o dispositivo.
Aqui está um
tutorial em vídeo .
Etapa 4. Conectando sensores (opcional)
O firmware atual suporta até quatro sensores de temperatura ds18b20. Aqui está um
tutorial em
vídeo sobre montagem de sensores. Aparentemente, este passo será o mais difícil, pois exigirá mãos diretas e um ferro de soldar.
Seção II Programação visual
Etapa 1. Script
Blockly é usado como ambiente de programação, o ambiente é fácil de aprender, portanto você não precisa ser um programador para criar scripts simples.
Adicionei blocos especializados para escrever e ler parâmetros do dispositivo. O acesso a qualquer parâmetro é realizado pelo nome. Os nomes dos compostos são usados para os parâmetros do dispositivo remoto: "parameter @ device".
Um exemplo de cenário de ativação e desativação cíclica da carga (1Hz):

Um cenário de exemplo que sincroniza a operação de dois dispositivos separados. Ou seja, o relé do dispositivo de destino repete a operação do relé do dispositivo remoto.

Cenário para termostato (sem histerese):

Para criar scripts mais complexos, você pode usar variáveis, loops, funções (com argumentos) e outras construções. Não vou descrever tudo isso em detalhes aqui, a rede já possui bastante
material de
treinamento sobre Blockly .
Etapa 2. Ordem de Script
O script é executado continuamente e, assim que chega ao fim, começa novamente. Existem dois blocos que podem suspender temporariamente o script, "atraso" e "pausa".
O bloco de atraso é usado para atrasos de milissegundos ou microssegundos. Esta unidade mantém rigorosamente o intervalo de tempo, bloqueando a operação de todo o dispositivo.
O bloco de pausa é usado para segundos (talvez menos) atrasos e não impede a execução de outros processos no dispositivo.
Se o script em si contiver um loop infinito, no corpo do qual não há "pausa", o intérprete inicia independentemente uma pequena pausa.
Se a pilha de memória alocada estiver esgotada, o intérprete interromperá a execução de um script tão voraz (tenha cuidado com as funções recursivas).
Etapa 3. Depurando scripts
Para depurar um script já carregado no dispositivo, você pode executar o rastreamento do programa em etapas. Isso pode ser extremamente útil quando o comportamento do script não é o que o autor pretendia. Nesse caso, o rastreamento permite que o autor encontre rapidamente a origem do problema e corrija o erro no script.
O script para calcular o fatorial no modo de depuração:

A ferramenta de depuração é muito simples e consiste em três botões principais: “iniciar”, “um passo à frente” e “parar” (também não esqueceremos “entrar” e “sair” do modo de depuração). Além do rastreamento passo a passo, você pode definir um ponto de interrupção em qualquer bloco (clicando no bloco).
Para exibir os valores atuais dos parâmetros (sensores, relés) no monitor, use o bloco de impressão.
Aqui está um
vídeo de visão geral sobre o uso do depurador.
Seção para os curiosos. Mas o que há sob o capô?
Para que os scripts funcionassem no dispositivo de destino, um interpretador de bytecode e um assembler para 38 instruções foram desenvolvidos. Um gerador de código especializado foi incorporado ao código-fonte em bloco que converte blocos visuais em instruções do assembler. No futuro, esse programa assembler é convertido em bytecode e transferido para o dispositivo para execução.
A arquitetura desta máquina virtual é bastante simples e não faz muito sentido descrevê-la; na rede, você encontrará muitos artigos sobre o design de máquinas virtuais simples.
Para a pilha da minha máquina virtual, geralmente aloco 1000 bytes, isso é suficiente com uma margem. Obviamente, recursões profundas podem esgotar qualquer pilha, mas é improvável que encontrem aplicação prática.
O bytecode resultante é bastante compacto. Como exemplo, o bytecode para calcular o mesmo fatorial é de apenas 49 bytes. Esta é a sua apresentação visual:

E este é o seu programa de montagem:
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
Se a forma de representação do assembler não tiver nenhum valor prático, a guia javascrit, pelo contrário, dará uma aparência mais familiar do que os blocos visuais:
function factorial(num) { if (num > 1) { return num * factorial(num - 1); } return 1; } window.alert(factorial(10));
Quanto ao desempenho. Quando iniciei o cenário mais simples do pisca-pisca, na tela do osciloscópio, recebi um meandro de 47kHz (a uma velocidade de clock de 80MHz).


Acho que esse é um bom resultado, pelo menos essa velocidade é quase dez vezes mais rápida que a de
Lua e
Espruino .
A parte final
Para resumir, direi que o uso de scripts nos permite não apenas programar a lógica de um dispositivo individual, mas também possibilita vincular vários dispositivos em um único mecanismo, onde alguns dispositivos influenciam o comportamento de outros.
Também observo que o método escolhido para armazenar scripts (diretamente nos próprios dispositivos e não no servidor) simplifica a troca de dispositivos existentes para outro servidor, por exemplo, para o Raspberry doméstico, aqui está a
instrução .
É tudo, ficarei feliz em ouvir conselhos e críticas construtivas.