Lokálna autonómna sústava na zber dát

Na podniku boli zakúpené monitorovacie stanice NEXST domácej výroby od spoločnosti „Nexst Technologies“. Pre zabezpečenie vizualizácie práce čerpacích agregátov,
požiarnej a bezpečnostnej signalizácie, prítomnosti napätia na spínačoch, teploty v miestnosti, havarijných úrovní vody. Srdcom NEXST je ATMEGA 1280, a tento fakt povzbudil v možnosti vytvorenia vlastného setu pre konkrétne potreby.

Bola stanovená úloha v minimálne krátkom čase a pri minimálnych nákladoch vytvoriť úplne autonómny systém lokálneho dispečingu pre konkrétne potreby. Základom je mikroprocesor. Vývoj, výroba je realizovaná silami samotného personálu.

Systém musí fungovať bez závislosti od mobilných sietí, serverov, internetu a schvaľovacieho systému pre využívanie rádiových frekvencií, nemá používať počítače v systéme kontroly a riadenia a maximálne príležitostne notebooky, bez prístupu na objekty po dlhší čas (6-9 mesiacov). Konfigurácia siete má radiálnu štruktúru. Údaje sa zhromažďujú na jednom mieste a následne sa posielajú na spracovanie bežnými komunikačnými kanálmi alebo vo forme pevnej kópie.

Systém musí zabezpečiť:

  • kontrolu činnosti čerpacích zariadení
  • technologickú automatizáciu
  • ochranu pred následkami havarijných režimov
  • signalizáciu o havarijných režimoch
  • počítanie času prevádzky
  • počítanie objemu spotrebovanej elektrickej energie
  • kontrolu teploty zariadenia
  • požiarno-bezpečnostnú signalizáciu
  • občasné diaľkové snímanie informácií
  • neznáme požiadavky v budúcnosti

Podmienky prevádzky:

  • územie pokrytia 1 km².
  • priama viditeľnosť medzi objektmi
  • teplota od +50 do -50 °C
  • vlhkosť až 100%
  • biologicky aktívne usadeniny (pleseň, sulfát-redukčné baktérie)
  • vibrácie, maximálne triedy 1-2 podľa GOST ISO 10816-1-97
  • elektromagnetické prostredie - spínanie elektromotorov kontaktami KT 6053, zariadením na plynulé spúšťanie RVS-DN, zariadením PID regulácie SIEMENS MICROMASTER, vyžarovanie v ISM a GSM pásme podľa požiadaviek na tieto zariadenia, ručné oblúkové zváranie na objekte
  • prekročené napätie siete, krátkodobé prerušenia dodávky elektriny, prepätia počas búrky, fázový posun pri rozpojení vodiča Vysokého napätia v rozvodných sieťach 6-10 kV.

Napriek takýmto prísnym požiadavkám je realizácia celkom jednoduchá pri postupnom riešení úlohy.

So zohľadnením všetkého sa ako "mozog" navrhnutého stal modul "Arduino Nano 3.0". Doska od "Robotdyn" má mikrokontrolér ATMEGA 328, potrebný stabilizátor napätia 3,3V na
prúd 800 mA a konvertor na CH340G UART-USB.

Na prvom mieste boli vytvorené počítače na sledovanie prevádzky ako najaktuálnejšie. Predtým používané priemyselné počítače postavené na PIC čipoch s beztransformátorovým napájacím schématom prestali fungovať kvôli výkyvom napätia počas roka prevádzky. Celé zostali len pripojené pomocou vlastnoručne vyrábaných napájacích blokov na napätie 5V. Na zrýchlenie montáže a univerzálnosť pripojenia sa signál o stave agregátov odoberá z kontaktov prepínacích zariadení, t.j. registrácia prítomnosti 1. fázy napätia pri trojfázovom napájaní 380V. Na zosúladenie s mikrokontrolérom sa používa medzirelát s cievkou na 220V alebo optočlen zložený z LED diódy a fotorezistoru GL5516 alebo optočlen PC817. Všetky varianty boli otestované v prevádzke. LED dióda je napájaná usmerneným napätím s obmedzením prúdu pomocou dvoch kondenzátorov SVV22 navrhnutých na napätie 630V, pripojených sériovo na ochranu pri náhodnej kontrole obvodov megaommetrom.
Čítanie údajov o prevádzkovom čase pomocou LCD displeja ST7735S, prenos údajov cez rádiovú sieť v reálnom čase pomocou modulu E01-ML01DP05 na frekvencii 2,4 MHz. Toto zariadenie obsahuje čip nRF24L01+ a prijímací-vysielací zosilňovač RFX2401C,
výstupný výkon až 100 mW. Antény sú špirálové, navrhnuté na požadovaný rozsah v online kalkulačke. webu. Výber typu antén závisí od vylúčenia prijímania jednorazovo odrazených vĺn od okolitých kovových konštrukcií. Časti antén sú vytlačené na 3D tlačiarni. Aktuálny stav čítačov je uložený v EEPROM samotného ovládača a v prípade nepredvídaného odpojenia napájania sa obnoví. Časové intervaly na počítanie zabezpečuje RTC integrovaný obvod DS3231 vo forme modulu s batériou záložného napájania. V BP sú použité 3 moduly, konkrétne impulzný zdroj 220/5V HLK-PM01 600mA, menič z 1-5V na 5V HW-553 a 03962A — ovládač batérie s schémou ochrany pred skratom, prebitím a nadmerným nabitím. Všetky komponenty boli zakúpené na stránke Aliexpress.

Prototypová doskaLokálna autonómna sústava na zber dát
Štvorkanálový čítač. Na vstupe sú LC filtre na ochranu pred šumami po komunikačnej línii zo skrútenej dvojice. Údaje o stave kontrolovaných objektov sú neustále čítané raz za sekundu, zobrazené farbou na LCD. Aktualizácia hodnôt a zápis do nezmazateľnej pamäte prebieha každých 36 sekúnd. 36 sekúnd - to je 1/100 hodiny, presne v tomto formáte sú požadované údaje. Každých 12 sekúnd dochádza k prenosu informácií o počte sekúnd prevádzky na každý kontrolný agregát. Pamäť EEPROM má obmedzený počet cyklov zápisu - mazania, podľa údajov výrobcu, 100000 krát. Najhorší variant je, keď neustále prebieha aktualizácia aspoň jednej bunky. Veľkosť 1. čítača je 4 bajty, čo je číslo vo formáte long, 4 čítače, celkom 16 bajtov zaberá jeden zápis. Dĺžka pamäte integrovaného obvodu je 1024 bajtov, po 64-písaní 4 čítačov zápis začne znovu. V knižnici EEPROM metóda EEPROM.put nevykonáva zápis, ak sa hodnota bunky a zapisované informácie zhodujú, degradácia buniek nebude. Nakoniec bude čas zaručenej prevádzky pamäte viac ako 7 rokov. Čas možnej, ale nezaručenej prevádzky môže byť oveľa dlhší.

Princípová schémaLokálna autonómna sústava na zber dát
Program v 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); // objekt radio na prácu s knižnicou RF24,
// и номера выводов nRF24L01+ (CE, CSN)
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Čas 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]; // pole s 4 hodnotami čítačov sekúnd
float m = 3600.0;
unsigned int address = 0;
int rc; // premenná pre čítače
unsigned long sumprim = 0;
unsigned long sumsec = 0;
byte i = 0;
byte k = 34;
unsigned int z = 0;
byte b = B00000001;
byte pumrcounter [4]; // pole pre uchovávanie stavov objektov, 1 - vyp., 0 - zap.
int start = 0; //

void setup() {

rtc.begin();
radio.begin(); // Inicializujeme prácu nRF24L01+
radio.setChannel(120); // kanál prenosu údajov (od 0 do 127).
radio.setDataRate (RF24_250KBPS); // rýchlosť prenosu dát (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel (RF24_PA_MAX); // výkon vysielača (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe (0xAABBCCDD11LL); // Otvoríme potrubie s identifikátorom na prenos dát

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

tft.initR(INITR_BLACKTAB); // inicializácia čipu ST7735S, čierna karta
// 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); // Povoliť text, aby prešiel cez pravý okraj
tft.setRotation( 2 ); // pre ČIERNU PCB a ČERVENÚ tft.setRotation(0) alebo nie.
tft.fillScreen(ST7735_BLACK); // vyčistenie obrazovky

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000;// softvérové ťahanie funguje, vysoká úroveň-
// контролируемые объекты «не работают», во все 4 старших порта D записана «1», не идет счет.

for ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // výstup čísel pozícií kontrolných objektov
tft.print ( rc + 1 );
}

tft.setCursor (12, 0); // výstup 3-radkového textu
tft.println («DEVELOPERS & BUILD» ); // na oslavu nás samých
tft.setCursor (24, 10); // alebo zlovestného copyrightu
tft.print («DEVELOPER M.M.»);
tft.setCursor (28, 20);
tft.print («BUILD-ER D.D.»);

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

for ( z = 0; z < 1023; z += 16 ) { // Prechádza všetky bunky EEPROM
//и записывает в массив из 4-х переменных pump, по 4 байта каждый счетчик, т.к.
// переменная беззнаковая лонг. Счетчиков 4, одна запись всех 4-х занимает 16 байт.
EEPROM.get ( z, pump [0]); // takto, bez cyklu for, menší objem
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; // zvýšenie adresy na zápis nasledujúceho bloku bez prepísania posledných údajov

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

attachInterrupt(0, count, RISING); // pin D2, povolenie interruptu, každú sekundu prichádzajú
// импульсы от RTC DS3231 с выхода SQW

wdt_enable (WDTO_8S); // spustenie watchdog časovača, resetuje ovládač v prípade zamrznutia, čas,
// за которое надо подать команду сброса таймера wdt_reset( и избежать перезагрузки при нормальной работе- 8 сек.
// для тестов не рекомендуется устанавливать значение менее 8 сек.В данном случае сброс таймера происходит в пре-
// рывании, а оно каждую секунду.

}

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

void count() {

tft.setTextColor(ST7735_WHITE); // nastavenie farby písma
t = rtc.getTime(); // čítanie času
tft.setCursor ( 5, 120 ); // nastavenie pozície kurzora
tft.fillRect ( 5, 120, 50, 7, ST7735_BLACK); // vyčistenie oblasti výstupu času
tft.print(rtc.getTimeStr()); // výstup údajov hodín

wdt_reset(); // reset watchdog časovača každý cyklus, teda každú sekundu

for (rc = 0; rc < 4; rc ++) // začiatok cyklu kontroly zhodnosti stavu vstupných
// битов порта предыдущему считанному состоянию битов порта D
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // a ak sa nezhoduje,
pumrcounter [rc] = pinState; // priradenie premennej stavu bitu portu novej hodnoty 1/0
}
// индикация состояния объектов контроля цветом
// BLUE- это небольшой глюк имеющегося экрана ( или библиотеки? ), перепутаны RGB и BGR.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // pre počítanie pri nízkej úrovni zmeniť GREEN na BLUE
} else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // pre počítanie pri nízkej úrovni zmeniť BLUE na GREEN
pump [rc] += 1; // pridávame do počítadla času 1 sekundu
}
}

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

tft.fillRect ( 30, shift, 97, 40, ST7735_BLACK ); // vyčistenie oblasti výstupu času prevádzky
tft.fillRect ( 60, 120, 73, 7, ST7735_BLACK); // a dátumu

tft.setCursor ( 60, 120 ); // nastavenie pozície kurzora
tft.print(rtc.getDateStr()); // výstup dátumu na LCD displej

for (rc = 0; rc < 4; rc++) // výstup nameraných hodnôt v celých, desatinách a
{
tft.setCursor(30, rc * 10 + shift); // stotiny hodiny so zmenou o 10 pixelov nadol
tft.println(pump[rc] / m);
}

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

for (rc = 0; rc < 4; rc++)
{
EEPROM.put(address, pump[rc]);
address += sizeof(float); // inkrementácia adresy zápisu
}
}

// отправляем данные по радиоканалу из 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));
}
}
}

Malé poznámky na záver. Počítanie začína pri nízkej logickej úrovni na vstupe.

Odporové pull-up R2-R5 36 kΩ pre variant s fotorezistormi GL5516. V prípade fototransistorového optoizolačného zariadenia a relé, umiestnite 4,7-5,1 kΩ. Bootloader Arduino Nano v3.0 bol nahradený Arduino Uno pomocou programátora TL866A pre správnu funkciu watchdog timeru. Fúzie boli opravené pre prácu pri napätí nad 4,3 V. Vonkajší resetovací obvod R6 C3 nebol použitý. V ukážke programu frekvencia vysielača nezodpovedá neregulovanému pásmu, pásmo 2,4 GHz je obmedzené frekvenciami 2400,0—2483,5 MHz.

Frekvenčný rozsah vysielača E01-ML01DP05 je 2400-2525 MHz. Šírka pásma jedného kanála je 1 MHz, pri nastavení rýchlosti ako „RF24_2MBPS“ bude obsadený uvedený radio.setChannel(120) kanál a nasledujúci, t.j. pásmo bude 2 MHz.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster