Se adquirieron estaciones de monitoreo NÉKST-M de producción nacional de «Next Technologies». Para asegurar la visualización del funcionamiento de los conjuntos de bombas,
de la señalización de incendio y seguridad, la presencia de voltaje en los contactores, la temperatura en la sala, y el nivel crítico de agua. El núcleo de NÉKST-M es el ATMEGA 1280, lo que dio esperanza en cuanto a la posibilidad de crear un conjunto específico para necesidades concretas.
Se planteó la tarea de crear un sistema de despacho local completamente autónomo, en el menor tiempo posible y con el mínimo coste, adaptado a necesidades específicas. La base es el microcontrolador. El desarrollo y la fabricación se realizan por el personal mismo.
El sistema debe funcionar independientemente de las redes celulares, servidores, de internet y de los sistemas de autorización para el uso de recursos de radiofrecuencia, sin utilizar computadoras en el sistema de control y gestión, o como máximo haciendo un uso periódico de laptops, sin acceso a los sitios durante largos períodos (6-9 meses). La configuración de la red tiene una estructura radial. Los datos se recopilan en un solo punto y luego se envían para su procesamiento a través de canales de comunicación convencionales o en forma de copia física.
El sistema debe proporcionar:
- control del funcionamiento de las instalaciones de bombeo
- automatización tecnológica
- protección contra las consecuencias de modos de fallos
- señalización sobre modos de fallos
- cálculo del tiempo de operación
- cálculo del volumen de energía consumida
- control de la temperatura del equipo
- señalización de seguridad y contra incendios
- monitoreo remoto periódico de información
- requisitos desconocidos en el futuro
Condiciones de operación:
- área de cobertura de 1 km².
- visibilidad directa entre objetos
- temperatura de +50 a -50 °C
- humedad hasta el 100%
- depósitos biológicamente activos (moho, bacterias sulfato-reducentes)
- vibración, no más de máquinas de 1-2 clases según GOST ISO 10816-1-97
- entorno electromagnético- conmutación de motores eléctricos mediante contactores KT 6053, equipos de arranque suave RVS-DN, equipos de regulación PID SIEMENS MICROMASTER, radiaciones en las bandas ISM y GSM de acuerdo con los requerimientos para estos dispositivos, soldadura manual por arco en el sitio.
- sobretensiones de la red, interrupciones breves del suministro eléctrico, sobretensiones durante tormentas, desbalance de fases al romperse un cable de la línea de distribución de 6-10 kV.
A pesar de estos estrictos requisitos, la implementación es bastante sencilla si se aborda el problema de forma gradual.
Teniendo en cuenta todo, la "mente" del dispositivo pensado fue la placa "Arduino Nano 3.0". La placa de "Robotdyn" tiene un controlador ATMEGA 328 y un estabilizador de voltaje de 3.3V.
con una corriente de 800 mA y un convertidor basado en CH340G UART-USB.
En primer lugar, se crearon contadores de horas de funcionamiento, ya que son los más relevantes. Los contadores industriales anteriormente utilizados, que estaban basados en PIC y contaban con un esquema de alimentación sin transformador, fallaron debido a los picos de voltaje durante el año de operación. Solo permanecieron intactos los que fueron alimentados mediante bloques de alimentación hechos a medida con un voltaje de 5V. Para acelerar la instalación y la versatilidad de conexión, la señal del estado de los equipos se toma de los terminales de los aparatos de conmutación, es decir, se registra la presencia de la primera fase de voltaje en alimentación trifásica de 380V. Para acoplar al controlador, se utiliza un relé intermedio con bobina a 220V o un optoacoplador compuesto de un LED y un fot resistor GL5516 o un optoacoplador PC817. Se probaron todas las opciones en funcionamiento. El LED se alimenta con voltaje rectificado, limitado de corriente mediante dos condensadores CBB22 diseñados para un voltaje de 630V, conectados en serie para seguridad durante revisiones aleatorias de circuitos con megóhmetro.
La lectura del tiempo de funcionamiento se realiza mediante una pantalla LCD ST7735S, transmitiendo datos en tiempo real a través de un módulo E01-ML01DP05 en una frecuencia de 2.4 GHz. Este dispositivo contiene el chip nRF24L01+ y un amplificador de recepción-transmisión RFX2401C,
con una potencia de salida de hasta 100 mW. Las antenas son espirales, diseñadas para el rango necesario en el calculador en línea . La elección del tipo de antenas se basa en la exclusión de la recepción de ondas reflejadas una sola vez por estructuras metálicas circundantes. Las partes de las antenas están impresas en 3D. El estado actual de los contadores se almacena en la EEPROM del controlador y se restaura en caso de un corte de energía inesperado. Los intervalos de tiempo para el conteo son proporcionados por el circuito RTC DS3231 en forma de módulo con batería de respaldo. En la fuente de alimentación se utilizan 3 módulos: la fuente de alimentación impulsiva de 220/5V HLK-PM01 600mA, convertidor de 1-5V a 5V y — controlador de batería que tiene de protección contra cortocircuitos, sobredescarga y sobrecarga. Todos los componentes fueron comprados en el sitio web de Aliexpress.
Placa de pruebas
Contador de 4 canales. En las entradas hay filtros LC para protección contra interferencias en la línea de comunicación de par trenzado. Los datos sobre el estado de los objetos controlados se leen constantemente 1 vez por segundo, se muestran en color en la pantalla LCD. La actualización de las lecturas y la escritura en la memoria no volátil se producen cada 36 segundos. 36 segundos - es 1/100 de hora, exactamente en este formato se requieren los datos. Cada 12 segundos se transmite información sobre la cantidad de segundos de funcionamiento de cada dispositivo de control. La memoria EEPROM tiene un número limitado de ciclos de escritura-borrado, según el fabricante, 100000 veces. La peor opción es cuando se actualiza constantemente al menos una celda. El tamaño de un contador es de 4 bytes, esto es un número en formato long, 4 contadores, por lo tanto, 16 bytes ocupa una escritura. La longitud de la memoria del microchip es de 1024 bytes, después de 64 escrituras de 4 contadores la escritura comenzará desde el principio. En la biblioteca EEPROM, el método EEPROM.put no realiza la escritura si el valor de la celda coincide con la información que se está escribiendo; no habrá degradación de las celdas. Como resultado, el tiempo de uso garantizado de la memoria será superior a 7 años. El tiempo posible, pero no garantizado, puede ser mucho mayor.
Esquema principal
Programa en 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 trabajar con la biblioteca RF24,
// и номера выводов nRF24L01+ (CE, CSN)
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Tiempo 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]; // arreglo con 4 valores de contadores de segundos
float m = 3600.0;
unsigned int address = 0;
int rc; // variable 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]; // arreglo para almacenar estados de los objetos, 1 - apagado, 0 - encendido.
int start = 0; //
void setup() {
rtc.begin();
radio.begin(); // Iniciamos el funcionamiento del nRF24L01+
radio.setChannel(120); // canal de transmisión de datos (de 0 a 127).
radio.setDataRate(RF24_250KBPS); // velocidad de transmisión 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); // Abrimos un tubo con el identificador para la transmisión de datos.
// Для установки времени- раскомментировать нужные строки
//rtc.setDOW(1); // День недели
//rtc.setTime(21, 20, 0); // Время, в формате 24 часа.
//rtc.setDate(29, 10, 2018); // Дата, 29 октября 2018г.
tft.initR(INITR_BLACKTAB); // inicializar un chip ST7735S, tab de color negro.
// 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 el texto se desplace fuera del borde derecho.
tft.setRotation(2); // para PCB NEGRO y TFT ROJO, tft.setRotation(0) o no.
tft.fillScreen(ST7735_BLACK); // limpiar la pantalla.
DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // la resistencia pull-up está activa, nivel alto-
// контролируемые объекты «не работают», во все 4 старших порта D записана «1», не идет счет.
for (rc = 0; rc < 4; rc++)
{
tft.setCursor(3, rc * 10 + shift); // mostrar los números de las posiciones de control.
tft.print(rc + 1);
}
tft.setCursor(12, 0); // mostrar 3 líneas de texto.
tft.println("DESARROLLADORES Y CONSTRUCCIÓN"); // para alabarnos a nosotros mismos.
tft.setCursor(24, 10); // o un copyright maligno.
tft.print("DESARROLLADOR M.M.");
tft.setCursor(28, 20);
tft.print("CONSTRUCTOR D.D.");
//восстановление данных/////////////////////////////////////////////////////////
for (z = 0; z < 1023; z += 16) { // Iterar por todas las celdas de EEPROM.
//и записывает в массив из 4-х переменных pump, по 4 байта каждый счетчик, т.к.
// переменная беззнаковая лонг. Счетчиков 4, одна запись всех 4-х занимает 16 байт.
EEPROM.get(z, pump[0]); // así, sin ciclo for, menos volumen.
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; // aumento de dirección para escribir el siguiente bloque sin sobrescribir los datos de la última escritura.
// конец восстановления данных////////////////////////////////////////////////////////////////
attachInterrupt(0, count, RISING); // pin D2, permite el funcionamiento de la interrupción, cada segundo llegan datos.
// импульсы от RTC DS3231 с выхода SQW
wdt_enable(WDTO_8S); // iniciar el temporizador de vigilancia, reinicia el controlador en caso de bloqueo, tiempo,
// за которое надо подать команду сброса таймера wdt_reset( и избежать перезагрузки при нормальной работе- 8 сек.
// для тестов не рекомендуется устанавливать значение менее 8 сек.В данном случае сброс таймера происходит в пре-
// рывании, а оно каждую секунду.
}
void loop() {
// пустой цикл, здесь будет контроль за неполнофазным режимом работы эл.двигателя
}
void count() {
tft.setTextColor(ST7735_WHITE); // establecer el color de la fuente.
t = rtc.getTime(); // lectura del tiempo.
tft.setCursor(5, 120); // establecer la posición del cursor.
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // limpiar el área de salida del tiempo.
tft.print(rtc.getTimeStr()); // mostrar la hora.
wdt_reset(); // reiniciar el temporizador de vigilancia cada ciclo, es decir, cada segundo.
for (rc = 0; rc < 4; rc++) // inicio del ciclo de verificación de correspondencia del estado de las entradas.
// битов порта предыдущему считанному состоянию битов порта D
{
pinState = (PIND >> 4) & (b << rc);
if (pumrcounter[rc] != pinState) { // y si no coincide, entonces
pumrcounter[rc] = pinState; // asignar a la variable del estado del bit del puerto el nuevo valor 1/0.
}
// индикация состояния объектов контроля цветом
// BLUE- это небольшой глюк имеющегося экрана ( или библиотеки? ), перепутаны RGB и BGR.
if (pinState == (b << rc)) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // para contar en nivel bajo cambiar VERDE por AZUL.
} else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // para contar en nivel bajo cambiar AZUL por VERDE.
pump[rc] += 1; // agregamos al contador el tiempo de trabajo 1 segundo.
}
}
k++;
if (k == 36) {
k = 0;
tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // limpiar el área de salida del tiempo de trabajo.
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // y fechas
tft.setCursor(60, 120); // establecer posición del cursor
tft.print(rtc.getDateStr()); // mostrar fecha en pantalla LCD
for (rc = 0; rc < 4; rc++) // mostrar lecturas en enteros, décimas y
{
tft.setCursor(30, rc * 10 + shift); // décimas de hora con un desplazamiento de 10 píxeles hacia abajo en la pantalla
tft.println(pump[rc] / m);
}
// запись «сырых» значений наработки (в секундах)в EEPROM //////////////////////////////
for (rc = 0; rc < 4; rc++)
{
EEPROM.put(address, pump[rc]);
address += sizeof(float); // incremento de la variable de dirección de escritura
}
}
// отправляем данные по радиоканалу из 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));
}
}
}
Pequeñas observaciones al final. La cuenta comienza en bajo nivel lógico en las entradas.
Las resistencias de tirón R2-R5 son de 36 kΩ para la variante con fotocélulas GL5516. En caso de optoacoplador de fototransistor y relé, utilizar 4.7-5.1 kΩ. El cargador Arduino Nano v3.0 fue reemplazado por Arduino Uno usando el programador TL866A para un correcto funcionamiento del temporizador watchdog. Los fusibles se ajustaron para trabajar a voltajes superiores a 4.3 V. El circuito externo de reinicio R6 C3 no se utilizó. En el ejemplo de programa, la frecuencia del transmisor no corresponde al rango no licenciado, el rango de 2.4 GHz está limitado a las frecuencias de 2400.0–2483.5 MHz.
El rango del transmisor E01-ML01DP05 es de 2400-2525 MHz. El ancho de banda de un canal es de 1 MHz; al ajustar la velocidad a "RF24_2MBPS", el radio.setChannel(120) ocupará ese canal y el siguiente, es decir, el ancho será de 2 MHz.
Fuente: habr.com
