Sistemi lokal i mbledhjes së të dhënave autonome

Kompania bleu poste monitorimi NEKST-M, të prodhuara në vend nga Next Technologies. Për të siguruar vizualizimin e funksionimit të njësive të pompimit,
alarme zjarri dhe sigurie, prania e tensionit në startues, temperatura e dhomës, niveli i ujit emergjent. Zemra e NEKST-M është ATMEGA 1280 dhe ky fakt është inkurajues për sa i përket mundësisë së krijimit të kompletit tuaj për nevoja specifike.

Detyra u vendos për të krijuar një sistem plotësisht autonom lokal dispeçimi për nevoja specifike në kohën më të shkurtër të mundshme dhe me kosto minimale. Baza është një mikrokontrollues. Zhvillimi, prodhimi, krijuar nga vetë stafi.

Sistemi duhet të funksionojë pa varësi nga rrjetet celulare, serverët, interneti dhe sistemi i licencimit për përdorimin e burimeve të radiofrekuencave, të mos përdorë kompjuterë në funksionimin e sistemit të monitorimit dhe kontrollit ose, maksimumi, të përdorë periodikisht laptopë, pa qasje në objekte për një kohë të gjatë (6-9 muaj). Konfigurimi i rrjetit ka një strukturë radiale. Të dhënat mblidhen në një moment dhe më pas dërgohen për përpunim nëpërmjet kanaleve të rregullta të komunikimit ose si kopje fizike.

Sistemi duhet të sigurojë:

  • monitorimi i funksionimit të njësive të pompimit
  • automatizimi teknologjik
  • mbrojtje nga pasojat e kushteve emergjente
  • sinjalizimi emergjent
  • llogaritja e kohës së funksionimit
  • duke llogaritur sasinë e energjisë elektrike të konsumuar
  • kontrolli i temperaturës së pajisjes
  • alarmi i sigurisë dhe zjarrit
  • regjistrim periodik i informacionit në distancë
  • kërkesa të panjohura për të ardhmen

Kushtet e punës:

  • zona e mbulimit 1 km katrore.
  • dukshmëri e drejtpërdrejtë ndërmjet objekteve
  • temperatura nga +50 në -50 C
  • lagështia deri në 100%
  • Depozita biologjikisht aktive (myk, baktere që reduktojnë sulfate)
  • dridhje, jo më shumë, e makinave të klasave 1-2 sipas GOST ISO 10816-1-97
  • mjedis elektromagnetik - ndërrimi i motorëve elektrikë me kontaktorë KT 6053, pajisje për nisje të butë RVS-DN, pajisje kontrolli SIEMENS MICROMASTER PID, rrezatim në rangun ISM dhe GSM sipas kërkesave për këto pajisje, saldim manual me hark në vend
  • Tensioni i tepërt i rrjetit, ndërprerjet afatshkurtra në furnizimin me energji elektrike, mbitensionet e rrufesë, çekuilibri i fazës kur prishet një tel i linjës ajrore në rrjetet e shpërndarjes 6-10 kV.

Pavarësisht kërkesave të tilla të rrepta, zbatimi është mjaft i thjeshtë kur problemi zgjidhet hap pas hapi.

Duke marrë parasysh gjithçka, bordi "Arduino Nano 3.0" u bë "truri" i planit. Pllaka robotdyn ka një kontrollues ATMEGA 328, stabilizuesin e nevojshëm të tensionit 3,3V për
rrymë 800 mA dhe konvertues në CH340G UART-USB.

Fillimisht u krijuan sportelet e orarit të punës si më të përditësuarit. Matësit industrialë të përdorur më parë të montuar në PIC me një qark të furnizimit me energji pa transformator dështuan për shkak të rritjeve të tensionit brenda një viti nga funksionimi. Vetëm ato të lidhura duke përdorur furnizime me energji 5V të bëra në shtëpi mbetën të paprekura. Për të shpejtuar instalimin dhe shkathtësinë e lidhjes, një sinjal për gjendjen e njësive merret nga terminalet e pajisjeve komutuese, d.m.th. regjistrimi i pranisë së tensionit të fazës së parë me një furnizim me energji trefazore prej 1 V. Për të koordinuar me kontrolluesin, përdoret një stafetë e ndërmjetme me një mbështjellje 380 V ose një optobashkues i përbërë nga një LED dhe një fotorezistor GL220 ose një optobashkues PC5516. Të gjitha opsionet u testuan. LED mundësohet nga një tension i korrigjuar me kufizim të rrymës duke përdorur dy kondensatorë SVV817 të krijuar për një tension prej 22 V të lidhur në seri për siguri gjatë testimit aksidental të qarqeve me një megohmmetër.
Leximi i leximeve të kohës së funksionimit duke përdorur ekranin LCD ST7735S, transmetimi i të dhënave në kohë reale nëpërmjet radios duke përdorur modulin E01-ML01DP05 në një frekuencë prej 2,4 MHz. Kjo pajisje përmban çipin nRF24L01+ dhe amplifikuesin e transmetimit/marrjes RFX2401C,
fuqia dalëse deri në 100 mW. Antenat spirale të dizajnuara për gamën e dëshiruar në kalkulatorin online faqe. Zgjedhja e llojit të antenës përcaktohet nga përjashtimi i marrjes së valëve të reflektuara të vetme nga strukturat metalike përreth. Pjesët e antenës printohen në një printer 3D. Gjendja aktuale e sporteleve ruhet në EEPROM të vetë kontrolluesit dhe rikthehet në rast të një ndërprerjeje të papritur të energjisë. Intervalet kohore për numërim sigurohen nga çipi RTC DS3231 në formën e një moduli me një bateri rezervë. Furnizimi me energji elektrike përdor 3 module, burimin aktual të pulsit 220/5V HLK-PM01 600mA, një konvertues nga 1-5V në 5V HW-553 и 03962A - kontrollues baterie me skema mbrojtje kundër qarkut të shkurtër, mbishkarkimit dhe mbingarkesës. Të gjithë komponentët janë blerë në faqen e internetit të Aliexpress.

Tabela e bukësSistemi lokal i mbledhjes së të dhënave autonome
banak me 4 kanale. Ka filtra LC në hyrje për të mbrojtur kundër ndërhyrjeve mbi një linjë komunikimi të çifteve të përdredhur. Të dhënat për gjendjen e objekteve të kontrollit lexohen vazhdimisht një herë në sekondë dhe shfaqen me ngjyra në LCD. Leximet përditësohen dhe regjistrohen në memorie jo të paqëndrueshme çdo 1 sekonda. 36 sekonda është 36/1 e orës, ky është formati në të cilin kërkohen të dhënat. Çdo 100 sekonda. informacioni transmetohet për numrin e sekondave të funksionimit për çdo njësi kontrolli. Kujtesa EEPROM ka një numër të kufizuar ciklesh shkrim-fshirje, sipas prodhuesit, 12 herë. Opsioni më i keq është kur të paktën një qelizë përditësohet vazhdimisht. Vëllimi i numëruesit të parë është 100000 bajt, ky është një numër i formatit të gjatë, 1 numërues, gjithsej 4 bajt zënë një rekord. Gjatësia e memories së çipit është 4 bajt; pas 16 hyrjeve me 1024 numërues, regjistrimi do të fillojë nga e para. Në bibliotekën EEPROM, metoda EEPROM.put nuk shkruan; nëse vlera e qelizës dhe informacioni që shkruhet përputhet, nuk do të ketë degradim të qelizave. Si rezultat, koha e garantuar e funksionimit të memories do të jetë më shumë se 64 vjet. Koha e punës së mundshme por jo të garantuar mund të jetë shumë më e gjatë.

Diagrami i qarkutSistemi lokal i mbledhjes së të dhënave autonome
Programi në Arduino IDE//12 byte (328%)

#përfshi // Biblioteka grafike bazë
#përfshi // Bibliotekë specifike për harduerin
#përfshij
#përfshi
#përfshij
#përfshi
#përfshi
radio RF24 (9, 10); // objekt radio për të punuar me bibliotekën RF24,
// dhe numrat e pinit nRF24L01+ (CE, CSN)
#përfshi
DS3231 rtc (SDA, SCL);
Koha t;

//# define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // ju gjithashtu mund ta lidhni këtë me rivendosjen e Arduino
// në këtë rast, vendoseni këtë pin #define në -1!
//#define TFT_DC 9 // DC=RS=A0 - opsionet e përcaktimit për zgjedhjen e një komande ose regjistri të dhënash.
#define TFT_DC 3

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

// Opsioni 2: përdorni çdo kunj, por pak më ngadalë!
#define TFT_SCLK 13 // caktojini këto të jenë çdo gjë që ju pëlqen!
#define TFT_MOSI 11 // caktojini këto të jenë çdo gjë që ju pëlqen!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#përfshi

zhvendosja e bajtit = 52;
byte pinState;
pompë e gjatë e panënshkruar[4];// grup me vlera numëruesi 4 sekondash
noton m = 3600.0;
adresa int e panënshkruar = 0;
int rc;// variabël për numërues
sumprim e gjatë e panënshkruar = 0;
shuma e gjatë e panënshkruar = 0;
bajt i = 0;
bajt k = 34;
i panënshkruar int z = 0;
byte b = B00000001;
bajt pumrcounter[4]; // grup për ruajtjen e gjendjeve të objekteve, 1 - joaktive, 0 - ndezur.
int start = 0; //

konfigurimi i pavlefshëm () {

rtc.begin();
radio.begin(); // Filloni punën nRF24L01+
radio.setChannel(120); // Kanali i të dhënave (nga 0 në 127).
radio.setDataRate (RF24_250KBPS); // Shpejtësia e transferimit të të dhënave (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // fuqia e transmetuesit (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Hapni një tub me një identifikues për transferimin e të dhënave

// Për të vendosur kohën, hiqni komentet e rreshtave të nevojshëm
//rtc.setDOW(1); // Ditë të javës
//rtc.setTime(21, 20, 0); // Koha, në format 24 orë.
//rtc.setDate(29, 10, 2018); // Data, 29 tetor 2018

tft.initR(INITR_BLACKTAB); // inicializoni një çip ST7735S, skedë e zezë
// Përdorni këtë iniciator (zhkoment) nëse jeni duke përdorur një TFT 1.44".
//tft.initR(INITR_144GREENTAB); // inicializoni një çip ST7735S, skedën RED rcB
tft.setTextWrap(false); // Lejo që teksti të dalë nga skaji i djathtë
tft.setRrotullimi(2); // për PCB BLACK dhe RED tft.setRotation(0) ose jo.
tft.fillScreen(ST7735_BLACK); // fshij ekranin

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // shtrëngimi i softuerit po funksionon, nivel i lartë -
// objektet e kontrolluara "nuk funksionojnë", "4" është shkruar në të 1 portat e vjetër D, nuk ndodh numërim.

për ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + zhvendosje ); // shfaqja e numrave të pozicioneve të objekteve të kontrollit
tft.print(rc + 1);
}

tft.setCursor(12, 0); // nxjerr 3 rreshta teksti
tft.println("ZHVILLUESIT & NDËRTIMI"); // për të lavdëruar veten të dashurit
tft.setCursor(24, 10); // ose e drejta e keqe e autorit
tft.print("Zhvilluesi MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//rikuperimi i të dhënave//////////////////////////////////////////////////////////////////// ///////////

për ( z = 0; z < 1023; z += 16 ) { // Përsëritet nëpër të gjitha qelizat e industrisë
//dhe shkruan në një grup prej 4 variablash pompe, 4 bajt për çdo numërues, sepse
// variabël e gjatë e panënshkruar. Ka 4 numërues, një rekord nga të katër merr 4 bajt.
EEPROM.get(z, pompë[0]); // pra, pa ciklin for, më pak volum
EEPROM.get(z+4, pompë[1]);
EEPROM.get(z+8, pompë[2]);
EEPROM.get(z+12, pompë[3]);

// duke caktuar një vlerë të re tjetër për shumën e 4 numëruesve
sumprim = (pompë [0] + pompë [1] + pompë [2] + pompë [3]);

// krahason vlerën e re të shumës së 4 numëruesve në variablin sumprim me vlerën e mëparshme në variablin
// sumsec dhe nëse shuma e mëparshme është më e vogël ose e barabartë me shumën e re, caktohet e reja më e madhe ose e barabartë
// vlera sumsec.

nëse ( sumsec <= sumprim ) {
sumsec = sumprim; //

//dhe vlera aktuale z i caktohet variablës së adresës, z është adresa e fillimit të një blloku 16 bajt me 4 vlera
// numëruesit e regjistruar në të njëjtën kohë (që kur votohet një port, të 8 bitet e tij shkruhen njëkohësisht,
// duke përfshirë 4 bit-ët tanë të nevojshëm të portit D).
adresa = z;
}
}

// duke hyrë edhe një herë në memorien eeprom në adresën e fillimit të një blloku prej 16 bajtësh me 4 vlera të numëruesit të regjistruar
// e fundit, d.m.th. vlerat përpara mbylljes ose rindezjes për shkak të ngrirjes. Regjistrimi i fundit
// Vlerat e numëruesit në një grup prej 4 variablash pompë.

EEPROM.get(adresa, pompë[0]);
EEPROM.get(adresa + 4, pompë[1]);
EEPROM.get(adresa + 8, pompë[2]);
EEPROM.get(adresa + 12, pompë[3]);

adresa += 16; //rritja e adresës për shkrimin e bllokut të ardhshëm pa mbishkrimin e të dhënave të regjistrimit të fundit

//fundi i rikuperimit të të dhënave/////////////////////////////////////////////////////////////////// //////////////////

bashkangjitInterrupt(0, count, RISING); // pin D2, aktivizoni ndërprerjet, vini çdo sekondë
// impulset nga RTC DS3231 nga dalja SQW

wdt_enable(WDTO_8S); // nisni kohëmatësin rojtar, rindizni kontrolluesin në rast ngrirjeje, koha,
// për të cilën duhet të lëshoni komandën e rivendosjes së kohëmatësit wdt_reset( dhe të shmangni rindezjen gjatë funksionimit normal - 8 sek.
// për teste nuk rekomandohet vendosja e vlerës në më pak se 8 sekonda. Në këtë rast preferohet të rivendoset kohëmatësi
// kërcitje, dhe kjo ndodh çdo sekondë.

}

lak i pavlefshëm () {
// cikli bosh, këtu do të ketë kontroll mbi funksionimin në fazë të hapur të motorit elektrik
}

numërimi i zbrazët () {

tft.setTextColor(ST7735_BARDHË); // vendosni ngjyrën e shkronjave
t = rtc.getTime(); // koha e leximit
tft.setCursor(5, 120); // vendosja e pozicionit të kursorit
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // pastrimi i zonës së daljes së kohës
tft.print(rtc.getTimeStr()); // leximet e orës dalëse

wdt_reset(); // rivendosni rojtarin çdo cikël, d.m.th. sekondë

për (rc = 0; rc < 4; rc ++) // fillimi i ciklit për kontrollin e përputhshmërisë së gjendjes hyrëse
// porto bit në gjendjen e mëparshme të leximit të biteve të portit D
{
pinState = (PIND >> 4) & ( b << rc );

nëse (pumrcounter [rc] != pinState) { // dhe nëse nuk përputhet, atëherë
pumrcounter[rc] = pinState; // duke i caktuar variablit të statusit të bitit të portit një vlerë të re 1/0
}
// tregues i gjendjes së objekteve të kontrollit të ngjyrave
// BLU është një defekt i vogël i ekranit ekzistues (apo bibliotekës?), RGB dhe BGR janë të përziera.
nëse (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + zhvendosje)), 7, 7, ST7735_BLUE); // për numërimin e nivelit të ulët, ndryshoni GREEN në BLU
} Tjetër {
tft.fillRect(15, ((rc * 10 + zhvendosje)), 7, 7, ST7735_GREEN); // për numërimin e nivelit të ulët, ndryshoni BLU në GREEN
pompë [rc] += 1; // shtoni 1 sekondë në numëruesin e kohës së funksionimit
}
}

k++;
nëse (k == 36) {
k = 0;

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // pastrimi i zonës së shfaqjes së kohës së funksionimit
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // dhe datat

tft.setCursor(60, 120); // vendosja e pozicionit të kursorit
tft.print(rtc.getDateStr()); // shfaqni datën në ekranin LCD

për (rc = 0; rc < 4; rc ++) //orët e punës në dalje në tërësi, të dhjetat dhe
{
tft.setCursor ( 30, rc * 10 + zhvendosje ); // të qindtat e një ore me zhvendosje të ekranit me 10 pikselë poshtë
tft.println (pompë [rc] / m);
}

// duke shkruar vlerat e orëve të punës "të papërpunuara" (në sekonda) në EEPROM ////////////////////////////

për (rc = 0; rc <4; rc++)
{
EEPROM.put(adresa, pompë [rc]);
adresa += sizeof(float); // rrit variablin e adresës së shkrimit
}
}

// dërgoni të dhëna përmes kanalit të radios nga të dhënat që tregojnë se sa bajt duhet të dërgohen.
nëse ((k == 6 ) || (k == 18 ) || (k == 30 )) {

të dhëna të gjata të panënshkruara;

radio.shkruaj(&fillimi, madhësia(fillimi));

për (i = 0; i <4; i++) {
të dhëna = pompë [i ];
radio.shkruaj( &data, sizeof( të dhëna));
}
}
}

Disa shënime në fund. Numërimi ndodh në një nivel të ulët logjik në hyrje.

Rezistenca e tërheqjes R2-R5 është 36 kOhm për opsionin me fotorezistorë GL5516. Në rastin e një optobashkues fototransistor dhe stafetë, vendoseni në 4,7-5,1 kOhm. Ngarkuesi Arduino Nano v3.0 u zëvendësua me Arduino Uno duke përdorur programuesin TL866A për funksionimin e saktë të kohëmatësit të rojes. Siguresat janë korrigjuar për të funksionuar në tensione mbi 4,3 V. Qarku i jashtëm i rivendosjes R6 C3 nuk është përdorur. Në programin e mostrës, frekuenca e transmetuesit nuk korrespondon me diapazonin e palicencuar; diapazoni 2,4 MHz është i kufizuar në frekuencat 2400.0-2483.5 MHz.

Gama e transmetuesit E01-ML01DP05 është 2400-2525 MHz. Gjerësia e brezit të një kanali është 1 MHz, kur caktoni shpejtësinë si "RF24_2MBPS" kanali i specifikuar radio.setChannel(120) dhe tjetri do të jetë i zënë, d.m.th. brezi do të jetë 2 MHz.

Burimi: www.habr.com

Shto një koment