
Um artigo sobre como transformar um dispositivo chinês barato em um controlador lógico programável. Este dispositivo pode ser utilizado tanto na automação residencial quanto em aulas práticas de informática escolar.
Para referência, por padrão, o programa Sonoff Basic funciona com um aplicativo móvel através de um serviço em nuvem chinês. Após a modificação proposta, toda interação futura com este dispositivo será possível através do navegador.
Seção I. Conectando o Sonoff ao serviço MGT24
Passo 1. Criando o painel de controle
Registre-se no site (se ainda não estiver registrado) e faça login em sua conta.
Login
Para criar um painel de controle para o novo dispositivo, clique no botão “+”.
Exemplo de criação de painel
Depois que o painel for criado, ele aparecerá na lista dos seus painéis.
Na aba “Instalação” do painel criado, encontre os campos “ID do dispositivo” e “Chave de autorização”, pois essas informações serão necessárias ao configurar o dispositivo Sonoff.
Exemplo de aba
Passo 2. Reprogramando o dispositivo
Com a ferramenta carregue o firmware no dispositivo, para isso você precisará de um conversor USB-TTL. Aqui está e .
Passo 3. Configurando o dispositivo
Forneça energia ao dispositivo; após o LED acender, pressione o botão e mantenha-o pressionado até que o LED comece a piscar uniformemente em intervalos regulares.
Nesse momento, uma nova rede wi-fi chamada “PLC Sonoff Basic” aparecerá; conecte seu computador a essa rede.
Decodificação da indicação LED
Indicação LED
Estado do dispositivo
piscada dupla intermitente
sem conexão com o roteador
acende continuamente
conexão estabelecida com o roteador
piscada uniforme intermitente
modo wi-fi ponto de acesso
apagado
sem energia
Abra o navegador da Internet e digite na barra de endereços o texto “192.168.4.1”; vá para a página de configuração das opções de rede do dispositivo.
Preencha os campos da seguinte forma:
- “Nome da rede” e “Senha” (para vincular o dispositivo ao roteador wi-fi residencial).
- “ID do dispositivo” e “Chave de autorização” (para autorização do dispositivo no serviço MGT24).
Exemplo de configuração das opções de rede do dispositivo
Salve as configurações e reinicie o dispositivo.
Aqui .
Passo 4. Conexão de sensores (opcional)
O firmware atual suporta até quatro sensores de temperatura ds18b20. Aqui está o guia para montagem dos sensores. Aparentemente, este passo será o mais desafiador, pois exigirá suas habilidades manuais e um ferro de solda.
Seção II. Programação visual
Passo 1. Criação de scripts
Como ambiente de programação, é utilizado , um ambiente fácil de aprender, portanto para criar scripts simples não é necessário ser programador.
Eu adicionei blocos especializados para leitura e gravação de parâmetros do dispositivo. O acesso a qualquer parâmetro é feito pelo nome. Para parâmetros de dispositivos remotos, são utilizados nomes compostos: "parâmetro@dispositivo."
Lista suspensa de parâmetros
Exemplo de script de acionamento e desligamento cíclico de carga (1Hz):

Exemplo de script que sincroniza o funcionamento de dois dispositivos separados. Ou seja, o relé do dispositivo-alvo repete a operação do relé do dispositivo remoto.

Script para termostato (sem histerese):

Para criar scripts mais complexos, pode-se usar variáveis, loops, funções (com argumentos) e outras construções. Não vou detalhar tudo aqui, pois já existe bastante .
Passo 2. Ordem de execução dos scripts
O script opera em modo contínuo, e assim que chega ao fim, ele é reiniciado. Existem dois blocos que podem temporariamente pausar a execução do script: "delay" e "pause."
O bloco "delay" é utilizado para atrasos em milissegundos ou microssegundos. Este bloco mantém o intervalo de tempo de forma estrita, bloqueando a operação de todo o dispositivo.
O bloco "pause" é utilizado para atrasos em segundos (pode ser menor), e não bloqueia a execução de outros processos no dispositivo.
Se o script contiver um loop infinito que não inclua um "pause", o interpretador iniciará uma pequena pausa automaticamente.
Se a memória alocada se esgotar, o interpretador interromperá a execução de scripts excessivamente pesados (atenção com funções recursivas).
Passo 3. Depuração de scripts
Para depurar um script já carregado no dispositivo, você pode iniciar a execução passo a passo. Isso é extremamente útil quando o comportamento do script não corresponde ao que o autor planejou. Nesse caso, a execução passo a passo permite que o autor encontre rapidamente a origem do problema e corrija o erro no script.
Script de cálculo do fatorial em 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 vamos esquecer dos botões 'entrar' e 'sair' do modo de depuração). Além da execução passo a passo, você pode definir um ponto de interrupção em qualquer bloco (clicando com o mouse sobre o bloco).
Para exibir os valores atuais dos parâmetros no monitor (sensores, relés), use o bloco 'print'.
Aqui sobre o uso do depurador.
Seção para curiosos. O que acontece por trás das câmaras?
Para que os scripts funcionem no dispositivo de destino, foi desenvolvido um interpretador de bytecode e um montador com 38 instruções. No código-fonte do Blockly, foi embutido um gerador de código especializado, que converte blocos visuais em instruções de montagem. Posteriormente, esse programa de montagem é transformado em bytecode e enviado ao dispositivo para execução.
A arquitetura dessa máquina virtual é bastante simples, e não faz muito sentido descrevê-la aqui; você encontrará muitos artigos na rede sobre o design de máquinas virtuais simples.
Normalmente, aloco 1000 bytes para a pilha da minha máquina virtual, o que é suficiente. Claro, recursões profundas podem esgotar qualquer pilha, mas é improvável que encontrem uma aplicação prática.
O bytecode resultante é bastante compacto. Por exemplo, o bytecode para calcular o mesmo fatorial consome apenas 49 bytes. Aqui está sua forma visual:

E aqui está 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 montagem não tem valor prático, a aba 'javascrit', por outro lado, oferece 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));
Em termos de desempenho. Ao executar o cenário mais simples de alerta, obtive uma forma de onda de 47 kHz no osciloscópio (com a frequência do processador a 80 MHz).


Considero isso um bom resultado, pelo menos essa velocidade é quase dez vezes mais rápida do que a e .
Parte final
Para resumir, posso dizer que o uso de scripts nos permite não apenas programar a lógica de operação de um dispositivo específico, mas também conectar vários dispositivos em um único mecanismo, onde um dispositivo influencia o comportamento de outro.
Também é importante ressaltar que a forma escolhida para armazenar scripts (diretamente nos dispositivos, e não no servidor) simplifica a troca de dispositivos já em funcionamento para outro servidor, por exemplo, para um Raspberry Pi em casa, aqui .
É isso, ficarei feliz em ouvir conselhos e críticas construtivas.
Fonte: habr.com
