Continuação deste artigoA empresa comprou os postos de monitoramento NEXT-M da produção doméstica NEXT Technologies. Para garantir a visualização da operação das unidades de bombeamento,
alarme de incêndio, tensão nas entradas, temperatura ambiente, nível de água de emergência. O coração do NEXT-M é o ATMEGA 1280 e esse fato foi encorajador em termos da possibilidade de criar seu próprio kit para necessidades específicas.
A tarefa foi definida para criar um sistema de expedição local totalmente autônomo no menor tempo possível e com o menor custo. A base é o microcontrolador. Desenvolvimento, fabricação, todos pela própria equipe.
O sistema deve funcionar sem dependência de redes celulares, servidores, Internet e sistema de licenciamento para o uso de recursos de radiofrequência, não usar computadores ou uso periódico máximo de laptops no sistema de monitoramento e controle, sem acesso a objetos por um longo período (6-9 meses). A configuração de rede possui uma estrutura radial. Os dados são coletados em um ponto e enviados para processamento através dos canais de comunicação convencionais ou como cópia impressa.
O sistema deve fornecer:
- monitorando a operação de unidades de bombeamento
- automação tecnológica
- proteção de emergência
- alarme de emergência
- horas de funcionamento
- cálculo da quantidade de eletricidade consumida
- controle de temperatura do equipamento
- alarme de incêndio
- leitura remota periódica de informações
- requisitos futuros desconhecidos
Condições de trabalho:
- área de cobertura 1 km quadrados.
- visibilidade direta entre objetos
- temperatura de +50 a -50 C
- umidade até 100%
- depósitos biologicamente ativos (mofo, bactérias redutoras de sulfato)
- vibração, não mais, máquinas de 1-2 classes de acordo com GOST ISO 10816-1-97
- ambiente eletromagnético - comutação de motores elétricos por contatores KT 6053, soft starters RVS-DN, equipamento de controle SIEMENS MICROMASTER PID, radiação na faixa ISM e GSM de acordo com os requisitos para esses dispositivos, soldagem a arco manual no local
- sobretensão da rede, falta de energia a curto prazo, sobretensão elétrica, desequilíbrio de fase em caso de quebra da linha aérea nas redes de distribuição de 6 a 10 kV.
Apesar de requisitos tão rigorosos, a implementação é bastante simples com uma solução faseada para o problema.
Com tudo isso em mente, a placa Arduino Nano 3.0 tornou-se o "cérebro" dos concebidos. O xaile Robotdyn possui um controlador ATMEGA 328, o regulador de tensão necessário de 3,3V
Corrente de 800 mA e conversor para CH340G UART-USB.
Primeiro, os contadores de tempo de operação foram criados como os mais relevantes. Os medidores industriais usados anteriormente coletados em PICs com um circuito de fonte de alimentação sem transformador falharam devido a picos de energia durante o ano de operação. Apenas intactos, com a ajuda de fontes de alimentação caseiras para 5V, permaneceram intactos. Para acelerar a instalação e a universalidade da conexão, um sinal no estado das unidades é retirado dos terminais dos dispositivos de comutação, ou seja, registro da presença da 1ª fase da tensão com uma fonte de alimentação trifásica 380V. Para coordenar com o controlador, é utilizado um relé intermediário com um enrolamento de 220V ou um acoplador óptico composto por um LED e um fotorresistor GL5516 ou um acoplador PC817. Todas as opções foram testadas. O LED é alimentado por uma tensão retificada com limitação de corrente usando dois capacitores CBB22 projetados para uma tensão de 630V e conectados em série para segurança durante a verificação aleatória de circuitos com um megaohmímetro.
Lendo o tempo de operação usando a tela LCD do ST7735S, transmitindo dados em tempo real pelo ar usando o módulo E01-ML01DP05 a uma frequência de 2,4 MHz. Este dispositivo contém um chip nRF24L01 + e um amplificador de recebimento e recepção RFX2401C,
potência de saída de até 100 mW. Antenas em espiral projetadas para o intervalo desejado na calculadora on-line do
site . A escolha do tipo de antena deve-se à exclusão da recepção de ondas refletidas das estruturas metálicas circundantes. As peças da antena são impressas em uma impressora 3D. O estado atual dos contadores é armazenado na EEPROM do próprio controlador e é restaurado em caso de falta de energia inesperada. Os intervalos de tempo para contagem são fornecidos pelo chip RTC DS3231 na forma de um módulo com uma bateria de reserva. Três módulos são usados na fonte de alimentação, a própria fonte de pulso HLK-PM01 600mA 220 / 5V, o conversor
HW-553 e
03962A de 1-5V a 5V são um controlador de bateria com
um circuito de proteção contra curto-circuito, descarga excessiva e sobrecarga. Todos os componentes foram adquiridos no site Aliexpress.
Contador de 4 canais. Nas entradas existem filtros LC para proteger contra interferências em uma linha de comunicação de par trançado. Os dados sobre o estado dos objetos de controle são lidos constantemente 1 vez por segundo, exibidos em cores no LCD. As leituras são atualizadas e gravadas na memória não volátil a cada 36 segundos. 36 seg. São 1/100 horas, é neste formato que os dados são necessários. A cada 12 segundos as informações são transmitidas no número de segundos de operação de cada unidade de controle. A memória EEPROM possui um número limitado de ciclos de gravação e apagamento, de acordo com o fabricante, 100.000 vezes. A pior opção é quando pelo menos uma célula está sendo constantemente atualizada. O tamanho do primeiro contador é de 4 bytes, este é um número de formato longo, 4 contadores, um total de 16 bytes ocupa um registro. O comprimento da memória do chip é 1024 bytes. Após 64 entradas de 4 contadores, a gravação será iniciada novamente. Na biblioteca EEPROM, o método EEPROM.put não registra, se o valor da célula e as informações gravadas forem correspondentes, não haverá degradação das células. Como resultado, o tempo operacional garantido da memória será superior a 7 anos. O tempo de trabalho possível, mas injustificado, pode ser muito maior.
Programa no IDE do Arduino// 12 328 bytes (38%)
#include <Adafruit_GFX.h> // Biblioteca de gráficos principais
#include <Adafruit_ST7735.h> // Biblioteca específica de hardware
#include <SPI.h>
#include <EEPROM.h>
#include <Wire.h>
#include <nRF24L01.h>
#include <RF24.h>
Rádio RF24 (9, 10); // objeto de rádio para trabalhar com a biblioteca RF24,
// e números de pinos nRF24L01 + (CE, CSN)
#include <DS3231.h>
DS3231 rtc (SDA, SCL);
Tempo t;
// # define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // você também pode conectar isso à redefinição do Arduino
// nesse caso, defina esse #define pin como -1!
// # define TFT_DC 9 // DC = RS = A0- opções para designar a saída da escolha do registro de comandos ou dados.
#define TFT_DC 3
Adafruit_ST7735 tft = Adafruit_ST7735 (TFT_CS, TFT_DC, TFT_RST);
// Opção 2: use quaisquer pinos, mas um pouco mais devagar!
#define TFT_SCLK 13 // defina-os como os pinos que você quiser!
#define TFT_MOSI 11 // defina-os como os pinos que você quiser!
// Adafruit_ST7735 tft = Adafruit_ST7735 (TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#include <avr / wdt.h>
desvio de bytes = 52;
byte pinState;
bomba longa não assinada [4]; // matriz com contagem de 4 segundos
flutuador m = 3600,0;
endereço int não assinado = 0;
int rc; // variável para contadores
sumprim longo não assinado = 0;
sumsec longo não assinado = 0;
byte i = 0;
byte k = 34;
int sem sinal z = 0;
byte b = B00000001;
byte pumrcounter [4]; // array para armazenar os estados dos objetos, 1- off, 0- on
int start = 0; //
configuração nula () {
rtc.begin ();
radio.begin (); // Iniciar a operação nRF24L01 +
radio.setChannel (120); // canal de transmissão de dados (de 0 a 127).
radio.setDataRate (RF24_250KBPS); // taxa de transferência de dados (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel (RF24_PA_MAX); // potência do transmissor (RF24_PA_MIN = -18dBm, RF24_PA_LOW = -12dBm,
// RF24_PA_HIGH = -6dBm, RF24_PA_MAX = 0dBm)
radio.openWritingPipe (0xAABBCCDD11LL); // Abra o pipe com o identificador para transferência de dados
// Para definir a hora, remova o comentário das linhas necessárias
//rtc.setDOW(1); // dia da semana
//rtc.setTime(21, 20, 0); // Hora, no formato de 24 horas.
//rtc.setDate(29, 10, 2018); // Data, 29 de outubro de 2018
tft.initR (INITR_BLACKTAB); // inicialize um chip ST7735S, aba preta
// Use este inicializador (descomente) se você estiver usando um TFT de 1,44 "
//tft.initR(INITR_144GREENTAB); // inicializa um chip ST7735S, guia RED rcB
tft.setTextWrap (false); // Permite que o texto saia da borda direita
tft.setRotation (2); // para BLACK PCB e RED tft.setRotation (0) ou não.
tft.fillScreen (ST7735_BLACK); // limpa a tela
DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // trabalhos de aperto de software, alto
// objetos monitorados “não funcionam”, “1” é gravado nas 4 portas seniores de D, a conta não vai.
para (rc = 0; rc <4; rc ++)
{
tft.setCursor (3, rc * 10 + shift); // exibe o número de posições dos objetos de controle
tft.print (rc + 1);
}
tft.setCursor (12, 0); // gera 3 linhas de texto
tft.println ("DESENVOLVEDORES E CONSTRUTORES"); // para elogiar seus entes queridos
tft.setCursor (24, 10); // ou direitos autorais mal
tft.print ("DEVELOPER MM");
tft.setCursor (28, 20);
tft.print ("BUILD-ER DD");
// recuperação de dados //////////////////////////////////////////////// ///////////
for (z = 0; z <1023; z + = 16) {// Repete todas as células de sua indústria
// e grava na matriz de 4 variáveis pump, 4 bytes cada contador, porque
// variável sem assinatura por muito tempo. Contadores 4, um registro de todos os 4 leva 16 bytes.
EEPROM.get (z, bomba [0]); // então, sem um loop for, menos volume
EEPROM.get (z + 4, bomba [1]);
EEPROM.get (z + 8, bomba [2]);
EEPROM.get (z + 12, bomba [3]);
// atribuição de um novo próximo valor da soma dos contadores 4-x
sumprim = (bomba [0] + bomba [1] + bomba [2] + bomba [3]);
// compara o novo valor da soma de 4 contadores na variável sumprim com o valor anterior na variável
// sumsec e se o valor anterior for menor ou igual à nova soma, um novo maior ou igual será atribuído
// valor sumsec.
if (sumsec <= sumprim) {
sumsec = sumprim; //
// e o valor atual z é atribuído à variável de endereço, z é o endereço do início do bloco de 16 bytes de 4 valores
// contadores gravados ao mesmo tempo (porque ao pesquisar uma porta, todos os seus 8 bits são gravados simultaneamente
// incluindo nossos 4 bits altos desejados da porta D).
endereço = z;
}
}
// Mais uma vez, o acesso à memória epromprom no endereço inicial do bloco é de 16 bytes a partir de 4 valores dos contadores registrados
// last, i.e. valores antes de desligar ou reiniciar devido a um travamento. Gravar por último
// valores dos contadores para uma matriz de 4 variáveis pump.
EEPROM.get (endereço, bomba [0]);
EEPROM.get (endereço + 4, bomba [1]);
EEPROM.get (endereço + 8, bomba [2]);
EEPROM.get (endereço + 12, bomba [3]);
endereço + = 16; // aumenta o endereço para escrever o próximo bloco sem substituir os dados do último registro
// fim da recuperação de dados /////////////////////////////////////////////// /////////////////////
attachInterrupt (0, count, RISING); // pino D2, ativa a operação de interrupção, a cada segundo que eles chegam
// pulsos do RTC DS3231 da saída SQW
wdt_enable (WDTO_8S); // inicia o timer do watchdog, reinicia o controlador em caso de paralisação, hora,
// para o qual você precisa enviar o comando wdt_reset timer reset (e evite reiniciar durante a operação normal - 8 segundos).
// para testes, não é recomendável definir o valor para menos de 8 segundos.Neste caso, o timer é redefinido antes
// cavando, e a cada segundo.
}
loop vazio () {
// ciclo vazio, aqui haverá controle sobre o modo de operação fora de fase do motor elétrico
}
contagem de nulos () {
tft.setTextColor (ST7735_WHITE); // define a cor da fonte
t = rtc.getTime (); // tempo de leitura
tft.setCursor (5, 120); // define a posição do cursor
tft.fillRect (5, 120, 50, 7, ST7735_BLACK); // limpar a área de saída de tempo
tft.print (rtc.getTimeStr ()); // horas de exibição
wdt_reset (); // redefine o timer do watchdog a cada ciclo, ou seja, um segundo
for (rc = 0; rc <4; rc ++) // início do loop para verificar o estado da entrada
// bits da porta para o status de leitura anterior dos bits da porta D
{
pinState = (PIND >> 4) & (b << rc);
if (pumrcounter [rc]! = pinState) {// e se não corresponder, então
pumrcounter [rc] = pinState; // atribui a variável de estado do bit da porta ao novo valor 1/0
}
// indicação do status dos objetos de controle de cores
// AZUL é uma pequena falha na tela existente (ou biblioteca?), RGB e BGR são misturados.
if (pinState == (b << rc)) {
tft.fillRect (15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // para contas de baixo nível, altere VERDE para AZUL
} mais {
tft.fillRect (15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // para uma conta de nível baixo, altere AZUL para VERDE
bomba [rc] + = 1; // adiciona 1 segundo ao contador de tempo de execução
}
}
k ++;
se (k == 36) {
k é 0;
tft.fillRect (30, shift, 97, 40, ST7735_BLACK); // limpe a área de saída do tempo de execução
tft.fillRect (60, 120, 73, 7, ST7735_BLACK); // e datas
tft.setCursor (60, 120); // define a posição do cursor
tft.print (rtc.getDateStr ()); // exibe a data na tela LCD
for (rc = 0; rc <4; rc ++) // gera leituras de tempo de operação em números inteiros, décimos e
{
tft.setCursor (30, rc * 10 + shift); // centésimos de hora com um deslocamento de 10 pixels na tela
tft.println (bomba [rc] / m);
}
// grava valores de tempo de operação "brutos" (em segundos) na EEPROM ////////////////////////////
para (rc = 0; rc <4; rc ++)
{
EEPROM.put (endereço, bomba [rc]);
endereço + = sizeof (float); // incrementa a variável de endereço de registro
}
}
// envia dados através do ar a partir de dados indicando quantos bytes enviar.
if ((k == 6) || (k == 18) || (k == 30)) {
dados longos não assinados;
radio.write (& start, sizeof (start));
para (i = 0; i <4; i ++) {
dados = bomba [i];
radio.write (& data, sizeof (data));
}
}
}
Alguns comentários no final. A conta entra em um nível lógico baixo nas entradas.
Resistências de suspensão R2-R5 36 kOhm para versão com foto-resistores GL5516. No caso de optoacopladores e relés de fototransistor, forneça 4,7-5,1 kOhm. O carregador de inicialização do Arduino Nano v3.0 foi substituído pelo Arduino Uno usando o programador TL866A para a operação correta do watchdog. Os fusíveis são corrigidos para operar com tensões acima de 4,3 V. O circuito de redefinição externa R6 C3 não foi usado. No programa de exemplo, a frequência do transmissor não corresponde à faixa não licenciada, a faixa de 2,4 MHz é limitada às frequências 2400,0-2483,5 MHz.
O alcance do transmissor do E01-ML01DP05 é de 2400-2525 MHz. A largura de banda de um canal é de 1 MHz, ao definir a velocidade como "RF24_2MBPS", o canal radio.setChannel (120) especificado e o próximo, ou seja, a banda será de 2 MHz.
Continuação