Um artigo sobre como criar um controlador lógico programável a partir de um dispositivo chinês barato. Tal dispositivo terá sua utilização 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 de nuvem chinês, após a modificação proposta, todas as interações posteriores com este dispositivo serão possíveis no navegador.
Seção I. Conectando Sonoff ao serviço MGT24
Passo 1: Crie um painel de controle
Registre-se no site
Entrar
Para criar um painel de controle para um novo dispositivo, clique no botão “+”.
Exemplo de criação de um painel
Assim que o painel for criado, ele aparecerá na sua lista de painéis.
Na aba “Setup” do painel criado, encontre os campos “Device ID” e “Authorization Key”, futuramente esta informação será necessária na configuração do dispositivo Sonoff.
Exemplo de guia
Etapa 2. Atualize o dispositivo
Usando o utilitário
Etapa 3. Configuração do dispositivo
Ligue o dispositivo, depois que o LED acender, pressione o botão e mantenha-o pressionado até que o LED comece a piscar periodicamente de maneira uniforme.
Neste momento aparecerá uma nova rede wi-fi chamada “PLC Sonoff Basic”, conecte seu computador a esta rede.
Explicação da indicação LED
Indicação de LED
Status do dispositivo
piscamento duplo periódico
sem conexão com roteador
brilha continuamente
conexão estabelecida com o roteador
piscando uniforme periódico
modo de ponto de acesso wi-fi
extinto
Sem fonte de alimentação
Abra um navegador de Internet e digite o texto “192.168.4.1” na barra de endereço, vá para a página de configurações de rede do dispositivo.
Preencha os campos da seguinte forma:
- “Nome da rede” e “Senha” (para vincular o dispositivo ao roteador wi-fi doméstico).
- “ID do dispositivo” e “Chave de autorização” (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.
é
Passo 4. Conectando sensores (opcional)
O firmware atual suporta até quatro sensores de temperatura ds18b20. Aqui
Seção II. Programação visual
Etapa 1: criar scripts
Usado como ambiente de programação
Adicionei blocos especializados para escrever e ler parâmetros do dispositivo. Qualquer parâmetro é acessado por nome. Para parâmetros de dispositivos remotos, são usados nomes compostos: “parâmetro@dispositivo”.
Lista suspensa de opções
Cenário de exemplo para ligar e desligar cíclico da carga (1Hz):
Um exemplo de script que sincroniza a operação de dois dispositivos separados. Ou seja, o relé do dispositivo alvo 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; já existe bastante coisa na rede.
Etapa 2: Ordem dos Scripts
O script é executado continuamente e, assim que chega ao fim, ele é reiniciado. Neste caso, existem dois blocos que podem pausar temporariamente o script, “atrasar” e “pausar”.
O bloco "delay" é usado para atrasos de milissegundos ou microssegundos. Este bloco mantém rigorosamente o intervalo de tempo, bloqueando o funcionamento de todo o dispositivo.
O bloco “pause” é usado para segundos (ou menos) atrasos e não bloqueia a execução de outros processos no dispositivo.
Se o próprio script contém um loop infinito, cujo corpo não contém “pausa”, o intérprete inicia independentemente uma pequena pausa.
Se a pilha de memória alocada estiver esgotada, o interpretador irá parar de executar um script que consome muita energia (tenha cuidado com funções recursivas).
Etapa 3: depuração de scripts
Para depurar um script que já foi carregado no dispositivo, você pode executar um rastreamento do programa passo a passo. Isso pode ser extremamente útil quando o comportamento do script for diferente do pretendido pelo autor. Nesse caso, o rastreamento permite ao autor encontrar rapidamente a origem do problema e corrigir o erro no script.
Cenário para cálculo 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” (não esqueçamos também do modo de depuração “entrar” e “sair”). 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, utilize o bloco “print”.
é
Seção para curiosos. O que há sob o capô?
Para que os scripts funcionassem no dispositivo alvo, foram desenvolvidos um interpretador de bytecode e um assembler com 38 instruções. O código-fonte do Blockly possui um gerador de código especializado integrado que converte blocos visuais em instruções de montagem. Posteriormente, este 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 sentido descrevê-la, na Internet você encontrará muitos artigos sobre como projetar as máquinas virtuais mais simples.
Normalmente aloco 1000 bytes para a pilha da minha máquina virtual, o que é suficiente para sobrar. É claro que recursões profundas podem esgotar qualquer pilha, mas é improvável que tenham qualquer utilidade prática.
O bytecode resultante é bastante compacto. Por exemplo, o bytecode para calcular o mesmo fatorial é de apenas 49 bytes. Esta é a sua forma visual:
E este é o seu programa assembler:
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 assembly não tem nenhum valor prático, então a aba “javascrit”, ao contrário, dá 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 relação ao desempenho. Quando executei o script mais simples do flasher, obtive uma onda quadrada de 47 kHz na tela do osciloscópio (a uma velocidade de clock do processador de 80 MHz).
Acho que é um bom resultado, pelo menos essa velocidade é quase dez vezes mais rápida que
Parte final
Resumindo, direi que o uso de scripts nos permite não apenas programar a lógica de funcionamento de um dispositivo separado, mas também permite conectar vários dispositivos em um único mecanismo, onde alguns dispositivos influenciam o comportamento de outros.
Observo também que o método escolhido de armazenamento de scripts (diretamente nos próprios dispositivos, e não no servidor) simplifica a troca de dispositivos já em funcionamento para outro servidor, por exemplo, para um Raspberry doméstico, aqui
Só isso, ficarei feliz em ouvir conselhos e críticas construtivas.
Fonte: habr.com