Sistema de recollida de datos autónomo local

A empresa comprou postos de vixilancia NEKST-M, producidos no país por Next Technologies. Para garantir a visualización do funcionamento das unidades de bombeo,
alarmas de incendio e seguridade, presenza de tensión nos arrancadores, temperatura ambiente, nivel de auga de emerxencia. O corazón de NEKST-M é ATMEGA 1280 e este feito é alentador en canto á posibilidade de crear o seu propio kit para necesidades específicas.

Estableceuse a tarefa de crear un sistema de despacho local totalmente autónomo para necesidades específicas no menor tempo posible e cun custo mínimo. A base é un microcontrolador. Desenvolvemento, fabricación, creado polo propio persoal.

O sistema deberá funcionar sen dependencia de redes móbiles, servidores, Internet e do sistema de licenzas para o uso de recursos de radiofrecuencia, non utilizar ordenadores no funcionamento do sistema de vixilancia e control nin, como máximo, utilizar periodicamente ordenadores portátiles, sen acceso a obxectos durante moito tempo (6-9 meses). A configuración da rede ten unha estrutura radial. Os datos recóllense nun momento e despois envíanse para procesar a través de canles de comunicación habituais ou como copia impresa.

O sistema debe proporcionar:

  • vixiar o funcionamento das unidades de bombeo
  • automatización tecnolóxica
  • protección contra as consecuencias das condicións de emerxencia
  • sinalización de emerxencia
  • cálculo do tempo de funcionamento
  • calculando a cantidade de electricidade consumida
  • control de temperatura dos equipos
  • seguridade e alarma contra incendios
  • gravación remota periódica de información
  • requisitos futuros descoñecidos

Condicións de traballo:

  • área de cobertura 1 km².
  • visibilidade directa entre obxectos
  • temperatura de +50 a -50 C
  • humidade ata o 100%
  • depósitos bioloxicamente activos (moho, bacterias sulfato-redutores)
  • vibración, non máis, de máquinas de clases 1-2 segundo GOST ISO 10816-1-97
  • ambiente electromagnético: conmutación de motores eléctricos con contactores KT 6053, equipos de arranque suave RVS-DN, equipos de control SIEMENS MICROMASTER PID, radiación na gama ISM e GSM segundo os requisitos destes dispositivos, soldadura manual por arco no lugar.
  • tensión excesiva da rede, interrupcións de curta duración na subministración de enerxía, sobretensións por raios, desequilibrio de fase cando se rompe un cable de liña aérea en redes de distribución de 6-10 kV.

A pesar dos requisitos tan rigorosos, a implementación é bastante sinxela ao resolver o problema paso a paso.

Tendo todo en conta, a placa "Arduino Nano 3.0" converteuse no "cerebro" do plan. A placa robotdyn ten un controlador ATMEGA 328, o necesario estabilizador de voltaxe de 3,3 V para
actual 800 mA e convertidor a CH340G UART-USB.

En primeiro lugar, creáronse os contadores de horas de funcionamento como os máis actualizados. Os medidores industriais usados ​​anteriormente montados en PIC cun circuíto de alimentación sen transformador fallaron debido a subidas de tensión nun ano de funcionamento. Só os conectados con fontes de alimentación de 5 V caseiras permaneceron intactos. Para acelerar a instalación e a versatilidade da conexión, tómase un sinal sobre o estado das unidades dos terminais dos dispositivos de conmutación, é dicir. rexistro da presenza da tensión de 1a fase cunha fonte de alimentación trifásica de 380V. Para coordinar co controlador, utilízase un relé intermedio cun bobinado de 220V ou un optoacoplador composto por un LED e unha fotorresistencia GL5516 ou un optoacoplador PC817. Probáronse todas as opcións. O LED é alimentado por unha tensión rectificada con limitación de corrente utilizando dous capacitores SVV22 deseñados para unha tensión de 630V conectados en serie para seguridade durante as probas accidentais dos circuítos cun megaohmetro.
Lectura de lecturas de tempo de funcionamento mediante a pantalla LCD ST7735S, transmisión de datos en tempo real por radio mediante o módulo E01-ML01DP05 a unha frecuencia de 2,4 MHz. Este dispositivo contén o chip nRF24L01+ e o amplificador de transmisión/recepción RFX2401C,
potencia de saída ata 100 mW. Antenas helicoidais deseñadas para o rango desexado na calculadora en liña sitio. A elección do tipo de antena está determinada pola exclusión da recepción de ondas reflectidas individualmente das estruturas metálicas circundantes. As pezas da antena están impresas nunha impresora 3D. O estado actual dos contadores gárdase na EEPROM do propio controlador e restablece no caso de que se produza un corte de enerxía inesperado. O chip RTC DS3231 proporciona os intervalos de tempo para o reconto en forma de módulo cunha batería de respaldo. A fonte de alimentación usa 3 módulos, a fonte de pulso real 220/5V HLK-PM01 600mA, un conversor de 1-5V a 5V HW-553 и 03962A - controlador de batería con esquema protección contra curtocircuítos, sobredescarga e sobrecarga. Todos os compoñentes foron adquiridos no sitio web de Aliexpress.

Taboleiro de panSistema de recollida de datos autónomo local
Contador de 4 canles. Hai filtros LC nas entradas para protexer contra interferencias nunha liña de comunicación de par trenzado. Os datos sobre o estado dos obxectos de control lense constantemente unha vez por segundo e móstranse en cor na pantalla LCD. As lecturas actualízanse e grávanse na memoria non volátil cada 1 segundos. 36 segundos son 36/1 de hora, este é o formato no que se requiren os datos. Cada 100 segundos. transmítese información sobre o número de segundos de operación de cada unidade de control. A memoria EEPROM ten un número limitado de ciclos de escritura-borrado, segundo o fabricante, 12 veces. A peor opción é cando polo menos unha cela se actualiza constantemente. O volume do primeiro contador é de 100000 bytes, este é un número de formato longo, 1 contadores, un total de 4 bytes está ocupado por un rexistro. A lonxitude da memoria do chip é de 4 bytes; despois de 16 entradas de 1024 contadores, a gravación comezará de novo. Na biblioteca EEPROM, o método EEPROM.put non escribe; se o valor da cela e a información que se escribe coinciden, non haberá degradación das celas. Como resultado, o tempo de funcionamento da memoria garantida será de máis de 64 anos. O tempo de traballo posible pero non garantido pode ser moito máis longo.

Diagrama de circuítoSistema de recollida de datos autónomo local
Programa en Arduino IDE//12 bytes (328%)

#incluír // Biblioteca de gráficos básicos
#incluír // Biblioteca específica de hardware
#incluír
#incluír
#incluír
#incluír
#incluír
radio RF24 (9, 10); // obxecto de radio para traballar coa biblioteca RF24,
// e números de pin nRF24L01+ (CE, CSN)
#incluír
DS3231 rtc (SDA, SCL);
Tempo t;

//#definir TFT_CS 10
#definir TFT_CS 8
#define TFT_RST -1 // tamén podes conectar isto ao restablecemento de Arduino
// nese caso, pon este #define pin a -1!
//#define TFT_DC 9 // DC=RS=A0 - opcións de designación para seleccionar un comando ou rexistro de datos.
#definir TFT_DC 3

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

// Opción 2: use calquera alfinete pero un pouco máis lento!
#define TFT_SCLK 13 // configura estes para que sexan os pinos que che gusten!
#define TFT_MOSI 11 // configura estes para que sexan os pinos que che gusten!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#incluír

desprazamento de bytes = 52;
byte pinState;
bomba longa sen asinar[4];// matriz con valores de contador de 4 segundos
flotante m = 3600.0;
enderezo int sen signo = 0;
int rc;// variable para contadores
suma longa sen asinar = 0;
suma longa sen signo = 0;
byte i = 0;
byte k = 34;
int sen signo z = 0;
byte b = B00000001;
contador de bytes[4]; // matriz para almacenar os estados dos obxectos, 1 - off, 0 - on.
int inicio = 0; //

configuración nula () {

rtc.begin();
radio.begin(); // Iniciar o traballo nRF24L01+
radio.setChannel(120); // canle de datos (de 0 a 127).
radio.setDataRate(RF24_250KBPS); // taxa de transferencia de datos (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // Potencia do transmisor (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Abrir unha canalización cun identificador para a transferencia de datos

// Para axustar a hora, descomenta as liñas necesarias
//rtc.setDOW(1); // Día da semana
//rtc.setTime(21, 20, 0); // Hora, en formato de 24 horas.
//rtc.setDate(29, 10, 2018); // Data, 29 de outubro de 2018

tft.initR(INITR_BLACKTAB); // inicializa un chip ST7735S, pestana negra
// Use este inicializador (descomente) se está a usar un TFT de 1.44".
//tft.initR(INITR_144GREENTAB); // inicializa un chip ST7735S, pestana RCB RED
tft.setTextWrap(false); // Permitir que o texto corra polo bordo dereito
tft.setRotation( 2 ); // para BLACK PCB e RED tft.setRotation(0) ou non.
tft.fillScreen(ST7735_BLACK); // Borrar a pantalla

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // o apriete do software funciona, de alto nivel -
// os obxectos controlados "non funcionan", "4" escríbese nos 1 portos superiores D, non se fai conta.

para ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // mostrando os números de posición dos obxectos de control
tft.print(rc + 1);
}

tft.setCursor(12, 0); // sae 3 liñas de texto
tft.println("DESENVOLVADORES E CONSTRUIR"); // loubarse os seres queridos
tft.setCursor(24, 10); // ou copyright malvado
tft.print("DEVELADOR MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//recuperación de datos//////////////////////////////////////////////////////////////////////////// ///////////

for ( z = 0; z < 1023; z += 16 ) { // Itera por todas as celas da industria
//e escribe nunha matriz de 4 variables de bomba, 4 bytes para cada contador, porque
// variable longa sen asinar. Hai 4 contadores, un rexistro dos 4 leva 16 bytes.
EEPROM.get(z, bomba[0]); // polo tanto, sen o bucle for, menos volume
EEPROM.get(z+4, bomba[1]);
EEPROM.get(z+8, bomba[2]);
EEPROM.get(z+12, bomba[3]);

// asignando un novo valor seguinte para a suma de 4 contadores
sumprim = (bomba [0] + bomba [1] + bomba [2] + bomba [3]);

// compara o novo valor da suma de 4 contadores da variable sumprim co valor anterior da variable
// sumasec e se a suma anterior é menor ou igual á nova suma, asígnase a nova maior ou igual
// valor sumasec.

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

//e o valor actual z asígnase á variable de enderezo, z é o enderezo do inicio dun bloque de 16 bytes de 4 valores
// contadores rexistrados ao mesmo tempo (xa que ao sondear un porto, os 8 bits do mesmo escríbense simultaneamente,
// incluíndo os nosos 4 bits altos necesarios do porto D).
enderezo = z;
}
}

// unha vez máis accedendo á memoria eeprom no enderezo do inicio dun bloque de 16 bytes de 4 valores de contador rexistrados
// último, é dicir. valores antes de apagar ou reiniciar debido á conxelación. Gravando o último
// conta os valores nunha matriz de 4 variables.

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

enderezo += 16; //aumentando o enderezo para escribir o seguinte bloque sen sobrescribir os datos do último rexistro

//fin da recuperación de datos///////////////////////////////////////////////////////////////////////// //////////////////

attachInterrupt(0, conta, CRECE); // pin D2, activa as interrupcións, chega cada segundo
// pulsos do RTC DS3231 da saída SQW

wdt_enable(WDTO_8S); // inicia o temporizador de vixilancia, reinicia o controlador en caso de conxelación, tempo,
// para o que cómpre emitir o comando de reinicio do temporizador wdt_reset (e evite o reinicio durante o funcionamento normal - 8 seg.
// para as probas non se recomenda establecer o valor a menos de 8 segundos. Neste caso, o temporizador reiniciarase preferentemente
// sacudindo, e ocorre cada segundo.

}

bucle baleiro () {
// ciclo baleiro, aquí haberá control sobre o funcionamento en fase aberta do motor eléctrico
}

conta nula() {

tft.setTextColor(ST7735_WHITE); // establece a cor da fonte
t = rtc.getTime(); // hora de lectura
tft.setCursor(5, 120); // establecendo a posición do cursor
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // borrando a área de saída do tempo
tft.print(rtc.getTimeStr()); // saíu as lecturas do reloxo

wdt_reset(); // restablece o watchdog cada ciclo, é dicir, segundo

for (rc = 0; rc < 4; rc ++) // inicio do ciclo para comprobar o cumprimento do estado de entrada
// bits do porto ao estado de lectura anterior dos bits do porto D
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // e se non coincide, entón
pumrcounter[rc] = pinState; // asignando á variable de estado do bit do porto un novo valor 1/0
}
// indicación do estado dos obxectos de control de cor
// O AZUL é un pequeno fallo da pantalla (ou da biblioteca?), RGB e BGR mestúranse.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + maiúsculas)), 7, 7, ST7735_BLUE); // para o conteo de baixo nivel cambia de VERDE a AZUL
Else {}
tft.fillRect(15, ((rc * 10 + maiúsculas)), 7, 7, ST7735_GREEN); // para o conteo de baixo nivel cambia de AZUL a VERDE
bomba [rc] += 1; // engade 1 segundo ao contador de tempo de funcionamento
}
}

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

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // borrando a área de visualización do tempo de funcionamento
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // e datas

tft.setCursor(60, 120); // establecendo a posición do cursor
tft.print(rtc.getDateStr()); // amosar a data na pantalla LCD

para (rc = 0; rc < 4; rc ++) //resume horas de funcionamento enteiras, décimas e
{
tft.setCursor ( 30, rc * 10 + shift ); // centésimas de hora cun desprazamento da pantalla 10 píxeles cara abaixo
tft.println(bomba [rc] / m);
}

// escribindo valores de horas de funcionamento "en bruto" (en segundos) na EEPROM ///////////////////////////////

para (rc = 0; rc < 4; rc++)
{
EEPROM.put(enderezo, bomba [rc]);
enderezo += sizeof(float); // incrementa a variable do enderezo de escritura
}
}

// enviar datos pola canle de radio a partir de datos que indican cantos bytes se deben enviar.
se ((k == 6 ) || (k == 18 ) || (k == 30 )) {

datos longos sen asinar;

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

para (i = 0; i < 4; i++) {
datos = bomba [i];
radio.write( &datos, sizeof(datos));
}
}
}

Algunhas notas ao final. O reconto ocorre nun nivel lóxico baixo nas entradas.

As resistencias de pull-up R2-R5 son 36 kOhm para a opción con fotorresistencias GL5516. No caso dun optoacoplador e relé de fototransistor, axuste a 4,7-5,1 kOhm. O cargador de arranque Arduino Nano v3.0 substituíuse polo Arduino Uno mediante o programador TL866A para o correcto funcionamento do temporizador de vixilancia. Os fusibles corríxense para que funcionen con tensións superiores a 4,3 V. Non se utilizou o circuíto de reinicio externo R6 C3. No programa de mostra, a frecuencia do transmisor non corresponde ao rango sen licenza; o rango de 2,4 MHz está limitado ás frecuencias 2400.0-2483.5 MHz.

O rango do transmisor E01-ML01DP05 é de 2400-2525 MHz. O ancho de banda dunha canle é de 1 MHz, ao definir a velocidade como "RF24_2MBPS" ocuparase a canle radio.setChannel(120) especificada e a seguinte, é dicir. a banda será de 2 MHz.

Fonte: www.habr.com

Engadir un comentario