Lokalni avtonomni sistem zbiranja podatkov

Podjetje je kupilo opazovalne postaje NEKST-M, domače proizvodnje Next Technologies. Za zagotovitev vizualizacije delovanja črpalnih enot,
požarni in varnostni alarmi, prisotnost napetosti na zaganjalnikih, sobna temperatura, nivo vode v sili. Srce NEKST-M je ATMEGA 1280 in to dejstvo je spodbudno z vidika možnosti izdelave lastnega kompleta za specifične potrebe.

Naloga je bila ustvariti popolnoma avtonomen lokalni dispečerski sistem za specifične potrebe v najkrajšem možnem času in z minimalnimi stroški. Osnova je mikrokontroler. Razvoj, proizvodnja, ki jo ustvarjajo zaposleni sami.

Sistem mora delovati neodvisno od mobilnih omrežij, strežnikov, interneta in sistema licenciranja za uporabo radiofrekvenčnih virov, pri delovanju nadzorno-nadzornega sistema ne sme uporabljati računalnikov ali kvečjemu občasno uporabljati prenosne računalnike, brez dostopa do predmetov za dolgo časa (6-9 mesecev). Konfiguracija omrežja ima radialno strukturo. Podatki se zbirajo na eni točki in se nato pošiljajo v obdelavo po običajnih komunikacijskih kanalih ali v tiskani obliki.

Sistem mora zagotoviti:

  • spremljanje delovanja črpalnih enot
  • tehnološka avtomatizacija
  • zaščita pred posledicami izrednih razmer
  • signalizacija v sili
  • izračun obratovalnega časa
  • izračun količine porabljene električne energije
  • nadzor temperature opreme
  • varnostni in požarni alarm
  • periodično snemanje informacij na daljavo
  • neznane prihodnje zahteve

Delovni pogoji:

  • območje pokritosti 1 sq. km.
  • neposredna vidljivost med objekti
  • temperatura od +50 do -50 C
  • vlažnost do 100%
  • biološko aktivne usedline (plesen, sulfat reducirajoče bakterije)
  • vibracije, ne več, strojev razredov 1-2 po GOST ISO 10816-1-97
  • elektromagnetno okolje - preklapljanje elektromotorjev s kontaktorji KT 6053, oprema za mehki zagon RVS-DN, krmilna oprema SIEMENS MICROMASTER PID, sevanje v območju ISM in GSM po zahtevah za te naprave, ročno obločno varjenje na mestu
  • previsoka omrežna napetost, kratkotrajne prekinitve v napajanju, prenapetosti zaradi strele, fazno neravnovesje ob pretrganju žice nadzemnega voda v distribucijskih omrežjih 6-10 kV.

Kljub tako strogim zahtevam je izvedba dokaj enostavna, če problem rešujemo korak za korakom.

Če upoštevamo vse, je plošča »Arduino Nano 3.0« postala »možgani« načrta. Plošča robotdyn ima krmilnik ATMEGA 328, potreben stabilizator napetosti 3,3 V za
tok 800 mA in pretvornik v CH340G UART-USB.

Najprej so bili izdelani števci obratovalnih ur kot najsodobnejši. Prej uporabljeni industrijski števci, sestavljeni na PIC z napajalnim vezjem brez transformatorja, so odpovedali zaradi napetostnih sunkov v enem letu delovanja. Nedotaknjeni so ostali samo tisti, ki so bili povezani z domačimi 5V napajalniki. Za pospešitev namestitve in vsestranskost povezave se signal o stanju enot vzame iz sponk stikalnih naprav, tj. registracija prisotnosti napetosti 1. faze s trifaznim napajanjem 380V. Za koordinacijo s krmilnikom se uporablja vmesni rele z navitjem 220 V ali optični sklopnik, sestavljen iz LED in fotoupora GL5516 ali optični sklopnik PC817. Vse možnosti so bile preizkušene. LED se napaja s popravljeno napetostjo z omejitvijo toka z uporabo dveh kondenzatorjev SVV22, zasnovanih za napetost 630 V, povezanih zaporedno za varnost med nenamernim testiranjem tokokrogov z megohmetrom.
Odčitavanje odčitkov delovnega časa s pomočjo LCD zaslona ST7735S, prenos podatkov v realnem času preko radia z uporabo modula E01-ML01DP05 na frekvenci 2,4 MHz. Ta naprava vsebuje čip nRF24L01+ in oddajno/sprejemni ojačevalnik RFX2401C,
izhodna moč do 100 mW. Spiralne antene, zasnovane za želeno območje v spletnem kalkulatorju strani. Izbira tipa antene je določena z izključitvijo sprejema enkratno odbitih valov od okoliških kovinskih struktur. Deli antene so natisnjeni na 3D tiskalniku. Trenutno stanje števcev je shranjeno v EEPROM samega krmilnika in se obnovi v primeru nepričakovanega izpada električne energije. Časovne intervale za štetje zagotavlja RTC čip DS3231 v obliki modula z rezervno baterijo. Napajalnik uporablja 3 module, dejanski impulzni vir 220/5V HLK-PM01 600mA, pretvornik iz 1-5V v 5V HW-553 и 03962A - baterijski krmilnik z shemo zaščita pred kratkim stikom, prekomerno izpraznitvijo in prenapolnjenostjo. Vse komponente so bile kupljene na spletni strani Aliexpress.

Deska za kruhLokalni avtonomni sistem zbiranja podatkov
4-kanalni števec. Na vhodih so LC filtri za zaščito pred motnjami prek komunikacijske linije s prepletenim parom. Podatki o stanju nadzornih objektov se neprekinjeno berejo enkrat na sekundo in barvno prikazujejo na LCD-ju. Odčitki se posodobijo in zabeležijo v obstojnem pomnilniku vsakih 1 sekund. 36 sekund je 36/1 ure, to je oblika, v kateri so potrebni podatki. Vsakih 100 sekund. prenašajo se informacije o številu sekund delovanja za vsako krmilno enoto. Pomnilnik EEPROM ima omejeno število ciklov pisanja in brisanja, po navedbah proizvajalca 12-krat. Najslabša možnost je, če se vsaj ena celica nenehno posodablja. Obseg 100000. števca je 1 bajtov, to je številka dolgega formata, 4 števci, skupaj en zapis zaseda 4 bajtov. Dolžina pomnilnika čipa je 16 bajtov, po 1024 vnosih 64 števcev se snemanje začne znova. V knjižnici EEPROM metoda EEPROM.put ne piše; če se vrednost celice in zapisane informacije ujemata, ne bo prišlo do degradacije celic. Posledično bo zajamčeni čas delovanja pomnilnika več kot 4 let. Čas možnega, a ne zagotovljenega dela je lahko veliko daljši.

Shema vezjaLokalni avtonomni sistem zbiranja podatkov
Program v Arduino IDE//12 bajtov (328%)

#vključi // Osnovna grafična knjižnica
#vključi // Knjižnica, specifična za strojno opremo
#include
#vključi
#include
#vključi
#vključi
radio RF24 (9, 10); // radijski objekt za delo s knjižnico RF24,
// in številke pin nRF24L01+ (CE, CSN)
#vključi
DS3231 rtc (SDA, SCL);
Čas t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // to lahko povežete tudi s ponastavitvijo Arduino
// v tem primeru nastavite ta pin #define na -1!
//#define TFT_DC 9 // DC=RS=A0 - možnosti označevanja za izbiro ukaznega ali podatkovnega registra.
#define TFT_DC 3

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

// 2. možnost: uporabite poljubne žebljičke, vendar malo počasneje!
#define TFT_SCLK 13 // nastavite, da so to poljubni žebljički!
#define TFT_MOSI 11 // nastavite, da so to poljubni žebljički!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#vključi

premik bajta = 52;
bajt pinState;
unsigned long pump[4];// niz z vrednostmi števca 4 sekund
float m = 3600.0;
nepodpisani int naslov = 0;
int rc;// spremenljivka za števce
nepredznačeni dolgi seštevek = 0;
nepredznačeni dolgi seštevek = 0;
bajt i = 0;
bajt k = 34;
unsigned int z = 0;
bajt b = B00000001;
števec bajtov [4]; // polje za shranjevanje stanj objekta, 1 - izklopljeno, 0 - vključeno.
int začetek = 0; //

nična namestitev () {

rtc.begin();
radio.begin(); // Začetek dela nRF24L01+
radio.setChannel(120); // podatkovni kanal (od 0 do 127).
radio.setDataRate(RF24_250KBPS); // hitrost prenosa podatkov (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // moč oddajnika (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Odpri cev z identifikatorjem za prenos podatkov

// Če želite nastaviti čas, odkomentirajte potrebne vrstice
//rtc.setDOW(1); // Dan v tednu
//rtc.setTime(21, 20, 0); // Čas, v 24-urnem formatu.
//rtc.setDate(29, 10, 2018); // Datum, 29. oktober 2018

tft.initR(INITR_BLACKTAB); // inicializacija čipa ST7735S, črni jeziček
// Uporabite ta inicializator (odkomentirajte), če uporabljate 1.44" TFT
//tft.initR(INITR_144GREENTAB); // inicializirati čip ST7735S, RDEČI zavihek rcB
tft.setTextWrap(false); // Dovolite, da besedilo steče čez desni rob
tft.setRotation(2); // za ČRNO PCB in RDEČE tft.setRotation(0) ali ne.
tft.fillScreen(ST7735_BLACK); // počisti zaslon

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // zaostritev programske opreme deluje, visoka raven -
// nadzorovani objekti »ne delujejo«, »4« se zapiše v vsa 1 nadrejena vrata D, do štetja ne pride.

za (rc = 0; rc < 4; rc++)
{
tft.setCursor (3, rc * 10 + shift); // prikaz številk pozicij kontrolnih objektov
tft.print(rc + 1);
}

tft.setCursor(12, 0); // izpiše 3 vrstice besedila
tft.println("RAZVIJALCI & GRADNJA"); // pohvaliti sebe ljubljene
tft.setCursor(24, 10); // ali zlobne avtorske pravice
tft.print("RAZVIJALEC MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//obnovitev podatkov/////////////////////////////////////////////// ///////////

for ( z = 0; z < 1023; z += 16 ) { // Ponavlja vse celice industrije
//in piše v matriko 4 spremenljivk črpalke, 4 bajte za vsak števec, ker
// nepredznačena dolga spremenljivka. Obstajajo 4 števci, en zapis vseh 4 traja 16 bajtov.
EEPROM.get(z, črpalka[0]); // torej, brez zanke for, manj glasnosti
EEPROM.get(z+4, črpalka[1]);
EEPROM.get(z+8, črpalka[2]);
EEPROM.get(z+12, črpalka[3]);

// dodelitev nove naslednje vrednosti za vsoto 4 števcev
sumprim = (črpalka [0] + črpalka [1] + črpalka [2] + črpalka [3]);

// primerja novo vrednost vsote 4 števcev v spremenljivki sumprim s prejšnjo vrednostjo v spremenljivki
// sumsec in če je prejšnja vsota manjša ali enaka novi vsoti, se dodeli nova večja ali enaka
// vrednost sumsec.

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

//in trenutna vrednost z je dodeljena spremenljivki naslova, z je naslov začetka 16-bajtnega bloka 4 vrednosti
// števci, posneti istočasno (ker se pri preverjanju vrat vseh 8 bitov zapiše hkrati,
// vključno z našimi potrebnimi visokimi 4 biti vrat D).
naslov = z;
}
}

// ponoven dostop do pomnilnika eeprom na naslovu začetka bloka 16 bajtov 4 zabeleženih vrednosti števca
// zadnji, tj. vrednosti pred zaustavitvijo ali ponovnim zagonom zaradi zamrznitve. Snemanje najnovejšega
// vrednosti števca v niz 4 črpanja spremenljivk.

EEPROM.get(naslov, črpalka[0]);
EEPROM.get(naslov + 4, črpalka[1]);
EEPROM.get(naslov + 8, črpalka[2]);
EEPROM.get(naslov + 12, črpalka[3]);

naslov += 16; //povečanje naslova za pisanje naslednjega bloka brez prepisovanja podatkov zadnjega zapisa

//konec obnovitve podatkov/////////////////////////////////////////// / ///////////////////

attachInterrupt(0, count, RISING); // pin D2, omogoči prekinitve, pridejo vsako sekundo
// impulzi iz RTC DS3231 iz izhoda SQW

wdt_omogoči(WDTO_8S); // zagon nadzornega časovnika, ponovni zagon krmilnika v primeru zamrznitve, čas,
// za kar morate izdati ukaz za ponastavitev časovnika wdt_reset( in se izogniti ponovnemu zagonu med normalnim delovanjem - 8 sek.
// za teste ni priporočljivo nastaviti vrednosti na manj kot 8 sekund. V tem primeru je po možnosti ponastavljen časovnik
// trzanje in to se zgodi vsako sekundo.

}

void loop () {
// prazen cikel, tukaj bo nadzor nad odprto fazo delovanja elektromotorja
}

void count() {

tft.setTextColor(ST7735_WHITE); // nastavite barvo pisave
t = rtc.getTime(); // čas branja
tft.setCursor(5, 120); // nastavitev položaja kazalca
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // čiščenje območja izpisa časa
tft.print(rtc.getTimeStr()); // izhodni odčitki ure

wdt_reset(); // ponastavi psa čuvaja vsak cikel, tj. sekundo

for (rc = 0; rc < 4; rc ++) // začetek cikla za preverjanje skladnosti vhodnega stanja
// bitov vrat v prejšnje stanje branja bitov vrat D
{
pinState = (PIND >> 4) & (b << rc);

if (pumrcounter [rc] != pinState) { // in če se ne ujema, potem
pumrcounter[rc] = pinState; // dodeljevanje spremenljivki statusa bita vrat nove vrednosti 1/0
}
// indikacija stanja objektov za nadzor barv
// MODRA je majhna napaka obstoječega zaslona (ali knjižnice?), RGB in BGR sta pomešana.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // za nizko stopnjo štetja spremenite ZELENO v MODRO
} Else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // za nizko stopnjo štetja spremenite MODRO v ZELENO
črpalka [rc] += 1; // dodamo 1 sekundo števcu časa delovanja
}
}

k++;
če (k == 36) {
k = 0;

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // čiščenje območja prikaza časa delovanja
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // in datumi

tft.setCursor(60, 120); // nastavitev položaja kazalca
tft.print(rtc.getDateStr()); // prikaz datuma na LCD zaslonu

za (rc = 0; rc < 4; rc ++) //izhod obratovalnih ur v celoti, desetinke in
{
tft.setCursor (30, rc * 10 + shift); // stotinke ure s premikom zaslona navzdol za 10 slikovnih pik
tft.println(črpalka [rc] / m);
}

// pisanje "surovih" vrednosti obratovalnih ur (v sekundah) v EEPROM ///////////////////////////////

za (rc = 0; rc < 4; rc++)
{
EEPROM.put(naslov, črpalka [rc]);
naslov += sizeof(float); // poveča spremenljivko naslova pisanja
}
}

// pošiljanje podatkov po radijskem kanalu iz podatkov, ki kažejo, koliko bajtov je treba poslati.
if ((k == 6 ) || (k == 18 ) || (k == 30 )) {

nepodpisani dolgi podatki;

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

za (i = 0; i < 4; i++) {
podatki = črpalka [i];
radio.write(&podatki, sizeof(podatki));
}
}
}

Nekaj ​​opomb na koncu. Štetje poteka na nizki logični ravni na vhodih.

Vlečni upor R2-R5 je 36 kOhm za možnost s fotoupori GL5516. V primeru fototranzistorskega optosklopnika in releja nastavite na 4,7–5,1 kOhm. Zagonski nalagalnik Arduino Nano v3.0 je bil zamenjan z Arduino Uno z uporabo programatorja TL866A za pravilno delovanje časovnika čuvaja. Varovalke so popravljene za delovanje pri napetostih nad 4,3 V. Zunanje ponastavitveno vezje R6 C3 ni bilo uporabljeno. V vzorčnem programu frekvenca oddajnika ne ustreza nelicenciranemu območju, območje 2,4 MHz je omejeno na frekvence 2400.0-2483.5 MHz.

Razpon oddajnika E01-ML01DP05 je 2400-2525 MHz. Pasovna širina enega kanala je 1 MHz, pri nastavitvi hitrosti kot “RF24_2MBPS” bosta zasedena navedeni kanal radio.setChannel(120) in naslednji, tj. pas bo 2 MHz.

Vir: www.habr.com

Dodaj komentar