Sistema local autônomo de coleta de dados

Na empresa foram adquiridos postos de monitoramento NEXTEK de fabricação nacional "Next Technologies". Para garantir a visualização do funcionamento dos conjuntos de bombas,
sistema de alarme de incêndio e segurança, presença de tensão nos contactores, temperatura no ambiente, nível de água de emergência. O núcleo do NEXTEK é o ATMEGA 1280 e esse fato trouxe esperança em relação à possibilidade de criar um kit sob necessidades específicas.

Foi estabelecida a tarefa de criar uma sistema totalmente autônoma de despacho local sob necessidades específicas em um tempo mínimo e com custos mínimos. A base é um microcontrolador. O desenvolvimento e a fabricação são realizados pela própria equipe.

O sistema deve operar sem depender de redes celulares, servidores, da internet e de um sistema permissivo de uso de recursos de radiofrequência, não deve usar computadores no controle e gerenciamento, ou no máximo fazer uso periódico de notebooks, sem acesso às instalações por um longo tempo (6-9 meses). A configuração da rede possui uma estrutura radial. Os dados são coletados em um único ponto e, em seguida, enviados para processamento através de canais de comunicação comuns ou em forma de cópia física.

O sistema deve garantir:

  • o monitoramento do funcionamento das instalações de bombeamento
  • a automação tecnológica
  • a proteção contra as consequências de modos de falha
  • o sinal de alerta sobre modos de falha
  • a contagem do tempo de operação
  • a contagem do volume de energia consumida
  • o controle da temperatura do equipamento
  • o alarme de segurança e incêndio
  • a coleta periódica de informações à distância
  • requisitos desconhecidos no futuro

Condições de operação:

  • área de cobertura de 1 m².
  • visibilidade direta entre os objetos
  • temperatura de +50 a -50 °C
  • umidade até 100%
  • precipitações biologicamente ativas (mofo, bactérias redutoras de sulfato)
  • vibrações, no máximo, máquinas de classes 1-2 de acordo com a norma GOST ISO 10816-1-97
  • ambiente eletromagnético - comutação de motores elétricos por contatores KT 6053, equipamento de partida suave RVS-DN, equipamentos de controle PID SIEMENS MICROMASTER, emissões nas faixas ISM e GSM de acordo com os requisitos desses dispositivos, soldagem por arco manual no local
  • sobre tensão de rede, interrupções temporárias de fornecimento de energia, sobretensões devido a raios, desbalanceamento de fases em caso de quebra de fio de linha nas redes de distribuição de 6 a 10 kV.

Apesar de tais requisitos rigorosos, a implementação é bastante simples quando a tarefa é abordada em etapas.

Levando em consideração tudo, a "cabeça" do sistema projetado é a placa "Arduino Nano 3.0". A placa da "Robotdyn" possui o controlador ATMEGA 328 e o estabilizador de tensão necessário de 3,3V para
uma corrente de 800 mA e o conversor CH340G UART-USB.

Primordialmente, foram criados contadores de tempo de operação como os mais relevantes. Os contadores industriais anteriormente utilizados, montados em PICs com esquema de alimentação sem transformador, falharam devido a picos de tensão em um ano de operação. Apenas os conectados por meio de fontes de alimentação pessoais de 5V permaneceram intactos. Para acelerar a montagem e a versatilidade da conexão, o sinal de estado dos equipamentos é obtido a partir dos terminais de comutação, ou seja, a detecção da presença da 1ª fase de tensão em alimentação trifásica de 380V. Para compatibilizar com o controlador, um relé intermediário com bobina de 220V ou um optoacoplador composto por um LED e um fot resistor GL5516 ou um optoacoplador PC817 é utilizado. Todas as opções foram testadas em operação. O LED é alimentado por tensão retificada com limitação de corrente usando dois capacitores SVV22, projetados para uma tensão de 630V, conectados em série para segurança durante a verificação acidental dos circuitos com o megaohmímetro.
A leitura do tempo de operação é feita utilizando uma tela LCD ST7735S, com transmissão de dados em tempo real via rádio usando o módulo E01-ML01DP05 na frequência de 2,4 GHz. Este dispositivo contém o chip nRF24L01+ e um amplificador de recepção-transmissão RFX2401C,
com potência de saída de até 100 mW. As antenas são espirais, projetadas para a faixa necessária em um calculador online. do site. A escolha do tipo de antenas é baseada na exclusão da recepção de ondas refletidas uma vez pelas estruturas metálicas circundantes. As partes das antenas são impressas em uma impressora 3D. O estado atual dos contadores é armazenado na EEPROM do próprio controlador e é restaurado em caso de desligamento inesperado da energia. Os intervalos de tempo para contagem são fornecidos pelo circuito integrado RTC DS3231 na forma de um módulo com bateria de backup. O BPS utiliza 3 módulos, sendo uma fonte impulsionada de 220/5V HLK-PM01 600mA, um conversor de 1-5V para 5V HW-553 e 03962A — controlador de bateria que possui um esquema de proteção contra curto-circuito, descarga excessiva e sobrecarga. Todos os componentes foram comprados no site Aliexpress.

Placa de protótipoSistema local autônomo de coleta de dados
Contador de 4 canais. Filtros LC estão instalados nas entradas para proteção contra interferências na linha de comunicação a partir do par trançado. Os dados sobre o estado dos objetos de controle são constantemente lidos 1 vez por segundo e exibidos em cores no LCD. A atualização das leituras e gravação na memória não volátil ocorre a cada 36 segundos. 36 segundos é 1/100 de hora, exatamente nesse formato os dados são exigidos. A cada 12 segundos, ocorre a transmissão de informações sobre o número de segundos de operação de cada unidade de controle. A memória EEPROM tem um número limitado de ciclos de gravação - apagamento, segundo o fabricante, 100000 vezes. O pior cenário é quando há atualização constante de pelo menos uma célula. O tamanho de 1 contador é 4 bytes, que são números no formato long, 4 contadores, totalizando 16 bytes ocupando uma gravação. O comprimento da memória do chip é de 1024 bytes, após 64 gravações dos 4 contadores a gravação começará novamente. Na biblioteca EEPROM, o método EEPROM.put não realiza gravação se o valor da célula coincidir com a informação a ser gravada, não haverá degradação das células. Como resultado, o tempo de trabalho garantido da memória será superior a 7 anos. O tempo de funcionamento possível, mas não garantido, pode ser muito maior.

Esquema principalSistema local autônomo de coleta de dados
Programa no Arduino IDE//12 328 байт (38%)

#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#include <EEPROM.h>
#include <Wire.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 10); // objeto radio para trabalhar com a biblioteca RF24,
// и номера выводов nRF24L01+ (CE, CSN)
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Time t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // you can also connect this to the Arduino reset
// in which case, set this #define pin to -1!
//#define TFT_DC 9 // DC=RS=A0- варианты обозначений вывода выбора регистра команд или данных.
#define TFT_DC 3

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

// Option 2: use any pins but a little slower!
#define TFT_SCLK 13 // set these to be whatever pins you like!
#define TFT_MOSI 11 // set these to be whatever pins you like!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#include <avr/wdt.h>

byte shift = 52;
byte pinState;
unsigned long pump[4]; // array com 4 valores dos contadores de segundos
float m = 3600.0;
unsigned int address = 0;
int rc; // variável para contadores
unsigned long sumprim = 0;
unsigned long sumsec = 0;
byte i = 0;
byte k = 34;
unsigned int z = 0;
byte b = B00000001;
byte pumrcounter [4]; // array para armazenar os estados dos objetos, 1 - desligado, 0 - ligado.
int start = 0; //

void setup() {

rtc.begin();
radio.begin(); // Iniciamos o funcionamento do nRF24L01+
radio.setChannel(120); // canal de transmissão (de 0 a 127).
radio.setDataRate(RF24_250KBPS); // taxa de transmissão (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); // Abrindo o tubo com o identificador para transmissão de dados

// Для установки времени- раскомментировать нужные строки
//rtc.setDOW(1); // День недели
//rtc.setTime(21, 20, 0); // Время, в формате 24 часа.
//rtc.setDate(29, 10, 2018); // Дата, 29 октября 2018г.

tft.initR(INITR_BLACKTAB); // inicializar um chip ST7735S, aba preta
// Use this initializer (uncomment) if you’re using a 1.44" TFT
//tft.initR(INITR_144GREENTAB); // initialize a ST7735S chip, RED rcB tab
tft.setTextWrap(false); // Permitir que o texto continue fora da borda direita
tft.setRotation(2); // para PCB PRETO e TFT VERMELHO. Use tft.setRotation(0) se não.
tft.fillScreen(ST7735_BLACK); // limpar a tela

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // o pull-up programático está ativo, nível alto
// контролируемые объекты «не работают», во все 4 старших порта D записана «1», не идет счет.

for (rc = 0; rc < 4; rc++)
{
tft.setCursor(3, rc * 10 + shift); // exibir números de posições de controle de objetos
tft.print(rc + 1);
}

tft.setCursor(12, 0); // exibir 3 linhas de texto
tft.println("DESENVOLVEDORES & BUILD"); // para exaltar nossos queridos
tft.setCursor(24, 10); // ou o odioso copyright
tft.print("DESENVOLVEDOR M.M.");
tft.setCursor(28, 20);
tft.print("BUILD-ER D.D.");

//восстановление данных/////////////////////////////////////////////////////////

for (z = 0; z < 1023; z += 16) { // Percorre todas as células da EEPROM
//и записывает в массив из 4-х переменных pump, по 4 байта каждый счетчик, т.к.
// переменная беззнаковая лонг. Счетчиков 4, одна запись всех 4-х занимает 16 байт.
EEPROM.get(z, pump[0]); // assim, sem o loop for, menos tamanho
EEPROM.get(z + 4, pump[1]);
EEPROM.get(z + 8, pump[2]);
EEPROM.get(z + 12, pump[3]);

// присвоение нового очередного значения суммы 4-x счётчиков
sumprim = (pump[0] + pump[1] + pump[2] + pump[3]);

// сравнивается новое значение суммы 4-х счетчиков в переменной sumprim с предыдущим значением в переменной
// sumsec и если предыдущая сумма меньше или равна новой сумме, присваивается новое большее или равное
// sumsec значение.

if (sumsec <= sumprim) {
sumsec = sumprim; //

//и присваивается переменной address текущее значение z, z- это адрес начала блока в 16 байт из 4-х значений
// счетчиков, записанных в одно и то-же время ( т.к. при опросе порта записываются одновременно все его 8 бит,
// в том числе наши нужные старшие 4 бита порта D).
address = z;
}
}

// еще раз обращение к памяти еепром по адресу начала блока в 16 байт из 4-х значений счетчиков записанных
// последними, т.е. значения перед выключением или перезагрузкой по причине зависания. Запись последних
// значений счетчиков в массив из 4-х переменных pump.

EEPROM.get(address, pump[0]);
EEPROM.get(address + 4, pump[1]);
EEPROM.get(address + 8, pump[2]);
EEPROM.get(address + 12, pump[3]);

address += 16; // aumenta o endereço para gravar o próximo bloco sem sobrescrever os dados da última gravação

// конец восстановления данных////////////////////////////////////////////////////////////////

attachInterrupt(0, count, RISING); // pino D2, habilitação do funcionamento da interrupção, chega a cada segundo
// импульсы от RTC DS3231 с выхода SQW

wdt_enable(WDTO_8S); // inicia o watchdog timer, reinicia o controlador em caso de travamento.
// за которое надо подать команду сброса таймера wdt_reset( и избежать перезагрузки при нормальной работе- 8 сек.
// для тестов не рекомендуется устанавливать значение менее 8 сек.В данном случае сброс таймера происходит в пре-
// рывании, а оно каждую секунду.

}

void loop() {
// пустой цикл, здесь будет контроль за неполнофазным режимом работы эл.двигателя
}

void count() {

tft.setTextColor(ST7735_WHITE); // define a cor da fonte
t = rtc.getTime(); // leitura do tempo
tft.setCursor(5, 120); // define a posição do cursor
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // limpa a área de exibição do tempo
tft.print(rtc.getTimeStr()); // exibe as leituras do relógio

wdt_reset(); // reinicia o watchdog timer a cada ciclo, ou seja, por segundo.

for (rc = 0; rc < 4; rc++) // início do ciclo de verificação de correspondência de estado de entrada
// битов порта предыдущему считанному состоянию битов порта D
{
pinState = (PIND >> 4) & (b << rc);

if (pumrcounter[rc] != pinState) { // e se não corresponder, então
pumrcounter[rc] = pinState; // atribui ao contador o novo estado do bit do porto.
}
// индикация состояния объектов контроля цветом
// BLUE- это небольшой глюк имеющегося экрана ( или библиотеки? ), перепутаны RGB и BGR.
if (pinState == (b << rc)) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // para contagem em nível baixo, altere GREEN para BLUE.
} else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // para contagem em nível baixo, altere BLUE para GREEN.
pump[rc] += 1; // adiciona ao contador de tempo de operação 1 segundo.
}
}

k++;
if (k == 36) {
k = 0;

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // limpa a área de exibição do tempo de operação
tft.fillRect ( 60, 120, 73, 7, ST7735_BLACK); // e datas

tft.setCursor ( 60, 120 ); // definição da posição do cursor
tft.print(rtc.getDateStr()); // exibição da data no display LCD

for (rc = 0; rc < 4; rc ++) //exibição das leituras em unidades inteiras, décimos e
{
tft.setCursor ( 30, rc * 10 + shift ); // centésimos de hora deslocados na tela para baixo em 10 pixels
tft.println(pump [rc] / m);
}

// запись «сырых» значений наработки (в секундах)в EEPROM //////////////////////////////

for (rc = 0; rc < 4; rc ++)
{
EEPROM.put(address, pump [rc]);
address += sizeof(float); // incremento da variável de endereço de gravação
}
}

// отправляем данные по радиоканалу из data указывая сколько байт надо отправить.
if ((k == 6 ) || (k == 18 ) || (k == 30 )) {

unsigned long data;

radio.write(&start, sizeof(start));

for ( i = 0; i < 4; i ++) {
data = pump [i ];
radio.write( &data, sizeof( data));
}
}
}

Pequenas observações no final. A contagem ocorre com nível lógico baixo nas entradas.

As resistências de pull-up R2-R5 são de 36 kΩ para a versão com fototransistores GL5516. No caso de optoacoplador fototransistor e relé, deve-se usar de 4,7 a 5,1 kΩ. O bootloader do Arduino Nano v3.0 foi substituído pelo Arduino Uno usando o programador TL866A para funcionamento correto do temporizador watchdog. Os fuses foram ajustados para operação acima de 4,3 V. O circuito externo de reset R6 C3 não foi utilizado. No exemplo do programa, a frequência do transmissor não corresponde à faixa não licenciada, a faixa de 2,4 GHz é limitada pelas frequências de 2400,0—2483,5 MHz.

A faixa do transmissor E01-ML01DP05 varia de 2400 a 2525 MHz. A largura de banda de um canal é de 1 MHz, e ao configurar a taxa como "RF24_2MBPS" o canal indicado radio.setChannel(120) e o próximo serão ocupados, ou seja, a faixa será de 2 MHz.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster