Sistema autónomo local de recogida de datos.

La empresa compró puestos de monitoreo NEKST-M, producidos en el país por Next Technologies. Para garantizar la visualización del funcionamiento de las unidades de bombeo,
alarmas contra incendio y seguridad, presencia de voltaje en arrancadores, temperatura ambiente, nivel de agua de emergencia. El corazón de NEKST-M es ATMEGA 1280 y este hecho es alentador en cuanto a la posibilidad de crear su propio kit para necesidades específicas.

La tarea era crear un sistema de despacho local totalmente autónomo para necesidades específicas en el menor tiempo posible y con un costo mínimo. La base es un microcontrolador. Desarrollo, fabricación, creado por el propio personal.

El sistema deberá operar sin dependencia de redes celulares, servidores, Internet y del sistema de licencias para el uso de recursos de radiofrecuencia, no utilizar computadoras en la operación del sistema de monitoreo y control o, como máximo, utilizar periódicamente computadoras portátiles, sin acceso a objetos durante mucho tiempo (6-9 meses). La configuración de la red tiene una estructura radial. Los datos se recopilan en un momento y luego se envían para su procesamiento a través de canales de comunicación habituales o en forma impresa.

El sistema debe proporcionar:

  • monitorear el funcionamiento de las unidades de bombeo
  • automatización tecnológica
  • protección contra las consecuencias de las condiciones de emergencia
  • señalización de emergencia
  • cálculo del tiempo de funcionamiento
  • calcular la cantidad de electricidad consumida
  • control de temperatura del equipo
  • seguridad y alarma contra incendios
  • registro remoto periódico de información
  • requisitos futuros desconocidos

Condiciones de trabajo:

  • área de cobertura 1 kmXNUMX.
  • visibilidad directa entre objetos
  • temperatura de +50 a -50 C
  • humedad hasta 100%
  • depósitos biológicamente activos (moho, bacterias reductoras de sulfato)
  • vibración, no más, de máquinas de clases 1-2 según GOST ISO 10816-1-97
  • entorno electromagnético: conmutación de motores eléctricos con contactores KT 6053, equipo de arranque suave RVS-DN, equipo de control PID MICROMASTER SIEMENS, radiación en el rango ISM y GSM según los requisitos de estos dispositivos, soldadura por arco manual en sitio
  • tensión excesiva de la red, interrupciones breves en el suministro de energía, sobretensiones por rayos, desequilibrio de fases cuando se rompe un cable de línea aérea en redes de distribución de 6-10 kV.

A pesar de requisitos tan estrictos, la implementación es bastante sencilla si se resuelve el problema paso a paso.

Teniendo todo en cuenta, la placa “Arduino Nano 3.0” se convirtió en el “cerebro” del plan. La placa robotdyn cuenta con un controlador ATMEGA 328, el estabilizador de voltaje de 3,3V necesario para
Corriente 800 mA y convertidor a CH340G UART-USB.

En primer lugar, se crearon los contadores de horas de funcionamiento como los más modernos. Los medidores industriales utilizados anteriormente ensamblados en PIC con un circuito de suministro de energía sin transformador fallaron debido a sobretensiones dentro de un año de funcionamiento. Sólo aquellos conectados mediante fuentes de alimentación caseras de 5 V permanecieron intactos. Para acelerar la instalación y la versatilidad de la conexión, se toma una señal sobre el estado de las unidades de los terminales de los dispositivos de conmutación, es decir, registro de la presencia de tensión de 1ª fase con alimentación trifásica de 380V. Para coordinar con el controlador se utiliza un relé intermedio con devanado de 220V o un optoacoplador compuesto por un LED y un fotorresistor GL5516 o un optoacoplador PC817. Se probaron todas las opciones. El LED se alimenta con tensión rectificada con limitación de corriente mediante dos condensadores SVV22 diseñados para una tensión de 630V conectados en serie para mayor seguridad durante pruebas accidentales de los circuitos con un megaóhmetro.
Lectura de lecturas de tiempo de funcionamiento mediante la pantalla LCD ST7735S, transmisión de datos en tiempo real vía radio mediante el módulo E01-ML01DP05 a una frecuencia de 2,4 MHz. Este dispositivo contiene el chip nRF24L01+ y el amplificador de transmisión/recepción RFX2401C,
Potencia de salida de hasta 100 mW. Antenas helicoidales diseñadas para el alcance deseado en la calculadora online сайта. La elección del tipo de antena está determinada por la exclusión de la recepción de ondas reflejadas individualmente desde las estructuras metálicas circundantes. Las piezas de la antena están impresas en una impresora 3D. El estado actual de los contadores se almacena en la EEPROM del propio controlador y se restaura en caso de un corte de energía inesperado. Los intervalos de tiempo para contar los proporciona el chip RTC DS3231 en forma de módulo con una batería de respaldo. La fuente de alimentación utiliza 3 módulos, la fuente de pulso real 220/5V HLK-PM01 600mA, un convertidor de 1-5V a 5V HW-553 и 03962A - controlador de batería con esquema Protección contra cortocircuitos, sobredescarga y sobrecarga. Todos los componentes se compraron en el sitio web de Aliexpress.

tabla de panSistema autónomo local de recogida de datos.
Contador de 4 canales. Hay filtros LC en las entradas para proteger contra interferencias en una línea de comunicación de par trenzado. Los datos sobre el estado de los objetos de control se leen constantemente una vez por segundo y se muestran en color en la pantalla LCD. Las lecturas se actualizan y registran en la memoria no volátil cada 1 segundos. 36 segundos es 36/1 de hora, este es el formato en el que se requieren los datos. Cada 100 seg. Se transmite información sobre el número de segundos de funcionamiento de cada unidad de control. La memoria EEPROM tiene un número limitado de ciclos de escritura y borrado, según el fabricante, 12 veces. La peor opción es cuando al menos una celda se actualiza constantemente. El volumen del primer contador es de 100000 bytes, este es un número de formato largo, 1 contadores, un registro ocupa un total de 4 bytes. La longitud de la memoria del chip es de 4 bytes; después de 16 entradas de 1024 contadores, la grabación comenzará de nuevo. En la biblioteca EEPROM, el método EEPROM.put no escribe; si el valor de la celda y la información que se escribe coinciden, no habrá degradación de las celdas. Como resultado, el tiempo de funcionamiento de la memoria garantizado será de más de 64 años. El tiempo de trabajo posible pero no garantizado puede ser mucho mayor.

Diagrama de circuitoSistema autónomo local de recogida de datos.
Programa en Arduino IDE//12 bytes (328%)

#incluir // Biblioteca de gráficos central
#incluir // Biblioteca específica de hardware
#incluir
#incluir
#incluir
#incluir
#incluir
Radio RF24(9, 10); // objeto de radio para trabajar con la biblioteca RF24,
// y números de pin nRF24L01+ (CE, CSN)
#incluir
DS3231 rtc(SDA, SCL);
Tiempo t;

//#definir TFT_CS 10
#definir TFT_CS 8
#define TFT_RST -1 // también puedes conectar esto al reinicio de Arduino
// en cuyo caso, establece este pin #define en -1.
//#define TFT_DC 9 // DC=RS=A0 - opciones de designación para seleccionar un comando o registro de datos.
#definir TFT_DC 3

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

// Opción 2: ¡usa cualquier pin pero un poco más lento!
#define TFT_SCLK 13 // ¡configúralo para que sean los pines que quieras!
#define TFT_MOSI 11 // ¡configúralo para que sean los pines que quieras!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#incluir

desplazamiento de bytes = 52;
byte pinState;
bomba larga unsigned[4];// matriz con valores de contador de 4 segundos
flotador m = 3600.0;
dirección int sin signo = 0;
int rc;// variable para contadores
sumprim largo sin firmar = 0;
suma larga sin firmar = 0;
byte yo = 0;
byte k = 34;
int sin signo z = 0;
byte b = B00000001;
contador de bytes[4]; // matriz para almacenar estados de objetos, 1 - desactivado, 0 - activado.
int inicio = 0; //

configuración nula () {

rtc.begin();
radio.begin(); // Iniciar trabajo nRF24L01+
radio.setChannel(120); // canal de datos (de 0 a 127).
radio.setDataRate(RF24_250KBPS); // tasa de transferencia de datos (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // potencia del transmisor (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Abre una tubería con un identificador para la transferencia de datos.

// Para configurar la hora, descomentar las líneas necesarias
//rtc.setDOW(1); // Día de la semana
//rtc.setTime(21, 20, 0); // Hora, en formato de 24 horas.
//rtc.setDate(29, 10, 2018); // Fecha, 29 de octubre de 2018

tft.initR(INITR_BLACKTAB); // inicializa un chip ST7735S, pestaña negra
// Utilice este inicializador (descomentar) si está utilizando un TFT de 1.44"
//tft.initR(INITR_144GREENTAB); // inicializa un chip ST7735S, pestaña RED rcB
tft.setTextWrap(falso); // Permitir que el texto salga del borde derecho
tft.setRotación( 2 ); // para PCB NEGRO y tft.setRotation(0) ROJO o no.
tft.fillScreen(ST7735_BLACK); // pantalla clara

DDRD = DDRD | B00000000;
PUERTO = PUERTO | B11110000; // el ajuste del software está funcionando, nivel alto -
// los objetos controlados “no funcionan”, se escribe “4” en los 1 puertos superiores D, no se realiza ningún conteo.

para (rc = 0; rc < 4; rc++)
{
tft.setCursor (3, rc * 10 + mayúscula); // muestra los números de posición de los objetos de control
tft.print(rc + 1);
}

tft.setCursor(12, 0); // genera 3 líneas de texto
tft.println("DESARROLLADORES Y CONSTRUCCIÓN"); // para alabarte a ti mismo, seres queridos
tft.setCursor(24, 10); // o derechos de autor malvados
tft.print("DESARROLLADOR MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

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

for ( z = 0; z < 1023; z += 16 ) { // Itera por todas las celdas de la industria
//y escribe en una matriz de 4 variables de bomba, 4 bytes para cada contador, porque
// variable larga sin firmar. Hay 4 contadores, un registro de los 4 ocupa 16 bytes.
EEPROM.get(z, bomba[0]); // entonces, sin el bucle for, menos volumen
EEPROM.get(z+4, bomba[1]);
EEPROM.get(z+8, bomba[2]);
EEPROM.get(z+12, bomba[3]);

// asignando un nuevo valor siguiente para la suma de 4 contadores
sumprim = (bomba [0] + bomba [1] + bomba [2] + bomba [3]);

// compara el nuevo valor de la suma de 4 contadores en la variable sumprim con el valor anterior en la variable
// sumsec y si la suma anterior es menor o igual a la nueva suma se asigna la nueva mayor o igual
// valor sumasec.

si (sumasec <= sumarim) {
sumasec = sumarim; //

//y el valor actual z se asigna a la variable de dirección, z es la dirección del comienzo de un bloque de 16 bytes de 4 valores
// contadores registrados al mismo tiempo (ya que al sondear un puerto, los 8 bits se escriben simultáneamente,
// incluyendo nuestros 4 bits altos necesarios del puerto D).
dirección = z;
}
}

// accediendo nuevamente a la memoria eeprom en la dirección del comienzo de un bloque de 16 bytes de 4 valores de contador registrados
// último, es decir valores antes de apagar o reiniciar debido a una congelación. Grabando lo último
// contador de valores en una matriz de 4 variables pump.

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

dirección += 16; //aumentando la dirección para escribir el siguiente bloque sin sobrescribir los datos del último registro

//fin de la recuperación de datos//////////////////////////////////////////// ///////////////////

adjuntarInterrupción(0, conteo, ASCENDENTE); // pin D2, habilita las interrupciones, viene cada segundo
// pulsos de RTC DS3231 desde la salida SQW

wdt_enable(WDTO_8S); // inicia el temporizador de vigilancia, reinicia el controlador en caso de congelación, tiempo,
// para lo cual debe emitir el comando de reinicio del temporizador wdt_reset( y evitar reiniciar durante el funcionamiento normal - 8 seg.
// para pruebas no se recomienda establecer el valor a menos de 8 segundos, en este caso se reinicia el cronómetro preferiblemente
// sacudidas, y sucede cada segundo.

}

bucle vacío () {
// ciclo de vacío, aquí se controlará el funcionamiento en fase abierta del motor eléctrico
}

recuento de vacíos() {

tft.setTextColor(ST7735_WHITE); // establece el color de la fuente
t = rtc.getTime(); // tiempo de lectura
tft.setCursor(5, 120); // estableciendo la posición del cursor
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // limpiando el área de salida de tiempo
tft.print(rtc.getTimeStr()); // lecturas del reloj de salida

wdt_reset(); // reinicia el mecanismo de vigilancia cada ciclo, es decir, segundo

for (rc = 0; rc < 4; rc ++) // comienzo del ciclo para verificar el cumplimiento del estado de entrada
// bits del puerto al estado de lectura anterior de los bits del puerto D
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // y si no coincide, entonces
pumrcounter[rc] = pinState; // asignando a la variable de estado del bit del puerto un nuevo valor 1/0
}
// indicación del estado de los objetos de control de color
// AZUL es un pequeño fallo de la pantalla existente (¿o biblioteca?), RGB y BGR están mezclados.
si (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + mayúsculas)), 7, 7, ST7735_BLUE); // para conteo de nivel bajo cambie VERDE a AZUL
} Else {
tft.fillRect(15, ((rc * 10 + mayúsculas)), 7, 7, ST7735_GREEN); // para conteo de nivel bajo cambie AZUL a VERDE
bomba [rc] += 1; // añade 1 segundo al contador de tiempo de funcionamiento
}
}

k++;
si (k == 36) {
k es 0;

tft.fillRect(30, cambio, 97, 40, ST7735_BLACK); // borrando el área de visualización del tiempo de funcionamiento
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // y fechas

tft.setCursor(60, 120); // estableciendo la posición del cursor
tft.print(rtc.getDateStr()); //muestra la fecha en la pantalla LCD

for (rc = 0; rc < 4; rc ++) //salida de horas de funcionamiento en enteros, décimas y
{
tft.setCursor (30, rc * 10 + shift); // centésimas de hora con un desplazamiento de pantalla hacia abajo de 10 píxeles
tft.println(bomba [rc] / m);
}

// escribiendo valores de horas de funcionamiento “sin procesar” (en segundos) en EEPROM ///////////////////////////////

para (rc = 0; rc < 4; rc ++)
{
EEPROM.put(dirección, bomba [rc]);
dirección += tamaño de (flotante); // incrementa la variable de dirección de escritura
}
}

// envía datos a través del canal de radio a partir de datos que indican cuántos bytes se deben enviar.
si ((k == 6 ) || (k == 18 ) || (k == 30 )) {

datos largos sin firmar;

radio.write(&inicio, tamaño de(inicio));

para (yo = 0; yo < 4; yo++) {
datos = bomba [i];
radio.write( &datos, tamaño de(datos));
}
}
}

Algunas notas al final. El conteo se produce en un nivel lógico bajo en las entradas.

Las resistencias pull-up R2-R5 son de 36 kOhm para la opción con fotorresistores GL5516. En el caso de un optoacoplador de fototransistor y un relé, configúrelo en 4,7-5,1 kOhm. Se reemplazó el bootloader Arduino Nano v3.0 por el Arduino Uno utilizando el programador TL866A para el correcto funcionamiento del temporizador watchdog. Los fusibles están corregidos para funcionar a voltajes superiores a 4,3 V. No se utilizó el circuito de reinicio externo R6 C3. En el programa de ejemplo, la frecuencia del transmisor no corresponde al rango sin licencia; el rango de 2,4 MHz está limitado a las frecuencias 2400.0-2483.5 MHz.

El alcance del transmisor E01-ML01DP05 es 2400-2525 MHz. El ancho de banda de un canal es 1 MHz, cuando se configura la velocidad como “RF24_2MBPS”, el canal radio.setChannel(120) especificado y el siguiente estarán ocupados, es decir. la banda será de 2 MHz.

Fuente: habr.com

Añadir un comentario