Лакальная аўтаномная сістэма збору даных

На прадпрыемстве былі закупленыя пасты маніторынгу НЭКСТ-М айчыннай вытворчасці "Нэкст Тэхналоджыс". Для забеспячэння візуалізацыі працы помпавых агрэгатаў,
пажарна-ахоўнай сігналізацыі, наяўнасці напружання на пускальніках, тэмпературы ў памяшканні, аварыйнага ўзроўню вады. Сэрцам НЭКСТ-М служыць ATMEGA 1280 і дадзены факт абнадзеіў у плане магчымасці стварэння свайго камплекта пад пэўныя патрэбы.

Была пастаўлена задача ў мінімальна кароткія тэрміны і пры мінімальных затратах стварыць поўнасцю аўтаномную сістэму лакальнай дыспетчарызацыі пад канкрэтныя патрэбы. Аснова-мікракантролер. Распрацоўка, выраб ствараецца сіламі самога персаналу.

Працаваць сістэма павінна без залежнасці ад сотавых сетак, сервераў, інтэрнэту і дазвольнай сістэмы выкарыстання радыёчастотных рэсурсаў, не выкарыстоўваць у працы сістэмы кантролю і кіравання кампутары або максімум перыядычнае выкарыстанне наўтбукаў, без доступу на аб'екты на працягу доўгага часу (6-9 мес.). Канфігурацыя сеткі мае радыяльную структуру. Дадзеныя збіраюцца ў адной кропцы і далей адпраўляюцца для апрацоўкі па звычайных каналах сувязі ці ў выглядзе цвёрдай копіі.

Сістэма павінна забяспечваць:

  • кантроль працы помпавых установак
  • тэхналагічную аўтаматыку
  • абарону ад наступстваў аварыйных рэжымаў
  • сігналізацыю аб аварыйных рэжымах
  • падлік часу напрацоўкі
  • падлік аб'ёму спажытай электраэнергіі
  • кантроль тэмпературы абсталявання
  • ахоўна-пажарную сігналізацыю
  • перыядычны дыстанцыйны з'ём інфармацыі
  • невядомыя патрабаванні ў будучыні

Ўмовы працы:

  • тэрыторыя ахопу 1 кв. км.
  • прамая бачнасць паміж аб'ектамі
  • тэмпература ад +50 да -50 З
  • вільготнасць да 100%
  • біялагічна актыўныя адклады (цвіль, сульфатаднаўляюць бактэрыі)
  • вібрацыя, не больш за, машын 1-2 класаў па ДАСТ ІСО 10816-1-97
  • электрамагнітная абстаноўка- камутацыя электрарухавікоў контакторами КТ 6053, апаратурай плыўнага пуску RVS-DN, апаратурай ПІД- рэгулявання SIEMENS MICROMASTER, выпраменьванні ў ISM і GSM дыяпазоне паводле патрабаванняў да дадзеных прылад, ручная дугавая зварка на аб'екце
  • падвышаная напруга сеткі, кароткачасовыя спыненні электразабеспячэння, навальнічныя перанапружанні, перакос фаз пры абрыве провада ВЛ у размеркавальных сетках 6- 10 кв.

Не гледзячы на ​​такія цвёрдыя патрабаванні рэалізацыя суцэль нескладаная пры паэтапным рашэнні задачы.

З улікам усяго, у якасці «мозгу» задуманага стала плата «Ардуіна нана 3.0». Хустка ад «Robotdyn» мае кантролер ATMEGA 328, неабходны стабілізатар напругі 3,3В на
ток 800 ма і канвэртар на CH340G UART-USB.

У першую чаргу былі створаны лічыльнікі напрацоўкі як самыя актуальныя. Раней ужывальныя прамысловыя лічыльнікі сабраныя на PIC-ах з бестрансфарматорнай схемай сілкавання выйшлі са строю ад кідкоў напругі на працягу года працы. Засталіся цэлымі толькі падлучаныя з дапамогай самаробных блокаў харчавання на напругу 5В. Для паскарэння мантажу і ўніверсальнасці падлучэння сігнал аб стане агрэгатаў бярэцца з заціскаў камутацыйных апаратаў, г.зн. рэгістрацыя прысутнасці 1-й фазы напругі пры трохфазным сілкаванні 380В. Для ўзгаднення з кантролерам прымяняецца прамежкавае рэле з абмоткай на 220В або оптапара складзеная з святлодыёда і фотарэзістара GL5516 або оптапара РС817. Былі выпрабаваныя ў працы ўсе варыянты. Святлодыёд сілкуецца выпрастанай напругай з абмежаваннем току з дапамогай двух кандэнсатараў СВВ22 разлічаных на напругу 630В уключаных паслядоўна для захаванасці пры выпадковай праверцы ланцугоў мегаомметрам.
Счытванне паказанняў часу напрацоўкі з дапамогай ВК экрана ST7735S, перадача па радыёканале дадзеных у рэжыме рэальнага часу з дапамогай модуля E01-ML01DP05 на частаце 2,4 Мгц. Дадзеная прылада ўтрымоўвае чып nRF24L01+ і ўзмацняльнік прыёму- перадачы RFX2401C,
выходная магутнасць да 100 мВт. Антэны спіральныя, разлічаныя на патрэбны дыяпазон у анлайн-калькулятары сайта. Выбар тыпу антэн абумоўлены выключэннем прыёму аднакратна адлюстраваных хваль ад навакольных металаканструкцый. Дэталі антэн раздрукаваны на 3Д прынтэры. Бягучы стан лічыльнікаў захоўваецца ў EEPROM самога кантролера і ў выпадку непрадбачанага адключэння харчавання аднаўляецца. Часавыя інтэрвалы для рахунку забяспечвае RTC мікрасхема DS3231 у выглядзе модуля з батарэяй рэзервовага харчавання. У БП ужытыя 3 модуля, уласна імпульсны крыніца 220/5В HLK-PM01 600mA, пераўтваральнік з 1-5В у 5В HW-553 и 03962A - кантролер акумулятара які мае схему абароны ад КЗ, пераразраду і перазараду. Усе камплектуючыя закупляліся на сайце Aliexpress.

Макетная платаЛакальная аўтаномная сістэма збору даных
Лічыльнік 4-х канальны. Па ўваходах стаяць LC фільтры для абароны ад перашкод па лініі сувязі з вітай пары. Дадзеныя аб стане аб'ектаў кантролю ўвесь час счытваюцца 1 раз у сек., адлюстроўваюцца колерам на ВК. Абнаўленне паказанняў і запіс у энерганезалежную памяць адбываецца кожныя 36 сек. 36 сек. - гэта 1/100 гадзіны, менавіта ў такім фармаце патрабуюцца дадзеныя. Кожныя 12 сек. адбываецца перадача інфармацыі аб колькасці секунд працы па кожным агрэгаце кантролю. Памяць EEPROM мае абмежаваную колькасць цыклаў запісу- пры спробе ачысціць, па дадзеных вытворцы, 100000 разоў. Горшы варыянт-гэта калі ўвесь час ідзе абнаўленне хоць-бы аднаго вочка. Аб'ём аднаго лічыльніка 1 байта, гэты лік фармату long, 4 лічыльніка, разам 4 байт займае адзін запіс. Даўжыня памяці мікрасхемы 16 байт, пасля 1024-х запісаў 64-х лічыльнікаў запіс пачнецца спачатку. У бібліятэцы EEPROM метад EEPROM.put не вырабляе запіс, калі значэнне вочка і якая запісваецца інфармацыі супадае, дэградацыі вочак не будзе. У выніку час гарантаванай напрацоўкі памяці будзе больш за 4 гадоў. Час магчымай, але негарантаванай працы можа быць нашмат большы.

Прынцыповая схемаЛакальная аўтаномная сістэма збору даных
Праграма ў Arduino IDE//12 байт (328%)

#include // Core graphics library
#include // Hardware-specific library
#уключыць
#include
# уключыць
#include
#include
RF24 radio(9, 10); // аб'ект radio для працы з бібліятэкай RF24,
// і нумары высноў nRF24L01+ (CE, CSN)
#уключыць
DS3231 rtc(SDA, SCL);
Time t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // Вы можаце наладзіць гэта на Arduino reset
// У якім выпадку, выкарыстоўваецца гэта #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 // Выберыце, каб whatever pins you like!
#define TFT_MOSI 11 // Выберыце, калі б pins you like!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#уключыць

byte shift = 52;
byte pinState;
unsigned long pump[4];// масіў з 4 значэннямі лічыльнікаў секунд
float m = 3600.0;
unsigned int address = 0;
int rc; // пераменная для лічыльнікаў
unsigned long sumprim = 0;
unsigned long sumsec = 0;
byte i = 0;
byte k = 34;
unsigned int z = 0;
byte b = B00000001;
byte pumrcounter [4]; // масіў для захоўвання станаў аб'ектаў, 1- адкл., 0- вкл.
int start = 0; //

несапраўдная ўстаноўка () {

rtc.begin();
radio.begin(); // Ініцыюем працу nRF24L01+
radio.setChannel(120); // канал перадачы даных (ад 0 да 127).
radio.setDataRate (RF24_250KBPS); // хуткасць перадачы дадзеных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel (RF24_PA_MAX); // магутнасць перадатчыка (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe (0xAABBCCDD11LL); // Адкрываем трубу з ідэнтыфікатарам для перадачы дадзеных

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

tft.initR(INITR_BLACKTAB); // initialize a ST7735S chip, black tab
// Выкарыстоўвайце гэты initializer (uncomment) калі вы выкарыстоўваеце 1.44" TFT
//tft.initR(INITR_144GREENTAB); // initialize a ST7735S chip, RED rcB tab
tft.setTextWrap(false); // Адправіць тэкст да прамой рады
tft.setRotation( 2 ); // для BLACK PCB і RED tft.setRotation(0) or not.
tft.fillScreen(ST7735_BLACK); // ачыстка экрана

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000;// праграмная шлейка працуе, высокі ўзровень-
// кантраляваныя аб'екты "не працуюць", ва ўсе 4 старэйшых порта D запісана "1", не ідзе рахунак.

for ( rc = 0; rc < 4; rc++)
{
tft.setCursor (3, rc * 10 + shift); // вывад нумароў пазіцый аб'ектаў кантролю
tft.print (rc + 1);
}

tft.setCursor (12, 0); // выснова 3-х радкоў тэксту
tft.println ("DEVELOPERS & BUILD"); // для ўсхвалення сябе каханых
tft.setCursor (24, 10); // або злоснага капірайту
tft.print ("DEVELOPER MM");
tft.setCursor (28, 20);
tft.print ("BUILD-ER DD");

//аднаўленне дадзеных////////////////////////////////////////////// ///////////

for (z = 0; z < 1023; z += 16) { // Перабірае ўсе вочкі яепрама
//і запісвае ў масіў з 4-х зменных pump, па 4 байта кожны лічыльнік, т.я.
// пераменная беззнакавая лонг. Лічыльнікаў 4, адзін запіс усіх 4-х займае 16 байт.
EEPROM.get (z, pump [0]); // так, без цыклу for, меншы аб'ём
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; // павелічэння адрасу для запісу наступнага блока не заціраючы дадзеныя апошняга запісу

// канец аднаўлення дадзеных ////////////////////

attachInterrupt(0, count, RISING); // pin D2, дазвол працы перапынення, кожную секунду прыходзяць
// імпульсы ад RTC DS3231 з выхаду SQW

wdt_enable (WDTO_8S); // запуск вартавога таймера, перазагружае кантролер у выпадку завісання, час,
// за якое трэба падаць каманду скіду таймера wdt_reset( і пазбегнуць перазагрузкі пры нармальнай працы-8 сек.
// для тэстаў не рэкамендуецца ўсталёўваць значэнне менш за 8 сек. У дадзеным выпадку скід таймера адбываецца ў пре-
// рванні, а яно кожную секунду.

}

несапраўдная пятля () {
// пусты цыкл, тут будзе кантроль за непаўнафазным рэжымам працы эл.рухавіка
}

void count() {

tft.setTextColor(ST7735_WHITE); // ўстаноўка колеру шрыфта
t = rtc.getTime(); // счытванне часу
tft.setCursor (5, 120); // ўстаноўка пазіцыі курсора
tft.fillRect (5, 120, 50, 7, ST7735_BLACK); // ачыстка вобласці вываду часу
tft.print(rtc.getTimeStr()); // выснова паказанняў гадзіннікаў

wdt_reset(); // скід вартавога таймера кожны цыкл, г.зн. секунду

for (rc = 0; rc < 4; rc ++) // пачатак цыклу праверкі адпаведнасці стану ўваходных
// бітаў порта папярэдняга лічанага стану бітаў порта D
{
pinState = (PIND >> 4) & (b << rc);

if (pumrcounter [rc] != pinState) { // і калі не адпавядае, то
pumrcounter [rc] = pinState; // прысваенне зменнай стану біта порта новага значэння 1/0
}
// індыкацыя стану аб'ектаў кантролю колерам
// BLUE-гэта невялікі глюк наяўнага экрана (або бібліятэкі?), пераблытаныя RGB і BGR.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // для рахунку па нізкім узроўні памяняць GREEN на BLUE
} Яшчэ {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // для рахунку па нізкім узроўні памяняць BLUE на GREEN
pump [rc] += 1; // дадаем у лічыльнік часу працы 1 секунду
}
}

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

tft.fillRect (30, shift, 97, 40, ST7735_BLACK); // ачыстка вобласці вываду часу напрацоўкі
tft.fillRect (60, 120, 73, 7, ST7735_BLACK); // і даты

tft.setCursor (60, 120); // ўстаноўка пазіцыі курсора
tft.print(rtc.getDateStr()); // вывад даты на экран LCD

for (rc = 0; rc < 4; rc ++) //вывад паказанняў напрацоўкі ў цэлых, дзесятых і
{
tft.setCursor (30, rc * 10 + shift); // сотых долях гадзіны са зрухам на экране ўніз на 10 пікселяў
tft.println(pump [rc] / m);
}

// запіс "волкіх" значэнняў напрацоўкі (у секундах) у EEPROM ///////////////////////////////

for (rc = 0; rc < 4; rc++)
{
EEPROM.put(address, pump [rc]);
address += sizeof(float); // інкрымент зменнай адрасы запісу
}
}

// адпраўляем дадзеныя па радыёканале з 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));
}
}
}

Невялікія заўвагі ў канцы. Рахунак ідзе пры нізкім лагічным узроўні на ўваходах.

Супрацівы шлейкі R2-R5 36 кім для варыянту з фотарэзістарамі GL5516. У выпадку фототранзисторной оптопары і рэле, паставіць 4,7- 5,1 кім. Загрузнік Arduino Nano v3.0 заменены на Arduino Uno з дапамогай праграматара TL866A для карэктнай працы вартавога таймера. Фьюзы папраўленыя для працы пры напрузе вышэй 4,3 У. Вонкавы ланцуг скіду R6 C3 не выкарыстоўвалася. У прыкладзе праграмы частата перадатчыка не адпавядае неліцэнзуемага дыяпазону, дыяпазон 2,4 Мгц абмежаваны частотамі 2400.0-2483.5 Мгц.

Дыяпазон перадатчыка E01-ML01DP05 складае 2400 – 2525 Мгц. Шырыня паласы аднаго канала- 1 Мгц, пры наладзе хуткасці як «RF24_2MBPS» будзе заняты паказаны radio.setChannel(120) канал і наступны, г.зн. паласа будзе 2 Мгц.

Крыніца: habr.com

Дадаць каментар