Vietinė autonominė duomenų rinkimo sistema

Bendrovė įsigijo NEKST-M stebėjimo stulpelius, kuriuos šalyje pagamino „Next Technologies“. Siekiant užtikrinti siurbimo įrenginių veikimo vizualizavimą,
priešgaisrinė ir apsaugos signalizacija, įtampos buvimas prie starterių, kambario temperatūra, avarinis vandens lygis. NEKST-M širdis yra ATMEGA 1280 ir šis faktas teikia vilčių dėl galimybės susikurti savo rinkinį konkretiems poreikiams.

Iškeltas uždavinys per trumpiausią įmanomą laiką ir minimaliomis sąnaudomis sukurti visiškai autonomišką vietinę dispečerinę sistemą specifiniams poreikiams tenkinti. Pagrindas yra mikrovaldiklis. Kūrimas, gamyba, sukurta pačių darbuotojų.

Sistema turi veikti nepriklausanti nuo korinio ryšio tinklų, serverių, interneto ir radijo dažnių išteklių naudojimo licencijavimo sistemos, nenaudoti kompiuterių valdymo ir valdymo sistemos veikimui arba daugiausia periodiškai naudoti nešiojamuosius kompiuterius, be prieigos prie objektus ilgą laiką (6-9 mėn.). Tinklo konfigūracija turi radialinę struktūrą. Duomenys renkami vienu metu ir siunčiami apdoroti įprastais ryšio kanalais arba kaip popierinė kopija.

Sistema turi pateikti:

  • siurbimo įrenginių veikimo stebėjimas
  • technologinė automatika
  • apsauga nuo avarinių sąlygų padarinių
  • avarinis signalizavimas
  • veikimo laiko skaičiavimas
  • apskaičiuojant sunaudotos elektros energijos kiekį
  • įrangos temperatūros kontrolė
  • apsauginė ir priešgaisrinė signalizacija
  • periodiškas nuotolinis informacijos registravimas
  • nežinomi ateities reikalavimai

Darbo sąlygos:

  • aprėpties plotas 1 kv.
  • tiesioginis matomumas tarp objektų
  • temperatūra nuo +50 iki -50 C
  • drėgmė iki 100%
  • biologiškai aktyvios nuosėdos (pelėsiai, sulfatus redukuojančios bakterijos)
  • 1-2 klasių mašinų vibracija, ne daugiau, pagal GOST ISO 10816-1-97
  • elektromagnetinė aplinka - elektros variklių perjungimas su KT 6053 kontaktoriais, RVS-DN minkšto paleidimo įranga, SIEMENS MICROMASTER PID valdymo įranga, spinduliavimas ISM ir GSM diapazone pagal šiems įrenginiams keliamus reikalavimus, rankinis lankinis suvirinimas vietoje.
  • per didelė tinklo įtampa, trumpalaikiai elektros tiekimo pertrūkiai, žaibiniai viršįtampiai, fazių disbalansas, kai 6-10 kV skirstomuosiuose tinkluose nutrūksta oro linijos laidas.

Nepaisant tokių griežtų reikalavimų, žingsnis po žingsnio sprendžiant problemą, įgyvendinimas yra gana paprastas.

Atsižvelgiant į viską, „Arduino Nano 3.0“ plokštė tapo plano „smegenimis“. Robotdyno plokštėje yra ATMEGA 328 valdiklis, reikalingas 3,3 V įtampos stabilizatorius
srovė 800 mA ir keitiklis į CH340G UART-USB.

Visų pirma, darbo valandų skaitikliai buvo sukurti kaip patys naujausi. Anksčiau naudoti pramoniniai skaitikliai, surinkti ant PIC su be transformatoriaus maitinimo grandine, sugedo dėl įtampos šuolių per metus nuo eksploatacijos. Tik tie, kurie buvo prijungti naudojant naminius 5 V maitinimo šaltinius, liko nepažeisti. Siekiant pagreitinti montavimą ir sujungimo universalumą, signalas apie įrenginių būklę imamas iš perjungimo įrenginių gnybtų, t.y. 1-osios fazės įtampos buvimo registravimas su trifaziu 380 V maitinimo šaltiniu. Norint suderinti su valdikliu, naudojama tarpinė relė su 220 V apvija arba optronas, sudarytas iš šviesos diodo ir GL5516 fotorezistoriaus arba PC817 optrono. Visi variantai buvo išbandyti. Šviesos diodas maitinamas ištaisyta įtampa su srovės apribojimu, naudojant du SVV22 kondensatorius, suprojektuotus 630 V įtampai, sujungtus nuosekliai, kad būtų užtikrintas saugumas atsitiktinio grandinių bandymo metu megaohmetru.
Veikimo laiko rodmenų nuskaitymas naudojant ST7735S LCD ekraną, duomenų perdavimas realiuoju laiku per radiją naudojant E01-ML01DP05 modulį 2,4 MHz dažniu. Šiame įrenginyje yra lustas nRF24L01+ ir siuntimo / priėmimo stiprintuvas RFX2401C,
išėjimo galia iki 100 mW. Sraigtinės antenos skirtos norimam diapazonui internetiniame skaičiuoklėje svetainė. Antenos tipo pasirinkimas nulemtas atskirai atsispindėjusių bangų priėmimo iš aplinkinių metalinių konstrukcijų neįtraukimo. Antenos dalys spausdinamos 3D spausdintuvu. Dabartinė skaitiklių būsena išsaugoma paties valdiklio EEPROM ir atkuriama netikėtai nutrūkus elektrai. Skaičiavimo laiko intervalus suteikia RTC lustas DS3231 modulio su atsargine baterija pavidalu. Maitinimo šaltinyje naudojami 3 moduliai, tikrasis impulsų šaltinis 220/5V HLK-PM01 600mA, keitiklis nuo 1-5V iki 5V HW-553 и 03962 - akumuliatoriaus valdiklis su schema apsauga nuo trumpojo jungimo, perkrovos ir perkrovimo. Visi komponentai buvo įsigyti Aliexpress svetainėje.

Bandomoji LentaVietinė autonominė duomenų rinkimo sistema
4 kanalų skaitiklis. Prie įėjimų yra LC filtrai, apsaugantys nuo trikdžių per vytos poros ryšio liniją. Duomenys apie valdymo objektų būseną nuolat skaitomi kartą per sekundę ir spalvotai rodomi LCD ekrane. Rodmenys atnaujinami ir įrašomi į nuolatinę atmintį kas 1 sekundes. 36 sekundės yra 36/1 valandos, tokiu formatu reikalingi duomenys. Kas 100 sek. perduodama informacija apie kiekvieno valdymo bloko veikimo sekundžių skaičių. EEPROM atmintis turi ribotą rašymo ir trynimo ciklų skaičių, gamintojo teigimu, 12 100000 kartų. Blogiausias variantas, kai nuolat atnaujinama bent viena ląstelė. 1-ojo skaitiklio tūris yra 4 baitai, tai yra ilgo formato skaičius, 4 skaitikliai, iš viso 16 baitų užima vienas įrašas. Lusto atminties ilgis yra 1024 baitai, po 64 įvedimų iš 4 skaitiklių įrašymas prasidės iš naujo. EEPROM bibliotekoje EEPROM.put metodas nerašo; jei ląstelės reikšmės ir rašoma informacija sutampa, langeliai nepablogės. Dėl to garantuotas atminties veikimo laikas bus daugiau nei 7 metai. Galimo, bet negarantuoto darbo laikas gali būti daug ilgesnis.

Grandinės schemaVietinė autonominė duomenų rinkimo sistema
Programa Arduino IDE//12 328 baitai (38 %)

#įtraukti // Pagrindinė grafikos biblioteka
#įtraukti // Konkrečios aparatinės įrangos biblioteka
# įtraukti
#įtraukti
# įtraukti
#įtraukti
#įtraukti
RF24 radijas (9, 10); // radijo objektas darbui su RF24 biblioteka,
// ir PIN numeriai nRF24L01+ (CE, CSN)
#įtraukti
DS3231 rtc (SDA, SCL);
Laikas t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // taip pat galite tai prijungti prie „Arduino“ nustatymo iš naujo
// Tokiu atveju šį #define PIN nustatykite į -1!
//#define TFT_DC 9 // DC=RS=A0 – komandų ar duomenų registro pasirinkimo žymėjimo parinktys.
#define TFT_DC 3

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

// 2 variantas: naudokite bet kokius kaiščius, bet šiek tiek lėčiau!
#define TFT_SCLK 13 // nustatykite, kad tai būtų bet kokie jums patinkantys kaiščiai!
#define TFT_MOSI 11 // nustatykite, kad tai būtų bet kokie jums patinkantys kaiščiai!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#įtraukti

baitų poslinkis = 52;
baitas pinState;
unsigned long pump[4];// masyvas su 4 sekundžių skaitiklio reikšmėmis
plūdė m = 3600.0;
nepasirašytas int adresas = 0;
int rc;// skaitiklių kintamasis
nepasirašytas ilgas sumprim = 0;
nepasirašytas ilgas sumasec = 0;
baitas i = 0;
baitas k = 34;
nepasirašytas int z = 0;
baitas b = B00000001;
baitų pumrskaitiklis[4]; // masyvas objekto būsenoms saugoti, 1 – išjungtas, 0 – įjungtas.
int pradžia = 0; //

negaliojanti sąranka () {

rtc.begin();
radijas.begin(); // Pradėti darbą nRF24L01+
radijas.setChannel(120); // duomenų kanalas (nuo 0 iki 127).
radio.setDataRate(RF24_250KBPS); // duomenų perdavimo sparta (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radijas.setPALevel(RF24_PA_MAX); // siųstuvo galia (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radijas.openWritingPipe(0xAABBCCDD11LL); // Atidarykite vamzdį su identifikatoriumi duomenų perdavimui

// Norėdami nustatyti laiką, panaikinkite reikiamas eilutes
//rtc.setDOW(1); // Savaitės diena
//rtc.setTime(21, 20, 0); // Laikas, 24 valandų formatu.
//rtc.setDate(29, 10, 2018); // Data, 29 m. spalio 2018 d

tft.initR(INITR_BLACKTAB); // inicijuokite ST7735S lustą, juodas skirtukas
// Jei naudojate 1.44 colio TFT, naudokite šį iniciatorių (komentarų panaikinimas).
//tft.initR(INITR_144GREENTAB); // inicijuokite ST7735S lustą, RED rcB skirtuką
tft.setTextWrap(false); // Leisti tekstui nubėgti nuo dešiniojo krašto
tft.setRotation( 2 ); // BLACK PCB ir RED tft.setRotation(0) ar ne.
tft.fillScreen(ST7735_BLACK); // išvalykite ekraną

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // programinės įrangos griežtinimas veikia, aukštas lygis -
// valdomi objektai „neveikia“, „4“ rašoma į visus 1 vyresniuosius prievadus D, skaičiavimas nevyksta.

for ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + Shift ); // valdymo objektų pozicijų numerių rodymas
tft.print(rc + 1);
}

tft.setCursor(12, 0); // išvesti 3 teksto eilutes
tft.println("KŪRĖJAI IR KURTI"); // pagirti save mylimieji
tft.setCursor(24, 10); // arba blogos autorių teisės
tft.print("DEVELOPER MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//duomenų atkūrimas////////////////////////////////////////////// ///////////

for (z = 0; z < 1023; z += 16 ) { // kartojasi per visas pramonės šakas
//ir rašo į 4 siurblio kintamųjų masyvą, po 4 baitus kiekvienam skaitikliui, nes
// nepasirašytas ilgas kintamasis. Yra 4 skaitikliai, vienas įrašas iš visų 4 užima 16 baitų.
EEPROM.get(z, siurblys[0]); // taigi, be for ciklo, mažesnis garsumas
EEPROM.get(z+4, siurblys[1]);
EEPROM.get(z+8, siurblys[2]);
EEPROM.get(z+12, siurblys[3]);

// naujos kitos reikšmės priskyrimas 4 skaitiklių sumai
sumprim = (siurblys [0] + siurblys [1] + siurblys [2] + siurblys [3]);

// lygina naują 4 skaitiklių sumos reikšmę sumprim kintamajame su ankstesne kintamojo reikšme
// sumsec ir jei ankstesnė suma yra mažesnė arba lygi naujai sumai, priskiriama nauja didesnė arba lygi
// sumsec reikšmė.

if ( sumsec <= sumprim ) {
sumsec = sumprim; //

//ir dabartinė reikšmė z priskiriama adreso kintamajam, z yra 16 baitų 4 reikšmių bloko pradžios adresas
// tuo pačiu metu įrašyti skaitikliai (nes apklausiant prievadą visi 8 jo bitai įrašomi vienu metu,
// įskaitant mūsų būtinus didelius 4 prievado D bitus).
adresas = z;
}
}

// dar kartą pasiekiant eeprom atmintį 16 baitų 4 įrašytų skaitiklio reikšmių bloko pradžios adresu
// paskutinis, t.y. vertės prieš išjungiant arba paleidžiant iš naujo dėl užšalimo. Įrašant naujausią
// skaitiklio reikšmes į 4 kintamųjų masyvą siurblys.

EEPROM.get(adresas, siurblys[0]);
EEPROM.get(adresas + 4, siurblys[1]);
EEPROM.get(adresas + 8, siurblys[2]);
EEPROM.get(adresas + 12, siurblys[3]);

adresas += 16; //adreso, skirto kitam blokui rašyti, padidinimas neperrašant paskutinio įrašo duomenų

//duomenų atkūrimo pabaiga///////////////////////////////////////////// ///////////////////

attachInterrupt(0, skaiciavimas, RISING); // kaištis D2, įjungti pertraukimus, ateina kas sekundę
// impulsai iš RTC DS3231 iš SQW išvesties

wdt_enable(WDTO_8S); // paleiskite budėjimo laikmatį, perkraukite valdiklį, jei užšaltų, laikas,
// kuriai reikia duoti laikmačio atstatymo komandą wdt_reset( ir išvengti perkrovimo normaliai veikiant - 8 sek.
// testams nerekomenduojama nustatyti mažesnės nei 8 sekundžių reikšmės. Tokiu atveju pageidautina, kad laikmatis būtų nustatytas iš naujo
// trūkčioja, ir tai vyksta kas sekundę.

}

negaliojanti kilpa () {
// tuščias ciklas, čia bus valdomas atviros fazės elektros variklio veikimas
}

galiojantis skaičius () {

tft.setTextColor(ST7735_WHITE); // nustatyti šrifto spalvą
t = rtc.getTime(); // skaitymo laikas
tft.setCursor(5, 120); // žymeklio padėties nustatymas
tft.fillRect(5, 120, 50, 7, ST7735_JUODAS); // laiko išvesties srities išvalymas
tft.print(rtc.getTimeStr()); // išvesties laikrodžio rodmenys

wdt_reset(); // iš naujo nustatyti sarginį šunį kiekvieną ciklą, t.y. sekundę

for (rc = 0; rc < 4; rc ++) // ciklo pradžia, skirta įvesties būsenos atitikčiai patikrinti
// prievado bitai į ankstesnę D prievado bitų skaitymo būseną
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // ir jei nesutampa, tada
pumrcounter[rc] = pinState; // prievado bitų būsenos kintamajam priskiriant naują reikšmę 1/0
}
// spalvų valdymo objektų būklės indikacija
// MĖLYNA yra nedidelis esamo ekrano (ar bibliotekos?) gedimas, RGB ir BGR yra sumaišyti.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // žemo lygio skaičiavimui pakeiskite ŽALIĄ į MĖLYNĄ
} Else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // žemo lygio skaičiavimui pakeiskite MĖLYNĄ į ŽALIĄ
siurblys [rc] += 1; // pridėti 1 sekundę prie veikimo laiko skaitiklio
}
}

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

tft.fillRect(30, shift, 97, 40, ST7735_JUODAS); // darbo laiko rodymo srities išvalymas
tft.fillRect(60, 120, 73, 7, ST7735_JUODAS); // ir datos

tft.setCursor(60, 120); // žymeklio padėties nustatymas
tft.print(rtc.getDateStr()); // LCD ekrane rodoma data

už (rc = 0; rc < 4; rc ++) //išvesties darbo valandas iš viso, dešimtosiomis ir
{
tft.setCursor ( 30, rc * 10 + shift ); // šimtosios valandos su ekrano poslinkiu 10 pikselių
tft.println(siurblys [rc] / m);
}

// „neapdorotų“ darbo valandų verčių (sekundėmis) rašymas į EEPROM //////////////////////////////

už (rc = 0; rc < 4; rc++)
{
EEPROM.put(adresas, siurblys [rc]);
adresas += sizeof(float); // padidinkite rašymo adreso kintamąjį
}
}

// siųsti duomenis radijo kanalu iš duomenų, nurodančių, kiek baitų reikia išsiųsti.
if ((k == 6 ) || (k == 18 ) || (k == 30 )) {

nepasirašyti ilgi duomenys;

radio.write(&start, sizeof(pradžia));

už (i = 0; i < 4; i++) {
duomenys = siurblys [i ];
radio.write( &duomenys, dydis(duomenys));
}
}
}

Pabaigoje keletas pastabų. Skaičiavimas vyksta žemu loginiu lygiu prie įėjimų.

Ištraukimo varža R2-R5 yra 36 kOhm, jei naudojama fotorezistoriai GL5516. Fototranzistoriaus optrono ir relės atveju nustatykite 4,7–5,1 kOhm. „Arduino Nano v3.0“ įkrovos įkroviklis buvo pakeistas „Arduino Uno“, naudojant TL866A programuotoją, kad tinkamai veiktų „watchdog“ laikmatis. Saugikliai pakoreguoti veikti esant aukštesnei nei 4,3 V įtampai. Išorinė atstatymo grandinė R6 C3 nebuvo naudojama. Pavyzdinėje programoje siųstuvo dažnis neatitinka nelicencijuoto diapazono, 2,4 MHz diapazonas ribojamas iki 2400.0-2483.5 MHz dažnių.

E01-ML01DP05 siųstuvo diapazonas yra 2400-2525 MHz. Vieno kanalo pralaidumas yra 1 MHz, nustačius greitį “RF24_2MBPS” nurodytas radio.setChannel(120) kanalas ir kitas bus užimtas, t.y. juosta bus 2 MHz.

Šaltinis: www.habr.com

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