"Casa inteligente" no Arduino para uma mudança de casa



Nada fora do comum, apenas outro controlador Arduino. Com sensores, bobinas e uma página da web. Mas com características próprias e aplicação prática muito específica, ainda que bastante banal - a inclusão remota de aquecimento elétrico no país. As aspas no cabeçalho não são aleatórias, o controlador não é uma casa inteligente na versão atual, mas serve como uma boa base para isso. (nota - esta frase foi adicionada em 12/04/18 com base nos comentários).

Principais recursos:

  • Sensor de parâmetros de rede elétrica - medidor elétrico “Neva” conforme RS-485;
  • Modificação remota da página da web de controle no cartão SD;
  • Inclusão confiável de um grupo de sensores de temperatura de Dallas em longas filas;
  • Gráficos de alterações de parâmetros sem envolver serviços em nuvem;
  • Soluções à prova de falhas (watchdog externo, UPS, reinicialização automática do roteador);
  • Proteção da blindagem da Internet contra congelamento durante a interferência de relés de potência;
  • Projeto completo em um gabinete de trilho DIN.

Eu fazia esse sistema lentamente, como entretenimento, de tempos em tempos lançando o projeto por meses ... Demorou cerca de um ano e meio da ideia à implementação :)

Como antes eu não tinha negócios com microcontroladores, comecei com o kit inicial com aliexpress, brinquei com LEDs, botões e sensores, entendi alguma coisa e comecei a construir um controlador para controle e monitoramento remotos. Bem, a “casa inteligente” não é direta, é claro, mas algo assim.

O objetivo prático foi definido primeiro - ligar remotamente o aquecimento no país. Ainda não consegui construir uma casa (minhas mãos não chegaram, hein), mas tenho uma casa de verão maravilhosa e confortável, com carne picada e aquecida por convectores elétricos. Aqueça uma casa de mudança que esfriou durante a semana até a noite de sexta-feira - uma oportunidade muito tentadora na estação fria.

No entanto, a tarefa de controle remoto de carga acabou sendo bastante trivial. O Arduino mais o escudo da Internet, um esboço pronto da Internet e os rolos já clicam nas marcas de seleção na página da web. De alguma forma, o objetivo prático foi alcançado de maneira muito rápida e simples. E foi chato. Eu queria algo mais interessante.

Estabeleci um segundo objetivo prático - monitorar o consumo atual na rede de chalés de verão. Eu tenho sensores de corrente despretensiosos para testes, brinquei. Tudo funcionou bem, mas essa opção não era adequada para o trabalho de combate. Não consegui encontrar sensores mais potentes do que no 5A, mas precisava de pelo menos 25A.

E tive a ideia de usar um medidor de eletricidade como sensor de potência. E foi um ótimo pensamento! E eu criei esse dispositivo e vi que era bom! Não sem dificuldades, mas concluí esta tarefa perfeitamente, com um sentimento de profunda satisfação, e vou contar abaixo :).

Funcional

A primeira (e até agora a última) versão de combate do controlador "smart home" possui esta funcionalidade:

  • Controle manual remoto da ativação do relé de potência através de um navegador e monitoramento de seu status atual;
  • Monitoramento remoto dos parâmetros de uma rede de alimentação trifásica (tensão, corrente, frequência e muito mais lixo desnecessário, que depois desliguei);
  • Monitoramento remoto das leituras de um medidor de eletricidade de duas tarifas;
  • Monitoramento remoto de um grupo de sensores de temperatura;
  • Registro de dados e gravação de eventos em um cartão de memória;
  • Exibir no navegador de dados de todos os sensores para o dia selecionado na forma de gráficos.

Ideologia

O princípio de construir todo o sistema - sem usar serviços em nuvem de terceiros e servidores de coleta e exibição de dados. Isso não é bom nem ruim. No estágio inicial da "construção inteligente", esse esquema é suficiente e simples. Embora imponha certas restrições ao uso.

O Arduino com um escudo da Internet é o único servidor da Web no sistema. A página da web com a interface de gerenciamento é armazenada no cartão de memória da Internet e transmitida ao navegador quando acessada pelo endereço IP especificado. A interação adicional da interface do usuário com o Arduino é realizada por meio de scripts java, cujos corpos não estão incorporados na página da web, mas são armazenados no meu armazenamento de arquivos domésticos com acesso à Internet. Essa abordagem reduz o peso da página da web, o que acelera a leitura do cartão SD e permite modificar mais rápida e facilmente o código do script.

A leitura do registro de dados para exibição de gráficos é realizada a partir do cartão de memória mediante solicitação (pressionando um botão no navegador). Os dados são exibidos apenas na sessão atual da página do navegador, não são salvos em nenhum lugar e, quando você recarrega a página, deve lê-la novamente. Isso é um pouco de ideologia, já que a leitura de um cartão de memória é bastante lenta e a obtenção de uma quantidade diária de dados pode levar um ou dois minutos (houve uma idéia de refazer o formato de armazenamento de dados para reduzir seu tamanho e acelerar a leitura).

Os valores atuais dos sensores são exibidos na página e atualizados em tempo real com a frequência do ciclo de loop, que eu tenho é de aproximadamente 1 Hz.

Não há "inteligência" no algoritmo agora. Se vou admoestar o algoritmo no futuro - não sei, por enquanto a versão atual é completamente satisfatória para mim.

Topologia de rede

Na casa de campo, Internet móvel Yota (modem usb + roteador wifi). Não há um endereço IP fixo e também não há como obtê-lo, nem por dinheiro. E mesmo que não haja um endereço IP branco dinâmico, o DynDNS não é aplicável. Somente o endereço IP cinza da rede interna do Yota. O IPota Yota não suporta (pelo menos para 2017, este é o caso). Portanto, encontrei apenas uma maneira de acessar o roteador do país de fora - VPN.

Em casa (na cidade), internet com fio com um endereço IP fixo branco. Roteador, seguido pelo armazenamento em rede. Um servidor VPN foi criado neste roteador doméstico. O roteador do país está configurado para aumentar o túnel PPTP VPN para o roteador doméstico.

O controlador no Arduino está conectado à porta LAN do roteador do país e fica atrás do NAT, a 80ª porta é encaminhada para ele. Assim, eu posso acessar o Arduino apenas da minha VPN. Assim, a LAN doméstica e a VPN que eu tenho são dois segmentos da mesma sub-rede, o acesso é direto lá. No computador do escritório e no smartphone, ele configurou uma conexão VPN e também obteve acesso ao Arduino. Não é muito conveniente de usar, mas funciona. Sim, e segurança relativa é fornecida - sem autorização na minha VPN, ninguém mais pode acessar a página de gerenciamento do controlador.

O gargalo é o túnel da VPN para o roteador do país. Cai periodicamente. Além disso, é a conexão PPTP que está sendo desativada, o acesso à Internet permanece. E o mais desagradável é que, quando a conexão PPTP é interrompida, ela não aumenta mais por si só. Mesmo reiniciar o roteador não salva. Apenas uma reinicialização completa de sua fonte de alimentação com um modem USB e não imediatamente. Você precisa desligá-lo, aguarde 10 minutos, ligue-o novamente. Sorte - bom, não - a próxima iteração. O motivo, de acordo com o suporte técnico da Zyxel, é que o operador celular bloqueia pacotes PPTP, pois um lado envia corretamente, o outro escuta corretamente, mas os dados não chegam (eu tenho roteadores Zyxel nas duas extremidades do túnel da VPN). A culpa é de Yota, mas conseguir algo inteligível a partir deles é impossível. Ou talvez não Yota.

Cão de guarda

Para garantir uma operação relativamente suave da VPN, eu uso um cão de guarda do programa de muletas - o roteador do país é alimentado por um relé de energia controlado pela Arduina e, assim que o servidor VPN para de executar o ping (também envia um ping para a Arduina), depois de 10 minutos a energia é removida do roteador por 10 minutos e depois o roteador novamente. Ele é ativado e espera-se estabelecer uma conexão PPTP dentro de 5 minutos. Se não houver conexão, a próxima iteração. Às vezes, esse composto funciona de maneira estável por semanas e até meses, e às vezes começa a quebrar quase diariamente. Nenhuma outra maneira de resolver o problema ainda foi vista. Como eu já disse, o Yota não suporta IPv6, não dá ou vende IP branco a físicos, não há outro provedor com tarifas normais e certamente não há tráfego ilimitado. No entanto, esta decisão, apesar de uma muleta, mas executa sua tarefa muito bem. Agora eu sempre tenho uma conexão, com muito poucas exceções, quando chego ao momento da reinicialização.

Além do software, também implementei um watchdog de hardware. Apenas no caso. O controlador deve funcionar por semanas e até algumas vezes por meses na ausência de mim, e não travar. Como toda essa economia se comportaria em grandes desvantagens, não me era conhecido, então eu estava seguro. O cão de guarda do Atmega não funcionou para mim porque eu não trabalhei no Arduino Mega "pronto para uso" e, para fazê-lo funcionar, tive que me divertir muito. Este problema está bem descrito aqui . Além disso, ele tem um intervalo máximo de 8 segundos, o que me pareceu insuficiente. Portanto, apliquei um chip de vigilância especializado TPL5000DGST, cujo intervalo é definido por uma combinação de três pinos e pode chegar a 64 segundos, o que me convém perfeitamente. Para esse chip, comprei uma pequena placa de ensaio, soldou e fixou no conector com portas IO da Arduina (a foto será mais baixa na seção de montagem). Os testes mostraram o funcionamento confiável desse cão de guarda, e eu queria saber com que frequência ele funcionará na realidade. Para fazer isso, adicionei uma variável ao código do programa em que a hora e a data em que o programa foi iniciado estão armazenadas e essas informações são exibidas na página da web de controle. A prática demonstrou que, ao contrário de uma VPN, o controlador funciona sem problemas por um longo tempo e o timer do watchdog nunca foi útil (enquanto escrevia o artigo, funcionava pela primeira vez, não era em vão). O tempo de operação contínua alcançou mais de 3 meses e poderia ter sido maior se eu não precisasse corrigir algo no código de tempos em tempos e atualizar o controlador.

O sensor dos parâmetros da rede de fornecimento de energia - o medidor elétrico Neva


Como mencionei acima, na minha opinião, nada melhor e mais preciso do que um medidor de eletricidade digital moderno com uma interface externa de acesso a dados pode ser encontrado como um sensor dos parâmetros da fonte de alimentação. Eu escolhi o contador Neva da empresa Taypit em São Petersburgo com a interface RS-485.

Enfatizo que um medidor elétrico com fios da 485ª interface permanentemente conectada a ele não pode ser oficialmente utilizado como medidor ( atualização : nos comentários, eles sugeriram que isso era permitido). Portanto, na rede elétrica da cabana, coloquei dois contadores em série. O primeiro é um medidor oficial de eletricidade, lacrado e registrado, localizado na placa de rua. O segundo é o meu sensor de fonte de alimentação, não selado e não contabilizado, do qual a empresa de vendas de energia não se importa, porque não se importa com tudo o que é instalado após o dispositivo de medição. Esse medidor elétrico já está localizado no painel dentro da casa de troca, e no mesmo painel também há um controlador no Arduino, mas mais sobre isso mais tarde.

Na casa de campo, tenho uma rede de alimentação trifásica. Na cidade, só posso depurar em uma fase única. Portanto, adquiri dois metros, um Neva MT-324 trifásico e um Neva MT-124 monofásico. A depuração inicial do controlador foi realizada sobre a mesa em um contador trifásico com uma fase monofásica conectada e, em seguida, o instalava regularmente no escudo dacha no modo de operação de combate. A depuração das modificações subseqüentes do software já foi feita em um contador monofásico mais barato na tabela:



Para conectar o medidor ao Arduino, é necessário um conversor de nível RS-485 para TTL:


Além disso, para trabalhar com o contador, você precisa de uma porta serial gratuita no Arduino. Infelizmente, o Arduino Uno possui apenas uma porta serial; se você a colocar debaixo do balcão, terá que perder a saída de depuração das informações de texto (monitor de porta) e, sem isso, seria impossível escrever um esboço. Portanto, eu uso o Arduino Mega, que possui várias portas seriais. Seria possível implementar a segunda porta serial softovo através das portas digitais do Arduino, mas não encontrei uma biblioteca adequada com a capacidade de alterar outras configurações de porta, exceto a velocidade. E as configurações da porta do contador são diferentes das configurações padrão: taxa de 9600 bits, 7 bits de dados, 1 bit de parada, controle de paridade - par. Felizmente, o objeto Serial padrão no Arduino permite que você faça essas configurações.

Era relativamente fácil obter o protocolo de troca com o contador - o fabricante do contador em domínio público possui um programa para ler parâmetros no Windows, que também possui um monitor de porta. Para conectar o medidor a um computador, usei o conversor de interface MOXA 232/432 / 485USB. Algum tempo para análise visual dos pacotes - e eu selecionei os principais comandos.

No entanto, isso não me pareceu suficiente e entrei em contato com o fabricante por e-mail. Após um mês de correspondência com Typit, finalmente consegui obter uma lista completa de comandos com interpretação:

Parâmetro de codificação MT3XX E4S
Parâmetro de codificação NEVA MT124 AS OP (E4P)

atualização 10.28.2019 : Explicações dos comandos. Os comandos na tabela são representados como caracteres de texto. Ou seja, onde custa 0 (zero), você precisa enviar 0x30. Pontos e asteriscos são separadores de beleza, não significam nada e você não precisa enviá-los. No final do comando, é adicionado um byte de soma de verificação, calculado levando em consideração o prefixo e o postfix do comando, que não são indicados na tabela. O prefixo para todos os comandos de leitura é 0x01 0x52 0x31 0x02. Esse postfix é 0x28 0x29 0x03. No entanto, o envio de um prefixo não é necessário e um postfix parece obrigatório. Exemplo: comando de leitura de data 09.09.02 * FF. Na verdade, você precisa passar os códigos de caracteres de texto 000902FF. Ou seja, 0x30 0x30 0x30 0x39 0x30 0x32 0x46 0x46. Adicione o prefixo e o postfix, obtemos o conjunto 0x01 0x52 0x31 0x02 0x30 0x30 0x30 0x39 0x30 0x32 0x46 0x46 0x28 0x29 0x03. Lemos a soma de verificação como xor de todos os bytes menos 1 e adicionamos o byte recebido no final. O prefixo é descartado como opcional. Como resultado, enviamos isso para o contador - 0x30 0x30 0x30 0x39 0x30 0x32 0x46 0x46 0x28 0x29 0x03 0x68. O início do ciclo de troca deve ser precedido pelos comandos de inicialização da troca, no esboço abaixo, esses comandos são marcados como // Início 1, 2, 3. Depois que a troca é inicializada, você pode ler os dados do contador no ciclo por um tempo arbitrariamente longo, mas depois de perder a comunicação e talvez após uma falta prolongada de troca por outros motivos, seja necessária a reinicialização.

Além disso, o problema técnico é escrever um ciclo de pesquisa de parâmetros no Arduino e exibi-los para iniciantes no monitor de portas. O tempo de um ciclo foi de cerca de um segundo. No entanto, na versão final do projeto, com registro de dados em uma unidade flash e sensores de temperatura de polling, esse tempo aumentou para 4 segundos. Isso não me agradou e teve que mergulhar na otimização. Como resultado, consegui novamente um segundo intervalo sem perder a funcionalidade. A propósito, reescrevi o esboço duas ou três vezes até encontrar a arquitetura correta e os algoritmos econômicos.

Implementação de software de troca com um contador

O código é extraído do contexto do meu grande esboço de trabalho. Compilado, mas desta forma, nunca o executei. Dou apenas como exemplo, e não como um programa de trabalho concluído. Embora, em teoria, tudo deva funcionar dessa forma.

O código foi escrito para dois tipos de contadores simultaneamente, o MT-124 monofásico e o MT-324 trifásico. O tipo de contador é selecionado no programa automaticamente pela palavra de resposta do comando de inicialização.

Cito o código como está, sem beleza e sem comentários adicionais, exceto aqueles que escrevi para mim. E sim, eu não sou programador e nem estudo para isso, então você não deve me criticar pela qualidade do código, mas pode aprender a codificar: EnergyMeterNeva.ino

Uma enorme vantagem adicional do medidor de eletricidade é um relógio em tempo real confiável e preciso. Eu não precisava fornecer ao sistema um módulo adicional, que ainda precisa ser encontrado não apenas de qualquer forma, mas de alta qualidade. O tempo atual exato até o segundo que recebo do contador, entre outros dados. Sim, no que diz respeito ao tempo atômico, o tempo do contador é ligeiramente alterado (alguns segundos), não sei com o que ele está conectado, uma configuração de fábrica de baixa qualidade ou qualquer outra coisa, mas a precisão é excelente, apenas com um leve viés.

Em raros momentos, quando a energia da cabana é desligada e o medidor fica indisponível, recebo a hora atual do temporizador interno da Arduina. Quando o medidor elétrico está funcionando e seus dados estão disponíveis, reescrevo o temporizador interno da Arduina com o valor do medidor em cada loop do loop. Quando o contador cai - a hora atual continua a marcar no temporizador Arduina.

Além de ler os parâmetros, o contador, é claro, pode ser programado. Ou seja, a interface funciona tanto para leitura quanto para escrita. No entanto, com tais dificuldades, eu estava tentando obter um protocolo para ler comandos que nem sequer indiquei ao fabricante sobre a solicitação de um protocolo de gravação. Primeiro, eu não precisava, exceto talvez um pouco de tempo para movê-lo. Em segundo lugar, suspeito que esses dados não sejam mais públicos, pois podem ser usados ​​para fins fraudulentos.

Sensores de temperatura

Eu já realizei um teste de sensores de temperatura com um exemplo de esboço separadamente anteriormente. . . 1-Wire. 0.5 , 0.0625 . . . .

. , , , delay(750). — , ( 750 ), . , — , . LOOP , . — LOOP 1-1.5 , .

«85» «0». , , . — . , . , ( ) .

-, - : DS18x20_Temperature.ino

: TempSensors_DS18B20.ino

1-Wire 4.7 . SMD-, 5.1 , ( ). .

(+5, gnd data), 9 , . . . — . — , . , , . , . :



, , .

, — , , . , (. - ). - , - .

, .. ( ) … ? , . . , .

25 . — 5 10 , . . . , . ( ), .



Ethernet shield. , , .

. -, () - . , .

, — , — .

- , , html :



html- , . JSON.

. . , . html-, , java- - , . , , . Só isso. .

.
html- :

<script type="text/javascript" src="http://domain/send_HTM.js"></script></pre> <pre style="font-size: 14px;"><form> <br><br> CONTROL.HTM:<br> <textarea cols="100" rows="20" wrap="off" id="htm"></textarea><br> <input type="button" value="" onclick="send_HTM();"><br> <div id="progress" style="display:none"> <div id="label">  :</div> <div style="width:800px;border:1px solid #000"> <div id="bar" style="background:#00f;height:10px;width:0px"></div> </div> </div> </form> 

O botão "Enviar" inicia o seguinte script Java : send_HTM.js

No esboço da função para processar solicitações de servidor da Web por prefixos na solicitação 'CONTROL.HTM' (iniciar o envio do arquivo), 'htmlineN' (número da linha de envio) e 'END_CONTROL.HTM' (final do envio do arquivo), determinamos as seguintes ações:

 File acceptHtmFile; ................ if (fl_accept_htm) //  'CONTROL.HTM' { SD.remove(CTRL_HTM); acceptHtmFile = SD.open(CTRL_HTM, FILE_WRITE); //     if (!acceptHtmFile) //      -    { #ifdef DEBUG_SD Serial.println("SD-card not found"); #endif client.print("FAIL"); client.stop(); } else client.print("OK_OPEN_FILE"); acceptHtmMode = true; break; } if (fl_htmline) //  'htmlineN' { int b = acceptHtmFile.println(tag); if (b == 0) { client.print("FAIL"); acceptHtmMode = false; cntHtmModeIteration = 0; } else { client.print("OK"); } cntHtmModeIteration = 0; break; } if (fl_endhtm) //  'END_CONTROL.HTM' { SD.remove(CONTROL_HTM); acceptHtmFile.close(); File htmlFile = SD.open(CONTROL_HTM, FILE_WRITE); //    acceptHtmFile = SD.open(CTRL_HTM); //    for (int i = 0; i < acceptHtmFile.size(); i++) { digitalWrite(PIN_WATCHDOG_DONE, 1); htmlFile.write(acceptHtmFile.read()); digitalWrite(PIN_WATCHDOG_DONE, 0); } acceptHtmFile.close(); htmlFile.close(); client.print("OK_CLOSE_FILE"); acceptHtmMode = false; cntHtmModeIteration = 0; break; } 

O CONTROL_HTM e CTRL_HTM define aqui os nomes dos arquivos html. O primeiro é o arquivo principal, o segundo é o arquivo de buffer. Na matriz de tag char, encontra-se o texto da string recebida, selecionada na solicitação. A lógica é a seguinte: ao receber dados, eles são gravados no arquivo em spool; no final da recepção, o arquivo em spool é substituído pelo principal. Eu ainda não conseguia entender como simplesmente renomear os arquivos, a biblioteca padrão do SD não tem essa função, uma cópia estúpida de caractere por caractere, que leva muito tempo.

Seria conveniente armazenar o código da página da web de controle não no cartão de memória do controlador, mas na máquina do cliente, ou fazer o download de algum recurso externo. Mas a proibição de solicitações entre domínios não permite isso. Javascripts podem enviar seus pedidos apenas para o norte a partir do qual eles foram carregados. Nesse caso, os corpos dos javascripts podem ser carregados de qualquer lugar; é importante apenas de onde a página com a chamada foi carregada.

Registro de dados

A blindagem Ethernet possui um slot para cartão micro-SD a bordo. Foi por causa de sua presença que decidi gravar dados nos arquivos de log. Para trabalhar com um cartão de memória, há também uma biblioteca embutida, e gerenciar a leitura e gravação de arquivos com ele geralmente é elementar.

Para economizar a quantidade de dados, criei o algoritmo de log para que o registro só ocorra quando os dados forem alterados em mais de um limite predeterminado. Para temperatura é 0,1 °, para tensão é 0,2V. Os dados de um dia são gravados em um arquivo. Em zero horas, um novo arquivo é criado. Eu escolhi o formato de texto sem formatação, com delimitadores, para que você possa controlar rapidamente o conteúdo dos arquivos durante a depuração, e haveria uma capacidade simples de carregar no Excel.

As restrições de design não permitem inserir / remover convenientemente um cartão de memória; portanto, usei um cartão grande. De acordo com meus cálculos, ele será preenchido por vários anos, após os quais será necessário desmontar o gabinete, remover o cartão de memória e limpá-lo.

Não vejo o ponto de registrar o código, tudo é completamente trivial - um registro banal de texto em um arquivo. E esse código está espalhado por todo o esboço (não apenas os parâmetros dos sensores são registrados, mas também uma variedade de eventos únicos), é difícil isolar.

Gráficos

Como um mecanismo de gráficos, eu uso a biblioteca de visualização javascript amavart altamente flexível. A biblioteca é gratuita e disponível para download e uso offline. Também localizei esta biblioteca no meu NAS com acesso permanente à Internet. Conectá-lo e usá-lo com as configurações padrão não é difícil, no entanto, para obter a visualização de que eu precisava, tive que mexer muito. Um grande número de exemplos no site e a disponibilidade de documentação detalhada ajudaram.

Por exemplo, darei o javascript do desenho de horários. Por si só, é inútil, pois só funciona em conjunto com um servidor Web e uma página html e pode estar vinculado a outros scripts (faz muito tempo, não me lembro de todos os detalhes). Mas as configurações de aparência dos meus gráficos estão contidas nele e você pode obtê-las a partir daí: get_log.js

A grande vantagem da biblioteca amchart é que ela pode desenhar os gráficos corretos a partir de dados rasgados. Como mencionei acima, no log eu salvo os dados somente quando eles mudam. Ou seja, isso acontece de forma assíncrona e aleatória. Pode não haver novos dados por vários minutos e, em alguns segundos, eles serão alterados várias vezes. Por conseguinte, as entradas no log acompanham intervalos de tempo arbitrários. O Amchart leva isso em consideração por si só ao renderizar, não preciso interpolar os dados antes da renderização. Acabei de enviar a matriz de dados como está e vejo um gráfico bonito que é uniforme no tempo.

Descobri apenas uma desvantagem desta biblioteca - ela não sabe como (bem, ou ainda não entendo) atualizar humanamente os gráficos em tempo real. Você pode adicionar novos dados aos já existentes, mas o redesenho é feito sempre que todo o conjunto de dados, e isso torna o navegador muito mais lento. No entanto, a própria ideologia de ler dados do Arduina para renderizar sob demanda a partir do navegador é falha por sua não otimização, portanto não havia sentido em lutar por uma atualização rápida em tempo real.

A solução correta seria organizar um servidor separado para armazenar e visualizar dados, onde da Arduina, em tempo real, os dados cairiam um pouco e seriam armazenados no banco de dados, e de onde poderiam ser rapidamente enviados ao usuário em um navegador para visualização.

Agora os gráficos são assim (no exemplo do dia em que não há ninguém na casa de mudança e, consequentemente, não há consumo de energia). Quando dados atuais ocorrem, a escala é definida automaticamente para que tudo se encaixe perfeitamente e os valores dos níveis atuais apareçam no eixo vertical:



Os gráficos são exibidos na mesma página em que o controle ocorre, diretamente abaixo do bloco de controle principal.

Não forneço intencionalmente um conjunto completo de fontes do projeto por vários motivos:

  1. Ele não pode ser iniciado como em qualquer outra rede que não seja a minha, pois não tentei tornar o projeto portátil e está rigidamente vinculado aos meus endereços e à minha topologia de rede.
  2. Estou certo de que a ideologia geral do projeto sofre muitos problemas, pois esta é minha primeira tentativa na área em que não sou bom em entender. Portanto, não proponho a ninguém todo o projeto para repetição neste formulário. Compartilhei apenas aqueles momentos em que estou menos confiante.
  3. O projeto já existe há muito e muito tempo, e nunca me lembrarei de todos os detalhes e não poderei explicar várias soluções. O volume do esboço é muito grande (para meus padrões, cerca de 2 mil linhas), existem mais de uma dúzia de scripts Java em exibição, não fiz um diagrama esquemático do ferro. Ou seja, não posso ajudar no aconselhamento sobre a maioria dos problemas.

Assembléia

Desde o início, estabeleci o objetivo - criar um dispositivo acabado, e não apenas um layout com um monte de postagens sobre a mesa:



E imediatamente decidi que quero colocar o dispositivo dentro do painel elétrico. Há comida, um balcão e, em geral, é conveniente.

Para isso, foi necessário um caso dinrek. No começo, pensei em desenvolvê-lo e imprimi-lo em uma impressora 3D. Mas eu não tenho minha própria impressora 3D, e o que meus colegas trabalhando nas impressoras montadas automaticamente não me agradaram na qualidade da aparência. Encontrei caixas prontas em um trilho DIN (de vários tamanhos) para venda, elas parecem boas, são fáceis de usar (dobráveis) e também há um cartão cego pronto para elas.

Comprei o maior gabinete, para que não apenas o Arduino com o escudo da Internet pudesse caber nele, mas também um relé para alternar a carga:









Em seguida, foi um processo longo e fascinante de instalar todas as tripas do gabinete. Sob esse negócio, eu até adquiri um ferro de soldar maravilhoso com a função dormir (os ferros de soldar que eu possuía ainda eram da época soviética):



Para instalação, comprei vários tipos de racks, parafusos, arruelas e porcas. Primeira montagem de montagem:





Para conectar os fios aos contatos superiores, era necessário o uso de pinos dobrados, caso contrário não cabia no gabinete:



As arruelas isolantes tiveram que ser cortadas em alguns lugares:



E, em alguns lugares, ele se dobra mais perversamente, eleva o parafuso na luva e apara a luva de forma elaborada:





Para uma única mudança, não havia pontos de articulação suficientes, portanto, ela dependia de apenas dois pontos:



Montagem montada com blocos de terminais:



Então a nave começou a crescer gradualmente em fios. A placa foi usada apenas para a fiação elétrica e para conectar aos blocos de terminais. Para conexões de sinal, usei o fio MS-16 (eu gosto mais), para poder não passar pela tensão (até 100 V), então MGTF:



Montei LEDs no painel frontal, soldou os resistores limitadores de corrente diretamente nas pernas dos LEDs e os fechei com termorretratação:



Como resultado, obtivemos um recheio tão barbudo:



E aqui está um cachecol com um microcircuito de vigilância, protegido nas entranhas da minha criação, logo acima do conversor de nível RS-485-TTL:





Toda a estrutura é dobrável, tudo pode ser removido, desconectado e substituído sem solda, exceto por um cachecol com um olho de cachorro, que é soldado aos pinos do conector, revestido em várias portas de E / S da Arduina.

Na caixa:



Cortei aberturas para os conectores da Arduina na parede plástica do gabinete. Primeiro, fiz os furos exatamente de acordo com o tamanho dos conectores, mas a montagem do gabinete deve ser iniciada na diagonal (caso contrário, simplesmente não funciona) e os conectores não passaram, tive que desperdiçar um pouco:



Ao ligar o produto acabado sobre a mesa, tudo funcionou imediatamente:





No painel frontal trouxe:

  • Quatro LEDs vermelhos - indicação de carga;
  • Dois verdes - comunicação com o contador e com o servidor VPN;
  • Dois amarelos são de reposição;
  • Um amarelo - indicação de reinicialização do roteador;
  • Um vermelho é nutrição;
  • E um botão de reset.

Para obter 5 volts de 220, usei uma fonte de alimentação dinerey com ajuste do nível de saída, a energia foi fornecida diretamente ao microcontrolador, ignorando o conversor de entrada de 7 a 12 volts. Isso foi conveniente por vários motivos. Em primeiro lugar, a potência do conversor embutido em algum momento não foi suficiente, a corrente é limitada. Em segundo lugar, ainda era necessário fornecer 5 volts ao relé. Em terceiro lugar, o painel é um fator de forma conveniente do dinrek em termos de instalação. Portanto, aqui:




Teste

Tudo estava virado sobre a mesa, tudo funcionava como deveria, era hora de instalar o controlador no escudo e verificá-lo no modo de combate.

Mas primeiro, eu conectei tudo "no ranho", literalmente empurrando toda a tripa para outra blindagem, de baixa corrente, para testar os sensores de temperatura em condições reais em longas filas dispostas em um canal de cabo com ~ 220V:



Como você pode ver na foto acima, até agora eu tentei controlar a reinicialização do roteador usando o soquete Senseit "inteligente". No entanto, este dispositivo com um custo insano de 5 mil (para 2016) acabou sendo extremamente buggy e mal-humorado. Durante o ano de uso, ele me forçou repetidamente a chegar inesperadamente à cabana em momentos inoportunos, a fim de remover manualmente esse milagre da engenharia e do marketing de uma profunda desvantagem em termos de comunicações GSM. Com a transição para o meu controlador Arduino, que se mostrou mais confiável do que um exemplo, fiquei aliviado em deixar esse lixo "profissional" em uma bela caixa em uma caixa e esquecê-lo.



O teste foi bem-sucedido, não houve falhas e foi possível prosseguir para a instalação final em um local regular:



Sim, este é o escudo ABB TwinLine 800x300x225 IP55, no valor de 25 mil rublos. sem enchimento (e enchimento por outros 15 mil aproximadamente). E sim, ele é instalado em uma casa de troca de 6x2. Todo mundo tem suas próprias baratas. Sim, eu mesmo coletei toda a eletricidade . E ele construiu uma casa de mudança também, sim. Não, eu não sou eletricista. E não um construtor.



Nas profundezas da blindagem, localizei uma pequena fonte de alimentação ininterrupta Powercom WOW 300 , lá seu LED verde acende e, à esquerda e acima - sua tomada de entrada:



Dura aproximadamente 40 minutos de duração da bateria do dispositivo Arduino, um roteador com modem USB e Wi-Fi e câmeras de vigilância IP Full HD.

E aqui você pode ver os plugues de alimentação brancos de dois consumidores ininterruptos - a fonte de alimentação Arduino e a blindagem de baixa corrente, onde estão localizados o roteador e a fonte de alimentação da câmera de vigilância externa. Essa linha passa por uma interrupção no contator, controlado pelo Arduino, exatamente para o mesmo watchdog de software que reinicia o roteador na energia em caso de queda da VPN (a câmera reinicia ao mesmo tempo, embora não seja necessário). As principais linhas de pares trançados dos sensores de temperatura estão conectadas ao controlador:



Devo dizer que nunca confiaria na troca de uma carga poderosa para pequenos relés chineses azuis, apesar dos parâmetros desses relés, que parecem permitir que isso seja feito. Portanto, o uso de contatores modulares normais Legrand cat. No. 4 125 01 com a possibilidade de controle manual foi imediatamente estabelecido. Ou seja, os relés dentro do corpo do controlador controlam os contatores, e os contatores já controlam a carga. É confiável. Mas a energia do roteador e da câmera é realizada apenas através deste pequeno relé chinês azul, a corrente é pequena, por isso é possível.

No primeiro lançamento de combate, fiquei muito decepcionado. Na mesa, experimentei tudo, exceto a carga. Porque Os contatores clicam e, portanto, fica claro que eles mudarão a carga. Mas não, era necessário experimentar. Eletroconvectores poderosos introduziram interferência no sistema no momento da abertura dos contatos, o que levou a um congelamento garantido da blindagem da Internet. E para tirá-lo do sério só era possível removendo a energia, uma simples redefinição não ajudava. Pesquisado no Google - sim, este chinês tem um problema. E a biblioteca não lida com essa situação. Ou seja, o pedaço de ferro é ruim e o software não é muito bom.

Eu já pensei que tudo tinha sumido. Até encomendei relés de estado sólido, mas eles, escória, são maiores em altura e não se encaixavam no meu design. Mas então pensei que ainda seria possível suprimir a interferência. Pesquisado novamente, encontrou capacitores especiais para supressão de ruído (os chamados capacitores do tipo X). Basta conectá-los em paralelo ao enrolamento de controle dos contatores, e eis que eis! Hangups desapareceu completamente. No último ano de operação, nenhum caso foi registrado:







Mas desta forma, você pode olhar dentro da caixa:





Bem, a vista final da viseira com o plastron (nenhum plugue foi fornecido no kit):



Para depuração e intermitência, o cabo USB é conectado ao controlador e armazenado dentro da blindagem atrás de uma porta fechada (ele não será conectado temporariamente a esta foto):





O sistema está funcionando há quase um ano, sobreviveu a geadas de até 20 graus sem problemas.

Em geral, estou satisfeito com o resultado. No entanto, para tarefas mais ou menos funcionais, o Arduino é claramente fraco. Mais de uma vez, fiquei sem memória e tive que cortar e otimizar. E a velocidade do trabalho, especialmente com um cartão de memória, não combina comigo. Portanto, as futuras implementações de tais ofícios, se houver, gostaria de basear-me em algo mais poderoso. Colegas me dão um Raspberry Pi, uma boa opção, eu acho.

Alguém pode dizer: “Quantas dificuldades existem para uma tarefa tão primitiva” e provavelmente estará certa. Para mim, todo esse empreendimento é um hobby, com pouca justificativa para o significado. Portanto, eu estava procurando entretenimento em tudo o que podia :)

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


All Articles