Տեղական ինքնավար տվյալների հավաքագրման համակարգ

Ընկերությունը գնել է NEKST-M մոնիտորինգի կետեր, որոնք արտադրվում են երկրի ներսում Next Technologies-ի կողմից: Պոմպային ագրեգատների շահագործման վիզուալացում ապահովելու համար,
հակահրդեհային և անվտանգության ազդանշաններ, լարման առկայություն մեկնարկիչների մոտ, սենյակային ջերմաստիճան, վթարային ջրի մակարդակ: NEKST-M-ի սիրտը ATMEGA 1280-ն է, և այս փաստը հուսադրող է հատուկ կարիքների համար ձեր սեփական հավաքածու ստեղծելու հնարավորության առումով:

Խնդիր է դրվել ստեղծել կոնկրետ կարիքների համար լիովին ինքնավար տեղական դիսպետչերական համակարգ հնարավորինս սեղմ ժամկետներում և նվազագույն ծախսերով: Հիմքը միկրոկոնտրոլեր է: Մշակում, արտադրություն՝ ստեղծված անձնակազմի կողմից:

Համակարգը պետք է գործի առանց կախվածության բջջային ցանցերից, սերվերներից, ինտերնետից և ռադիոհաճախականության ռեսուրսների օգտագործման լիցենզավորման համակարգից, չօգտագործի համակարգիչներ մոնիտորինգի և կառավարման համակարգի աշխատանքի մեջ կամ, առավելագույնը, պարբերաբար օգտագործի դյուրակիր համակարգիչներ՝ առանց մուտքի դեպի: օբյեկտները երկար ժամանակ (6-9 ամիս): Ցանցի կոնֆիգուրացիան ունի ճառագայթային կառուցվածք: Տվյալները հավաքվում են մեկ կետում, այնուհետև ուղարկվում են մշակման սովորական կապի ուղիներով կամ թղթային տարբերակով:

Համակարգը պետք է ապահովի.

  • պոմպային ագրեգատների շահագործման մոնիտորինգ
  • տեխնոլոգիական ավտոմատացում
  • պաշտպանություն արտակարգ իրավիճակների հետևանքներից
  • վթարային ազդանշան
  • գործառնական ժամանակի հաշվարկ
  • սպառված էլեկտրաէներգիայի քանակի հաշվարկ
  • սարքավորումների ջերմաստիճանի վերահսկում
  • անվտանգության և հրդեհային ազդանշան
  • տեղեկատվության պարբերական հեռակա ձայնագրում
  • անհայտ ապագա պահանջներ

Աշխատանքային պայմանները:

  • ծածկույթի մակերես 1քմ.
  • օբյեկտների միջև ուղիղ տեսանելիություն
  • ջերմաստիճանը +50-ից -50 C
  • խոնավությունը մինչև 100%
  • կենսաբանորեն ակտիվ հանքավայրեր (բորբոս, սուլֆատ նվազեցնող բակտերիաներ)
  • 1-2 դասերի մեքենաների թրթռում, ոչ ավելին, համաձայն ԳՕՍՏ ԻՍՕ 10816-1-97
  • էլեկտրամագնիսական միջավայր - էլեկտրական շարժիչների միացում KT 6053 կոնտակտորներով, RVS-DN փափուկ մեկնարկային սարքավորումներով, SIEMENS MICROMASTER PID կառավարման սարքավորումներով, ճառագայթում ISM և GSM միջակայքում՝ ըստ այդ սարքերի պահանջների, ձեռքով աղեղային եռակցում տեղում։
  • ցանցի չափազանց մեծ լարում, էլեկտրամատակարարման կարճատև ընդհատումներ, կայծակնային գերլարումներ, փուլային անհավասարակշռություն, երբ օդային գծի լարը կոտրվում է 6-10 կՎ բաշխիչ ցանցերում:

Չնայած նման խիստ պահանջներին, խնդիրը քայլ առ քայլ լուծելիս իրականացումը բավականին պարզ է:

Ամեն ինչ հաշվի առնելով՝ «Arduino Nano 3.0» տախտակը դարձավ ծրագրի «ուղեղը»։ Robotdyn տախտակն ունի ATMEGA 328 կարգավորիչ, անհրաժեշտ 3,3V լարման կայունացուցիչը:
ընթացիկ 800 մԱ և փոխարկիչ CH340G UART-USB:

Նախ և առաջ ստեղծվել են աշխատանքային ժամերի հաշվիչներ՝ որպես ամենաարդիական։ Նախկինում օգտագործված արդյունաբերական հաշվիչները, որոնք հավաքվել էին PIC-ների վրա առանց տրանսֆորմատորային էլեկտրամատակարարման միացումով, ձախողվել էին լարման բարձրացումների պատճառով՝ շահագործման մեկ տարվա ընթացքում: Անվտանգ մնացին միայն նրանք, որոնք միացված էին տնական 5 Վ սնուցման աղբյուրներով: Միացման տեղադրումն ու բազմակողմանիությունը արագացնելու համար ագրեգատների վիճակի մասին ազդանշան է վերցվում անջատիչ սարքերի տերմինալներից, այսինքն. 1 Վ եռաֆազ սնուցմամբ 380-ին փուլային լարման առկայության գրանցում: Կարգավորիչի հետ կոորդինացնելու համար օգտագործվում է միջանկյալ ռելե՝ 220 Վ ոլորունով կամ օպտիկակուպլեր, որը կազմված է LED-ից և GL5516 ֆոտոռեզիստորից կամ PC817 օպտոկոմպլեկտորից: Բոլոր տարբերակները փորձարկվել են։ LED-ը սնուցվում է հոսանքի սահմանափակմամբ ուղղված լարման միջոցով՝ օգտագործելով երկու SVV22 կոնդենսատորներ, որոնք նախատեսված են 630 Վ լարման համար, որոնք միացված են հաջորդաբար՝ մեգոհմմետրով սխեմաների պատահական փորձարկման ժամանակ անվտանգության համար:
Աշխատանքային ժամանակի ընթերցումներ՝ օգտագործելով ST7735S LCD էկրան, իրական ժամանակում տվյալների փոխանցում ռադիոյի միջոցով՝ օգտագործելով E01-ML01DP05 մոդուլը 2,4 ՄՀց հաճախականությամբ: Այս սարքը պարունակում է nRF24L01+ չիպ և RFX2401C փոխանցող/ընդունիչ ուժեղացուցիչ,
ելքային հզորությունը մինչև 100 մՎտ: Պտուտակաձև ալեհավաքներ, որոնք նախատեսված են առցանց հաշվիչում ցանկալի տիրույթի համար сайта. Ալեհավաքի տեսակի ընտրությունը որոշվում է շրջապատող մետաղական կառույցներից առանձին արտացոլված ալիքների ընդունման բացառմամբ: Անթենային մասերը տպագրվում են 3D տպիչի վրա։ Հաշվիչների ընթացիկ վիճակը պահվում է հենց կարգավորիչի EEPROM-ում և վերականգնվում է էլեկտրաէներգիայի անսպասելի անջատման դեպքում: Հաշվարկի ժամանակային ընդմիջումները տրամադրվում են RTC չիպի DS3231-ի կողմից պահեստային մարտկոցով մոդուլի տեսքով: Էներգամատակարարումն օգտագործում է 3 մոդուլ, իրական զարկերակային աղբյուրը 220/5V HLK-PM01 600mA, փոխարկիչ 1-5V-ից մինչև 5V ՀՎ-553 и 03962A - մարտկոցի կարգավորիչով սխեման պաշտպանություն կարճ միացումից, գերլիցքից և գերլիցքավորումից: Բոլոր բաղադրիչները ձեռք են բերվել Aliexpress կայքում:

Հացի տախտակՏեղական ինքնավար տվյալների հավաքագրման համակարգ
4-ալիք հաշվիչ. Մուտքերում կան LC ֆիլտրեր՝ ոլորված զույգ կապի գծի միջամտությունից պաշտպանվելու համար: Վերահսկիչ օբյեկտների վիճակի վերաբերյալ տվյալները մշտապես ընթերցվում են վայրկյանում մեկ անգամ և ցուցադրվում են գունավոր LCD-ի վրա: Ընթերցումները թարմացվում և գրանցվում են ոչ անկայուն հիշողության մեջ յուրաքանչյուր 1 վայրկյանը մեկ: 36 վայրկյանը ժամի 36/1-ն է, սա այն ձևաչափն է, որով պահանջվում են տվյալները: Յուրաքանչյուր 100 վայրկյան: տեղեկատվությունը փոխանցվում է յուրաքանչյուր կառավարման միավորի աշխատանքի վայրկյանների քանակի մասին: EEPROM հիշողությունն ունի սահմանափակ թվով գրելու-ջնջման ցիկլեր, ըստ արտադրողի, 12 անգամ: Ամենավատ տարբերակն այն է, երբ առնվազն մեկ բջիջ անընդհատ թարմացվում է: 100000-ին հաշվիչի ծավալը 1 բայթ է, սա երկար ֆորմատի թիվ է, 4 հաշվիչ, ընդհանուր 4 բայթը զբաղեցնում է մեկ ռեկորդ։ Միկրոշրջանի հիշողության երկարությունը 16 բայթ է, 1024 հաշվիչի 64 մուտքից հետո ձայնագրությունը կսկսվի նորից: EEPROM գրադարանում EEPROM.put մեթոդը չի գրում, եթե բջջի արժեքը և գրված տեղեկատվությունը համընկնում են, բջիջների դեգրադացիան չի լինի: Արդյունքում հիշողության երաշխավորված աշխատանքային ժամանակը կկազմի ավելի քան 4 տարի։ Հնարավոր, բայց ոչ երաշխավորված աշխատանքի ժամանակը կարող է շատ ավելի երկար լինել։

Շղթայի դիագրամՏեղական ինքնավար տվյալների հավաքագրման համակարգ
Ծրագիր Arduino IDE-ում//12 բայթ (328%)

#ներառում // Հիմնական գրաֆիկական գրադարան
#include // Սարքավորման հատուկ գրադարան
#ներառում
#include
#ներառում
#include
#include
RF24 ռադիո (9, 10); // ռադիո օբյեկտ RF24 գրադարանի հետ աշխատելու համար,
// և PIN համարները nRF24L01+ (CE, CSN)
#ներառում
DS3231 rtc (SDA, SCL);
Ժամանակը t;

//#սահմանել TFT_CS 10
#սահմանել TFT_CS 8
#define TFT_RST -1 // կարող եք նաև սա միացնել Arduino-ի վերակայմանը
// որի դեպքում այս #define փին սահմանեք -1:
//#define TFT_DC 9 // DC=RS=A0 - հրամանի կամ տվյալների ռեգիստր ընտրելու համար նշանակման տարբերակներ:
#սահմանել TFT_DC 3

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

// Տարբերակ 2. օգտագործեք ցանկացած կապում, բայց մի փոքր ավելի դանդաղ:
#define TFT_SCLK 13 // սահմանեք, որ դրանք լինեն ձեր ուզած փիները:
#define TFT_MOSI 11 // սահմանեք, որ դրանք լինեն ձեր ուզած փիները:
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#ներառում

բայթի տեղաշարժ = 52;
բայթ pinState;
անստորագիր երկար պոմպ[4];// զանգված՝ 4 վայրկյան հաշվիչի արժեքներով
բոց մ = 3600.0;
չստորագրված int հասցե = 0;
int rc;// փոփոխական հաշվիչների համար
չստորագրված երկար sumprim = 0;
անստորագիր երկար sumsec = 0;
բայթ i = 0;
բայթ k = 34;
անստորագիր int z = 0;
բայթ b = B00000001;
բայթ 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); // սկզբնավորել ST7735S չիպը, սև ներդիրը
// Օգտագործեք այս սկզբնավորիչը (uncomment), եթե օգտագործում եք 1.44 դյույմ TFT
//tft.initR(INITR_144GREENTAB); // սկզբնավորել ST7735S չիպը, RED rcB ներդիրը
tft.setTextWrap(false); // Թույլ տալ, որ տեքստը դուրս գա աջ եզրից
tft.setRotation(2); // BLACK PCB-ի և RED tft.setRotation(0)-ի համար, թե ոչ:
tft.fillScreen (ST7735_BLACK); // մաքրել էկրանը

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // ծրագրային ապահովման խստացումն աշխատում է, բարձր մակարդակ -
// վերահսկվող օբյեկտները «չի աշխատում», «4» գրված է բոլոր 1 ավագ նավահանգիստներում D, ոչ մի հաշվում չի կատարվում:

համար (rc = 0; rc <4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // ցուցադրելով կառավարման օբյեկտների դիրքի համարները
tft.print (rc + 1);
}

tft.setCursor (12, 0); // թողարկում 3 տող տեքստ
tft.println («ՄՇԱԿՈՂՆԵՐ ԵՎ ԿԱՌՈՒՑՈՒՄ»); // գովել քեզ սիրելիներին
tft.setCursor (24, 10); // կամ չար հեղինակային իրավունք
tft.print ("DEVELOPER M.M.");
tft.setCursor(28, 20);
tft.print ("BUILD-ER D.D.");

//տվյալների վերականգնում/////////////////////////////////////////////////////////////////// ///////////

համար (z = 0; z <1023; z += 16) { // Կրկնվում է արդյունաբերության բոլոր բջիջներով
//և գրում է 4 պոմպային փոփոխականների զանգվածում, 4 բայթ յուրաքանչյուր հաշվիչի համար, քանի որ
// չստորագրված երկար փոփոխական: Կան 4 հաշվիչներ, բոլոր 4-ի մեկ ձայնագրությունը 16 բայթ է:
EEPROM.get(z, պոմպ[0]); // այսպես, առանց for հանգույցի, ավելի քիչ ծավալ
EEPROM.get (z+4, պոմպ[1]);
EEPROM.get (z+8, պոմպ[2]);
EEPROM.get (z+12, պոմպ[3]);

// նոր հաջորդ արժեք վերագրելով 4 հաշվիչների գումարի համար
sumprim = (պոմպ [0] + պոմպ [1] + պոմպ [2] + պոմպ [3]);

// համեմատում է sumprim փոփոխականի 4 հաշվիչների գումարի նոր արժեքը փոփոխականի նախորդ արժեքի հետ
// sumsec և եթե նախորդ գումարը փոքր է կամ հավասար է նոր գումարին, ապա նշանակվում է նոր մեծ կամ հավասար
// sumsec արժեքը.

եթե (sumsec <= sumprim) {
sumsec = sumprim; //

//և ընթացիկ z արժեքը վերագրվում է հասցեի փոփոխականին, z-ը 16 բայթանոց 4 արժեքով բլոկի սկզբի հասցեն է:
// միևնույն ժամանակ գրանցված հաշվիչներ (քանի որ նավահանգիստը քվեարկելիս դրա բոլոր 8 բիթերը գրվում են միաժամանակ,
// ներառյալ մեր անհրաժեշտ բարձր 4 բիթ D նավահանգիստը):
հասցե = z;
}
}

// ևս մեկ անգամ մուտք գործել eeprom հիշողություն 16 բայթանոց բլոկի սկզբի հասցեով, 4 գրանցված հաշվիչի արժեքներով
// վերջին, այսինքն. արժեքները մինչև սառեցման պատճառով անջատելը կամ վերագործարկվելը: Վերջինի ձայնագրում
// հաշվիչի արժեքները 4 փոփոխականների զանգվածի պոմպի մեջ:

EEPROM.get (հասցե, պոմպ[0]);
EEPROM.get (հասցե + 4, պոմպ[1]);
EEPROM.get (հասցե + 8, պոմպ[2]);
EEPROM.get (հասցե + 12, պոմպ[3]);

հասցե += 16; //Հաջորդ բլոկը գրելու հասցեի ավելացում՝ առանց վերջին գրառման տվյալները վերագրելու

//տվյալների վերականգնման ավարտ///////////////////////////////////////////////////////////////// //////////////////

կցելԸնդհատում (0, count, RISING); // PIN D2, միացնել ընդհատումները, արի ամեն վայրկյան
// իմպուլսներ RTC DS3231-ից SQW ելքից

wdt_enable (WDTO_8S); // գործարկել Watchdog timer-ը, սառեցնելու դեպքում վերագործարկել կարգավորիչը, ժամանակ,
// որի համար պետք է թողարկեք ժմչփի վերակայման հրամանը wdt_reset( և խուսափեք վերագործարկումից նորմալ շահագործման ժամանակ - 8 վրկ.
// թեստերի համար խորհուրդ չի տրվում արժեքը սահմանել 8 վայրկյանից պակաս: Այս դեպքում ժմչփը ցանկալի է զրոյացնել
// ցնցում է, և դա տեղի է ունենում ամեն վայրկյան:

}

անվավեր հանգույց () {
// դատարկ ցիկլ, այստեղ հսկողություն կլինի էլեկտրական շարժիչի բաց փուլային աշխատանքի վրա
}

անվավեր հաշվարկ () {

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 (); // զրոյացնել պահակային շունը յուրաքանչյուր ցիկլ, այսինքն՝ վայրկյան

համար (rc = 0; rc <4; rc ++) // մուտքային վիճակի համապատասխանությունը ստուգելու ցիկլի սկիզբը
// միացրե՛ք բիթերը դեպի D պորտի բիթերի նախորդ ընթերցման վիճակ
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // և եթե չի համընկնում, ապա
pumrcounter[rc] = pinState; // պորտի բիթային կարգավիճակի փոփոխականին վերագրելով նոր արժեք 1/0
}
// գույնի կառավարման օբյեկտների վիճակի նշում
// BLUE-ը գոյություն ունեցող էկրանի (թե գրադարանի) փոքր անսարքություն է, RGB-ն և BGR-ը խառնվել են:
եթե (pinState == (b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // ցածր մակարդակի հաշվման համար ԿԱՆԱՉ-ը դարձրեք ԿԱՊՈՒՅՏ
} {Else
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // ցածր մակարդակի հաշվման համար փոխեք ԿԱՊԻՏԸ ԿԱՆԱՉԻ
պոմպ [rc] += 1; // ավելացրեք 1 վայրկյան գործառնական ժամանակի հաշվիչին
}
}

k++;
եթե (k == 36) {
k = 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 էկրանին

համար (rc = 0; rc <4; rc ++) //ելքային աշխատանքային ժամերը ամբողջությամբ, տասներորդական և
{
tft.setCursor ( 30, rc * 10 + shift ); // ժամի հարյուրերորդական մասը էկրանի 10 պիքսել ներքև տեղաշարժով
tft.println (պոմպ [rc] / մ);
}

// գրելով «հում» աշխատանքային ժամերի արժեքները (վայրկյաններով) EEPROM-ում ////////////////////////////

համար (rc = 0; rc <4; rc++)
{
EEPROM.put (հասցե, պոմպ [rc]);
հասցե += sizeof(float); // ավելացրեք գրելու հասցեի փոփոխականը
}
}

// ուղարկել տվյալներ ռադիոալիքով տվյալներից, որոնք ցույց են տալիս, թե քանի բայթ պետք է ուղարկվի:
եթե ((k == 6 ) || (k == 18 ) || (k == 30 )) {

չստորագրված երկար տվյալներ;

radio.write (&start, sizeof(start));

համար (i = 0; i <4; i++) {
տվյալներ = պոմպ [i ];
radio.write( &data, sizeof( data));
}
}
}

Վերջում մի քանի նշում. Հաշվումը տեղի է ունենում ցածր տրամաբանական մակարդակով մուտքերում:

Ձգվող դիմադրությունները R2-R5 36 կՕմ են՝ GL5516 ֆոտոռեզիստորներով տարբերակի համար: Ֆոտոտրանզիստորային օպտոկուլլերի և ռելեի դեպքում սահմանեք 4,7-5,1 կՕմ: Arduino Nano v3.0 bootloader-ը փոխարինվել է Arduino Uno-ով, օգտագործելով TL866A ծրագրավորողը պահակային ժմչփի ճիշտ աշխատանքի համար: Ապահովիչները շտկված են, որպեսզի աշխատեն 4,3 Վ-ից բարձր լարման դեպքում: R6 C3 արտաքին վերակայման շղթան չի օգտագործվել: Նմուշային ծրագրում հաղորդիչի հաճախականությունը չի համապատասխանում չլիցենզավորված տիրույթին, 2,4 ՄՀց միջակայքը սահմանափակված է 2400.0-2483.5 ՄՀց հաճախականությամբ:

E01-ML01DP05 հաղորդիչի տիրույթը 2400-2525 ՄՀց է: Մեկ ալիքի թողունակությունը 1 ՄՀց է, «RF24_2MBPS» արագությունը սահմանելիս նշված radio.setChannel(120) ալիքը կզբաղեցվի և հաջորդը, այսինքն. տիրույթը կլինի 2 ՄՀց:

Source: www.habr.com

Добавить комментарий