Lokalni autonomni sustav prikupljanja podataka

U poduzeću su nabavljena monitoring postaja NEXТ-M domaće proizvodnje „Next Technologies“. Za vizualizaciju rada pumpnih agregata,
požarno-zaštitne signalizacije, prisutnosti napona na kontaktorima, temperature u prostoru, alarmnog nivoa vode. Srce NEXТ-M čini ATMEGA 1280, što daje nadu u mogućnost stvaranja vlastitog kompleta prema specifičnim potrebama.

Postavljen je zadatak da se u minimalno kratkom vremenu i uz minimalne troškove kreira potpuno autonomni sustav lokalne dispečerizacije prema specifičnim potrebama. Osnova - mikrocontroller. Razvoj i proizvodnja se odvija pomoću osoblja samog poduzeća.

Sustav treba raditi bez ovisnosti o mobilnim mrežama, poslužitelja, internetu i sustavu odobrenja korištenja radiofrekvencijskih resursa, ne koristiti računala u sustavima kontrole i upravljanja ili najviše povremeno korištenje prijenosnih računala, bez pristupa objektima tijekom dužeg vremenskog razdoblja (6-9 mj.). Konfiguracija mreže ima radijalnu strukturu. Podaci se prikupljaju na jednoj točki i zatim se šalju na obradu putem običnih komunikacijskih kanala ili u obliku čvrste kopije.

Sustav treba osigurati:

  • kontrolu rada pumpnih postrojenja
  • tehnološku automatizaciju
  • zaštitu od posljedica incidentnih režima
  • signalizaciju o incidentnim režimima
  • brojanje vremena rada
  • brojanje potrošnje električne energije
  • kontrolu temperature opreme
  • zaštitno-požarnu signalizaciju
  • periodično daljinsko snimanje informacija
  • nepoznate zahtjeve u budućnosti

Uvjeti rada:

  • teritorij pokrivanja 1 kv.km.
  • direktna vidljivost između objekata
  • temperatura od +50 do -50 °C
  • vlaga do 100%
  • biološki aktivne naslage (plijesan, sulfat-redukujuće bakterije)
  • vibracije, ne više od mašina 1-2 klase prema GOST ISO 10816-1-97
  • elektromagnetska situacija - preklapanje elektromotora kontaktorima KT 6053, opremom za postupno pokretanje RVS-DN, opremom za PID regulaciju SIEMENS MICROMASTER, zračenje u ISM i GSM opsegu prema zahtjevima za te uređaje, ručno svjećanje na objektu
  • povišeno mrežno naponsko stanje, kratkotrajna prekidna napajanja, udari munje, nerazmjerno fazno naprezanje tijekom prekida kabela u distributivnim mrežama 6-10 kV.

Unatoč ovim strogim zahtjevima, implementacija nije previše složena uz postupno rješavanje problema.

Uzimajući u obzir sve, "mozak" dizajniranog sustava postala je ploča "Arduino Nano 3.0". Ploča od "Robotdyn" ima kontroler ATMEGA 328, potrebni stabilizator napona 3,3V na
struju od 800 mA i konverter na CH340G UART-USB.

Prvo su stvoreni brojni mjerači rada kao najrelevantniji. Ranije korišteni industrijski mjerači, sastavljeni na PIC-ima s bestransformatorskom shemom napajanja, otkazali su zbog naponskih skokova tijekom godine rada. Samo su oni povezani putem domaćih napajanja od 5V ostali netaknuti. Za ubrzanje montaže i univerzalnost povezivanja, signal o stanju uređaja uzima se s priključaka komutacijskih aparata, tj. registracija prisutnosti 1. faze napona pri trofaznom napajanju 380V. Za usklađivanje s kontrolerom koristi se posrednički relej s namotom za 220V ili optopara sastavljena od LED diode i fotorezistora GL5516 ili optopare PC817. Svi su varijante ispitane u radu. LED dioda se napaja ispravljenim naponom uz ograničenje struje pomoću dva kondenzatora SVV22, koji su izračunati na napon od 630V spojenih serijski za očuvanje prilikom slučajne provjere krugova megometrom.
Čitanje vremena rada putem LCD ekrana ST7735S, prijenos podataka putem radio kanala u stvarnom vremenu pomoću modula E01-ML01DP05 na frekvenciji od 2,4 GHz. Ovaj uređaj sadrži čip nRF24L01+ i pojačalo za prijem-prijenos RFX2401C,
izlazna snaga do 100 mW. Antene su spiralne i izrađene su za potrebni opseg u online kalkulatoru. stranice. Odabir tipa antena temelji se na isključenju prijema jednokratno reflektiranih valova od okolnih metalnih konstrukcija. Dijelovi antena su tiskani na 3D printeru. Trenutno stanje brojila pohranjeno je u EEPROM-u samog kontrolera i u slučaju neočekivanog isključenja napajanja se obnavlja. Vremenski intervali za brojanje osigurava RTC mikročip DS3231 u obliku modula s rezervnom baterijom. U napajanju su primijenjena 3 modula, odnosno impulsni izvor 220/5V HLK-PM01 600mA, pretvarač iz 1-5V u 5V. HW-553 i 03962A — kontroler baterije koji ima shemi zaštite od kratkog spoja, prekomjernog pražnjenja i prepunjenja. Sve komponente su nabavljene na stranici Aliexpress.

Prototipna pločaLokalni autonomni sustav prikupljanja podataka
Brojilo s 4 kanala. Na ulazima su postavljeni LC filtri za zaštitu od smetnji po komunikacijskoj liniji od parice. Podaci o stanju objekata kontrole neprekidno se čitaju jednom u sekundi, prikazuju se bojom na LCD-u. Ažuriranje pokazatelja i zapis u nepromjenjivu memoriju događa se svake 36 sekundi. 36 sekundi - to je 1/100 sati, upravo u tom formatu su potrebni podaci. Svake 12 sekundi prenosi se informacija o broju sekundi rada za svaki kontrolni uređaj. EEPROM memorija ima ograničen broj ciklusa zapisivanja-brisanja, prema podacima proizvođača, 100000 puta. Najgori slučaj je kada se neprekidno ažurira barem jedna ćelija. Kapacitet 1. brojača iznosi 4 bajta, to je broj formata long, 4 brojača, ukupno 16 bajtova zauzima jedan zapis. Dužina memorije mikročipa je 1024 bajta, nakon 64-zapisa 4-brojača zapis će početi ispočetka. U knjižnici EEPROM metoda EEPROM.put ne izvršava zapis ako se vrijednost ćelije i zapisane informacije podudaraju, degradacije ćelija neće biti. Na kraju, vrijeme zajamčenog rada memorije bit će više od 7 godina. Vrijeme moguće, ali nezajamčeno rada može biti mnogo više.

Principijelna shemaLokalni autonomni sustav prikupljanja podataka
Program u Arduino IDE-u//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 za rad s knjižnicom RF24,
// и номера выводов nRF24L01+ (CE, CSN)
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Vrijeme 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];// niz s 4 vrijednosti brojila sekundi
float m = 3600.0;
unsigned int address = 0;
int rc;// varijabla za brojila
unsigned long sumprim = 0;
unsigned long sumsec = 0;
byte i = 0;
byte k = 34;
unsigned int z = 0;
byte b = B00000001;
byte pumrcounter [4]; // niz za pohranu stanja objekata, 1- isključen, 0- uključen.
int start = 0; //

void setup() {

rtc.begin();
radio.begin(); // Iniciramo rad nRF24L01+
radio.setChannel(120); // kanal prijenosa podataka (od 0 do 127).
radio.setDataRate (RF24_250KBPS); // brzina prijenosa podataka (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel (RF24_PA_MAX); // snaga odašiljača (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe (0xAABBCCDD11LL); // Otvaranje cijevi s identifikatorom za prijenos podataka

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

tft.initR(INITR_BLACKTAB); // inicijalizacija ST7735S čipa, crna oznaka
// 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); // Dozvoli tekstu da se proteže izvan desnog ruba
tft.setRotation( 2 ); // za crnu PCB i crvenu tft.setRotation(0) ili ne.
tft.fillScreen(ST7735_BLACK); // brisanje ekrana

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // softversko povlačenje radi, visoka razina-
// контролируемые объекты «не работают», во все 4 старших порта D записана «1», не идет счет.

for ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // ispis brojeva pozicija objekata kontrole
tft.print ( rc + 1 );
}

tft.setCursor (12, 0); // ispis 3 reda teksta
tft.println («DEVELOPERI & GRADITELJI» ); // za hvaljenje sebe dragog
tft.setCursor (24, 10); // ili zlo copyright
tft.print («DEVELOPER M.M.»);
tft.setCursor (28, 20);
tft.print («GRADITELJ D.D.»);

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

for ( z = 0; z < 1023; z += 16 ) { // Iterira kroz sve ćelije EEPROM-a
//и записывает в массив из 4-х переменных pump, по 4 байта каждый счетчик, т.к.
// переменная беззнаковая лонг. Счетчиков 4, одна запись всех 4-х занимает 16 байт.
EEPROM.get ( z, pump [0]); // tako, bez for petlje, manji 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; // povećanje adrese za zapis sljedeće bloka bez brisanja podataka posljednjeg zapisa

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

attachInterrupt(0, count, RISING); // pin D2, omogućavanje rada prekida, svaki drugi dolazi
// импульсы от RTC DS3231 с выхода SQW

wdt_enable (WDTO_8S); // pokretanje watchdog timera, resetira kontroler u slučaju zaglavljivanja, vrijeme,
// за которое надо подать команду сброса таймера wdt_reset( и избежать перезагрузки при нормальной работе- 8 сек.
// для тестов не рекомендуется устанавливать значение менее 8 сек.В данном случае сброс таймера происходит в пре-
// рывании, а оно каждую секунду.

}

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

void count() {

tft.setTextColor(ST7735_WHITE); // postavljanje boje fonta
t = rtc.getTime(); // očitavanje vremena
tft.setCursor ( 5, 120 ); // postavljanje pozicije kursora
tft.fillRect ( 5, 120, 50, 7, ST7735_BLACK); // brisanje područja ispisivanja vremena
tft.print(rtc.getTimeStr()); //-- prikaz vremena

wdt_reset(); // resetiranje watchdog timera svaki ciklus, tj. svake sekunde

for (rc = 0; rc < 4; rc ++) // početak ciklusa provjere sukladnosti stanja ulaza
// битов порта предыдущему считанному состоянию битов порта D
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // i ako se ne podudara, onda
pumrcounter [rc] = pinState; // dodijeljivanje varijabli stanja bita porta novu vrijednost 1/0
}
// индикация состояния объектов контроля цветом
// BLUE- это небольшой глюк имеющегося экрана ( или библиотеки? ), перепутаны RGB и BGR.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // za brojanje na niskoj razini promijeni GREEN u BLUE
} else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // za brojanje na niskoj razini promijeni BLUE u GREEN
pump [rc] += 1; // dodajemo u brojač vremena rada 1 sekundu
}
}

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

tft.fillRect ( 30, shift, 97, 40, ST7735_BLACK ); // brisanje područja ispisivanja vremena rada
tft.fillRect ( 60, 120, 73, 7, ST7735_BLACK); // i datuma

tft.setCursor ( 60, 120 ); // postavljanje pozicije kursora
tft.print(rtc.getDateStr()); // ispis datuma na LCD ekranu

for (rc = 0; rc < 4; rc++) // ispis očitanja radnog vremena u cijelim, desetinama i
{
tft.setCursor(30, rc * 10 + shift); // stotinke sata s pomakom na ekranu dolje za 10 piksela
tft.println(pump[rc] / m);
}

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

for (rc = 0; rc < 4; rc++)
{
EEPROM.put(address, pump[rc]);
address += sizeof(float); // inkrementiranje varijable adrese za zapisivanje
}
}

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

Mali komentari na kraju. Brojanje se odvija pri niskoj logičkoj razini na ulazima.

Otpornosti povlačenja R2-R5 su 36 kΩ za varijantu s fotorezistorima GL5516. U slučaju fototranzistorskih optopića i releja, postaviti 4,7-5,1 kΩ. Bootloader Arduino Nano v3.0 zamijenjen je na Arduino Uno putem programatora TL866A za ispravno funkcioniranje nadzornog tajmera. Fuzije su ispravljene za rad pri naponom iznad 4,3 V. Vanjski krug resetiranja R6 C3 nije korišten. U primjeru programa frekvencija odašiljača ne odgovara nelicenciranom opsegu, opseg 2,4 MHz ograničen je frekvencijama 2400.0—2483.5 MHz.

Opseg odašiljača E01-ML01DP05 iznosi 2400-2525 MHz. Širina pojasa jednog kanala iznosi 1 MHz, pri podešavanju brzine kao "RF24_2MBPS" bit će zauzet navedeni radio.setChannel(120) kanal i sljedeći, tj. pojas će biti 2 MHz.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster