Controle de cortina via interface RS-485. Parte 2: adicione WiFi

Concluímos a tarefa mínima - testamos como o motor AKKO AM72E funciona através da interface RS485 . Agora podemos comandar a luz solar enviando elétrons através de fios. O próximo passo óbvio é a transição do controle com a ajuda de partículas elementares para o controle com a ajuda de vibrações, ou seja, ondas de rádio. Os feitiços que usaremos neste caso dependem da mágica que escolhemos.
Qualquer tecnologia sem fio seria adequada para nossos propósitos, mas eu queria controlar as cortinas do meu smartphone. Nesse caso, é aconselhável não instalar nenhum programa adicional. Vou conectar-me à minha rede WiFi doméstica e gerenciar a cortina elétrica usando um navegador. Dirija, através do adaptador RS485-UART vou conectar ao ESP8266. Você pode seguir seu próprio caminho e usar, por exemplo, um roteador WiFi.

Hoje, o ESP-01 é o módulo mais econômico com WiFi. Custa tão pouco que se você precisar controlar vários motores, não podemos puxar os fios de um motor para outro, mas simplesmente conectar cada um ao seu próprio módulo. Nesse caso, não precisaremos fornecer a cada AM72E seu próprio endereço - você pode entrar em contato com o endereço ESP-01. Estamos interessados ​​no ESP8266, não apenas por seu preço baixo e tamanho pequeno, mas também pelo fato de haver muito poucos recursos nele, e será necessário muito esforço para empurrar algo que funcione nele.
Não descreverei como conectar e atualizar o firmware do ESP8266. Como fazer isso corretamente pode ser encontrado aqui .
No Windows, para programar o ESP8266, você pode usar o Arduino IDE e, em seguida, escrevemos em C (bem, quase), ou NodeMcu, e você pode escrever em Lua. Existem outras opções também, mas elas não nos agradam.
Não, não temos pressa em fazer upload do NodeMcu. O firmware precisa estar preparado. Os recursos no ESP-01 não são suficientes para que possamos esquecê-los, se quisermos criar um servidor da Web. Há ROM flash no quadro - um local onde todos os nossos arquivos serão armazenados - 512 KB. Isso já é extremamente pequeno, mas não vamos descansar na falta de recursos no flash, mas na RAM. O ESP8266 SoC possui uma área de 64 KB de RAM para código de programa e 96 KB para dados. Na inicialização, os dados do flash são carregados na RAM. Se preenchermos o firmware padrão do NodeMcu e examinarmos a quantidade de memória disponível, veremos o seguinte:
imagem
21 kb! Com esses volumes, você precisa salvar todos os bytes! Também vemos algum lixo após a linha "Não é possível detectar automaticamente o firmware, porque a resposta adequada não foi recebida". Trata-se de informações de depuração, emitidas a uma velocidade de 74.880, e a velocidade muda. Veja como fica na velocidade certa:

nada de interessante.
Primeiro, aumente a quantidade de RAM disponível. Para fazer isso significativamente, você pode reconstruir o firmware por conta própria. Os códigos-fonte estão disponíveis, mas você não deseja trabalhar com todo o projeto apenas para fins de teste. Além disso, isso terá que ser feito no Linux. Não que seja muito difícil, mas se estivermos distraídos, nunca terminaremos. Você pode ajustar o firmware aqui: frightanic.com/nodemcu-custom-build .
Troquei a caixa de seleção para dev096 e coloquei uma marca de seleção adicional ao lado de 1-ware na janela de seleção de plug-in. Liguei este módulo por causa de uma função - cálculo CRC16. Aqui está:

Você, é claro, pode ativar ou desativar os módulos necessários. Agora digite o email no formulário e clique no botão "Verificar o status da compilação". Um e-mail único também é bom. Esperamos alguns minutos e, em uma carta, obtemos um link para os arquivos com o firmware. O firmware no qual você só pode trabalhar com números inteiros economizará um flash com uma dúzia de kilobytes. Eu derramei este. Mas você pode fazer outra escolha. Vamos ver por que tentamos tanto:

agora temos 35 KB de RAM disponíveis.
Antes de prosseguirmos com a programação, retornemos brevemente ao adaptador UART-RS485. À parte responsável pela mudança de transmissão-recepção. Resistor R1. Ao carregar, o ESP8266 define todos os pinos do GPIO para o modo de entrada e, em seguida, o programa determina em qual modo cada GPIO funcionará. Aconteceu que, no momento do carregamento, o contato TX_UART (U0TXD) deveria estar em um nível alto, caso contrário, o programa gravado em flash não será iniciado. Sem R1, quando um pino TX é pesquisado, um nível baixo será lido e o ESP8266 ficará travado até que o adaptador seja reconectado.
Você pode recusar todo o esquema de comutação de recepção e transmissão usando um dos pinos GPIO. Mas existem poucos GPIOs disponíveis no ESP-01 e talvez eles encontrem outro aplicativo em seu projeto. Além disso, com o esquema de comutação, o adaptador que fabricamos pode ser usado, por exemplo, com um roteador que não possui um GPIO.
O projeto consiste em três arquivos: data, index.html e init.lua. É mais correto considerar isso não como um projeto, mas como um protótipo. Por exemplo, não há autorização, exceto quando conectado a um roteador. E não tenho certeza de que o servidor no ESP8266 seja capaz de suportar ataques. O código não verifica de forma alguma, exceto quando conectado, há uma conexão de rede ou desapareceu. Não há código que reinicie automaticamente o ESP8266 se o programa congelar. As duas últimas tarefas são facilmente resolvidas, mas o projeto se tornaria mais complicado.
Você precisa editar o arquivo de dados - digite o nome e a senha da sua rede WiFi lá. Ao conectar o ESP8266 à rede, poderemos controlar as cortinas pela Internet. Após concluir a depuração do init.lua, defina a variável debug como false ou exclua-a completamente. Portanto, menos lixo será espalhado no UART. Se isso não for feito, a unidade poderá não funcionar. Além disso, o AKKO AM72E ainda não será capaz de entender o que você está escrevendo para ele. Nesse caso, a função de log e todas as linhas em que é mencionada no init.lua também podem ser excluídas.
Vamos voltar ao tópico de economizar recursos. O arquivo de dados, com meu nome de rede e senha, ocupa 1643 bytes na memória. Se você ainda não adivinhou, esse arquivo é um arquivo lua comum. Pode ser compilado. Após a compilação, o mesmo arquivo já ocupa 1040 bytes. Você pode fazer o mesmo com o init.lua. O tamanho do arquivo pode ser reduzido ainda mais. É necessário jogar fora tudo que é supérfluo, antes de tudo, comentários e espaços. O arquivo fica pouco legível, mas se precisarmos de mais espaço, temos que buscá-lo. Esta é uma prática comum. No final, ninguém apreciará o design bonito e correto do seu código. Bem, talvez concorrentes quando seu código chegar a eles. Mas a funcionalidade truncada será imediatamente perceptível. Especialmente se houver algo para comparar. Quando dispositivos com poucos recursos são programados, as prioridades mudam. É por isso que os programasescrito em C para sistemas embarcados é pouco legível. Tudo é complicado mudando tudo o que é possível para o pré-processador. Se você iniciar um projeto em C e adiá-lo por alguns meses, poderá ser necessário um tempo decente para descobrir seu próprio código. Menos atenção é dada à manutenção do código, pois em três a cinco anos, o ferro novo aparece e tudo precisa ser reescrito novamente devido à arquitetura alterada.
Depois de excluir manualmente tudo desnecessário do arquivo de dados, ele começou a ocupar 705 bytes. Ao mesmo tempo, o tamanho ainda pode ser reduzido em várias dezenas de bytes, se as variáveis ​​receberem nomes não significativos, mas nomes de uma letra (sim, sim, isso não é o que aprendemos na escola). Após compilá-lo, o arquivo data.lc ocupa 728 bytes em flash - oops! Até acontece!
Não há muito a dizer sobre index.htm. Eu também adicionei uma imagem no formato svg para ele. Você pode fazer isso também. Basta preencher curtain.svg no flash com outro arquivo.
Init.lua - o arquivo principal do projeto. Existem comentários no próprio arquivo e, se algo não estiver claro, você poderá iniciar a execução linha por linha e, em geral, experimentar até que seja completamente esclarecido. Além do UARTA, ainda existem LEDs de comutação conectados ao GPIO2. Os arquivos durante o upload pelo servidor são lidos a partir do flash e transferidos em blocos de 512 bytes. Isso reduz os requisitos de tamanho da RAM disponível.
Isso não está no código, mas se for necessário calcular o CRC16, isso será feito com o comando ow.crc16 (buf, crc). Por exemplo, se você digitar:
= ow.crc16 ('\ 85 \ 00 \ 00 \ 03 \ 01', 0xFFFF) na linha de comando, obtemos
:
15593
Basta lembrar, envie primeiro o byte baixo e depois o alto.
Aqui está o que aconteceu no final:
deve haver um vídeo)

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


All Articles