Ընկերությունը գնել է 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 մՎտ: Պտուտակաձև ալեհավաքներ, որոնք նախատեսված են առցանց հաշվիչում ցանկալի տիրույթի համար
Հացի տախտակ
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