Lokalni autonomni sustav prikupljanja podataka

Tvrtka je kupila nadzorne stupove NEKST-M, domaće proizvodnje tvrtke Next Technologies. Kako bi se osigurala vizualizacija rada crpnih jedinica,
protupožarni i sigurnosni alarmi, prisutnost napona na starterima, sobna temperatura, razina vode u nuždi. Srce NEKST-M-a je ATMEGA 1280 i ta činjenica ohrabruje u smislu mogućnosti kreiranja vlastitog kompleta za specifične potrebe.

Postavljen je zadatak stvoriti potpuno autonomni lokalni dispečerski sustav za specifične potrebe u najkraćem mogućem roku i uz minimalne troškove. Osnova je mikrokontroler. Razvoj, proizvodnja, kreirano od strane osoblja.

Sustav mora raditi bez ovisnosti o mobilnim mrežama, serverima, internetu i sustavu licenciranja za korištenje radiofrekvencijskih resursa, ne smije koristiti računala u radu sustava nadzora i upravljanja ili, najviše, povremeno koristiti prijenosna računala, bez pristupa objekti dulje vrijeme (6-9 mjeseci). Konfiguracija mreže ima radijalnu strukturu. Podaci se skupljaju u jednom trenutku i zatim šalju na obradu redovnim komunikacijskim kanalima ili u tiskanom obliku.

Sustav mora osigurati:

  • praćenje rada crpnih jedinica
  • tehnološka automatizacija
  • zaštita od posljedica izvanrednih stanja
  • hitna signalizacija
  • proračun vremena rada
  • izračunavanje količine utrošene električne energije
  • kontrola temperature opreme
  • sigurnosni i protupožarni alarm
  • periodično daljinsko snimanje informacija
  • nepoznati budući zahtjevi

Radni uvjeti:

  • područje pokrivenosti 1 sq. km.
  • izravna vidljivost između objekata
  • temperatura od +50 do -50 C
  • vlažnost do 100%
  • biološki aktivne naslage (plijesan, sulfat reducirajuće bakterije)
  • vibracije, ne više, strojeva klase 1-2 prema GOST ISO 10816-1-97
  • elektromagnetsko okruženje - preklapanje elektromotora s kontaktorima KT 6053, RVS-DN soft start oprema, SIEMENS MICROMASTER PID upravljačka oprema, zračenje u ISM i GSM području prema zahtjevima za ove uređaje, ručno elektrolučno zavarivanje na licu mjesta
  • previsok mrežni napon, kratkotrajni prekidi u napajanju, grmljavinski prenaponi, fazna neravnoteža pri puknuću žice nadzemnog voda u distribucijskim mrežama 6-10 kV.

Unatoč tako strogim zahtjevima, implementacija je prilično jednostavna kada se problem rješava korak po korak.

Uzimajući sve u obzir, ploča “Arduino Nano 3.0” postala je “mozak” plana. Ploča robotdyn ima kontroler ATMEGA 328, potreban stabilizator napona od 3,3 V za
struja 800 mA i pretvarač u CH340G UART-USB.

Prije svega, izrađeni su brojači radnih sati kao najsuvremeniji. Prethodno korištena industrijska brojila sastavljena na PIC-ovima s strujnim krugom napajanja bez transformatora otkazala su zbog skokova napona unutar godinu dana rada. Netaknuti su ostali samo oni spojeni pomoću kućnih izvora napajanja od 5 V. Kako bi se ubrzala instalacija i svestranost povezivanja, signal o stanju jedinica uzima se sa stezaljki rasklopnih uređaja, tj. registracija prisutnosti 1.faznog napona s trofaznim napajanjem od 380V. Za koordinaciju s kontrolerom koristi se međurelej s namotom od 220 V ili optokaplerom sastavljenim od LED diode i fotootpornika GL5516 ili optokaplerom PC817. Sve opcije su testirane. LED se napaja ispravljenim naponom s ograničenjem struje pomoću dva kondenzatora SVV22 dizajnirana za napon od 630 V spojena u seriju radi sigurnosti tijekom slučajnog testiranja krugova megaommetrom.
Očitavanje vremena rada pomoću ST7735S LCD zaslona, ​​prijenos podataka u stvarnom vremenu putem radija pomoću modula E01-ML01DP05 na frekvenciji od 2,4 MHz. Ovaj uređaj sadrži nRF24L01+ čip i RFX2401C odašiljačko/prijemno pojačalo,
izlazna snaga do 100 mW. Spiralne antene dizajnirane za željeni raspon u online kalkulatoru сайта. Izbor tipa antene određen je isključivanjem prijema pojedinačno reflektiranih valova od okolnih metalnih struktura. Dijelovi antene se printaju na 3D printeru. Trenutno stanje brojača pohranjuje se u EEPROM-u samog kontrolera i obnavlja se u slučaju neočekivanog nestanka struje. Vremenske intervale za brojanje osigurava RTC čip DS3231 u obliku modula s rezervnom baterijom. Napajanje koristi 3 modula, stvarni izvor impulsa 220/5V HLK-PM01 600mA, pretvarač iz 1-5V u 5V HW-553 и 03962 - kontroler baterije sa shema zaštita od kratkog spoja, prekomjernog pražnjenja i prepunjavanja. Sve komponente su kupljene na web stranici Aliexpress.

Daska za kruhLokalni autonomni sustav prikupljanja podataka
4-kanalni brojač. Na ulazima postoje LC filteri za zaštitu od smetnji preko komunikacijske linije s upredenom paricom. Podaci o stanju kontrolnih objekata konstantno se očitavaju jednom u sekundi i prikazuju u boji na LCD-u. Očitanja se ažuriraju i bilježe u trajnu memoriju svakih 1 sekundi. 36 sekundi je 36/1 sata, ovo je format u kojem su potrebni podaci. Svakih 100 sekundi. prenosi se informacija o broju sekundi rada za svaku upravljačku jedinicu. EEPROM memorija ima ograničen broj ciklusa pisanja-brisanja, prema proizvođaču, 12 puta. Najgora opcija je kada se barem jedna ćelija stalno ažurira. Volumen 100000. brojača je 1 bajta, ovo je broj dugog formata, 4 brojača, ukupno 4 bajtova zauzima jedan zapis. Duljina memorije čipa je 16 bajta, nakon 1024 unosa 64 brojača, snimanje će početi ispočetka. U EEPROM biblioteci, metoda EEPROM.put ne zapisuje; ako se vrijednost ćelije i informacija koja se upisuje podudaraju, neće doći do degradacije ćelija. Kao rezultat toga, zajamčeno vrijeme rada memorije bit će više od 4 godina. Vrijeme mogućeg, ali ne i garantiranog rada može biti puno duže.

Kružni dijagramLokalni autonomni sustav prikupljanja podataka
Program u Arduino IDE//12 bajtova (328%)

#uključi // Osnovna grafička biblioteka
#uključi // Biblioteka specifična za hardver
#uključi
#uključi
#include
#uključi
#uključi
RF24 radio (9, 10); // radio objekt za rad s bibliotekom RF24,
// i brojevi pinova nRF24L01+ (CE, CSN)
#uključi
DS3231 rtc (SDA, SCL);
Vrijeme t;

//#definiraj TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // ovo također možete povezati s Arduino resetiranjem
// u tom slučaju postavite ovaj #define pin na -1!
//#define TFT_DC 9 // DC=RS=A0 - opcije označavanja za odabir naredbe ili registra podataka.
#define TFT_DC 3

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

// Opcija 2: koristite bilo koje pribadače, ali malo sporije!
#define TFT_SCLK 13 // postavite da to budu pribadače koje želite!
#define TFT_MOSI 11 // postavite da to budu pribadače koje želite!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#uključi

pomak bajta = 52;
bajt pinState;
unsigned long pump[4];// niz s vrijednostima brojača od 4 sekunde
plovak m = 3600.0;
unsigned int adresa = 0;
int rc;// varijabla za brojače
dugi sumprim bez predznaka = 0;
dugi sumsec bez predznaka = 0;
bajt i = 0;
bajt k = 34;
unsigned int z = 0;
bajt b = B00000001;
brojač pumpi bajtova[4]; // niz za pohranu stanja objekta, 1 - isključeno, 0 - uključeno.
int početak = 0; //

void setup () {

rtc.begin();
radio.begin(); // Pokretanje rada nRF24L01+
radio.setChannel(120); // podatkovni kanal (od 0 do 127).
radio.setDataRate(RF24_250KBPS); // brzina prijenosa podataka (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // snaga odašiljača (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Otvaranje cijevi s identifikatorom za prijenos podataka

// Za postavljanje vremena uklonite komentare s potrebnih redaka
//rtc.setDOW(1); // Dan u tjednu
//rtc.setTime(21, 20, 0); // Vrijeme, u 24-satnom formatu.
//rtc.setDate(29, 10, 2018); // Datum, 29. listopada 2018

tft.initR(INITR_BLACKTAB); // inicijalizirati ST7735S čip, crni jezičak
// Koristite ovaj inicijalizator (dekomentirajte) ako koristite 1.44" TFT
//tft.initR(INITR_144GREENTAB); // inicijalizirati ST7735S čip, CRVENA rcB kartica
tft.setTextWrap(false); // Dopusti tekstu da pređe desni rub
tft.setRotation( 2 ); // za CRNU PCB i CRVENU tft.setRotation(0) ili ne.
tft.fillScreen(ST7735_BLACK); // očisti ekran

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // zatezanje softvera radi, visoka razina -
// kontrolirani objekti “ne rade”, “4” se upisuje na sva 1 viša priključka D, nema brojanja.

za ( rc = 0; rc < 4; rc++)
{
tft.setCursor (3, rc * 10 + shift); // prikaz brojeva pozicija kontrolnih objekata
tft.print(rc + 1);
}

tft.setCursor(12, 0); // izlaz 3 reda teksta
tft.println("RAZVOJI & IZGRADNJA"); // hvaliti sebe drage
tft.setCursor(24, 10); // ili zla autorska prava
tft.print("DEVELOPER MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//povrat podataka////////////////////////////////////////////// ////////////

for ( z = 0; z < 1023; z += 16 ) { // Ponavlja kroz sve ćelije industrije
//i piše u niz od 4 varijable pumpe, 4 bajta za svaki brojač, jer
// duga varijabla bez predznaka. Postoje 4 brojača, jedan zapis od sva 4 zauzima 16 bajtova.
EEPROM.get(z, pumpa[0]); // dakle, bez for petlje, manji volumen
EEPROM.get(z+4, pumpa[1]);
EEPROM.get(z+8, pumpa[2]);
EEPROM.get(z+12, pumpa[3]);

// dodjeljivanje nove sljedeće vrijednosti za zbroj 4 brojača
sumprim = (pumpa [0] + pumpa [1] + pumpa [2] + pumpa [3]);

// uspoređuje novu vrijednost zbroja 4 brojača u varijabli sumprim s prethodnom vrijednošću u varijabli
// sumsec i ako je prethodni zbroj manji ili jednak novom zbroju, dodjeljuje se novi veći ili jednak
// sumsec vrijednost.

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

//i trenutna vrijednost z je dodijeljena varijabli adrese, z je adresa početka 16-bajtnog bloka od 4 vrijednosti
// brojači snimljeni u isto vrijeme (budući da se pri prozivanju porta svih njegovih 8 bitova upisuje istovremeno,
// uključujući naša neophodna visoka 4 bita priključka D).
adresa = z;
}
}

// ponovno pristupanje eeprom memoriji na adresi početka bloka od 16 bajtova 4 snimljene vrijednosti brojača
// posljednji, tj. vrijednosti prije isključivanja ili ponovnog pokretanja zbog zamrzavanja. Snimanje najnovije
// vrijednosti brojača u nizu od 4 pumpe varijabli.

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

adresa += 16; //povećanje adrese za pisanje sljedećeg bloka bez prepisivanja podataka posljednjeg zapisa

//kraj oporavka podataka/////////////////////////////////////////// / ///////////////////

attachInterrupt(0, count, RISING); // pin D2, omogući prekide, dolaze svake sekunde
// impulsi iz RTC DS3231 iz SQW izlaza

wdt_omogući(WDTO_8S); // pokretanje nadzornog mjerača vremena, ponovno pokretanje kontrolera u slučaju zamrzavanja, vrijeme,
// za što trebate izdati naredbu za poništavanje timera wdt_reset( i izbjegavati ponovno pokretanje tijekom normalnog rada - 8 sek.
// za testove se ne preporuča postaviti vrijednost na manje od 8 sekundi. U tom slučaju, mjerač vremena je poželjno resetirati
// trzanje, i to se događa svake sekunde.

}

petlja void () {
// prazan ciklus, ovdje će biti kontrola rada elektromotora u otvorenoj fazi
}

void count() {

tft.setTextColor(ST7735_WHITE); // postavite boju fonta
t = rtc.getTime(); // vrijeme čitanja
tft.setCursor(5, 120); // postavljanje položaja kursora
tft.fillRect(5, 120, 50, 7, ST7735_CRNO); // brisanje područja vremenskog izlaza
tft.print(rtc.getTimeStr()); // izlaz očitanja sata

wdt_reset(); // resetiraj čuvara svakog ciklusa, tj. sekunde

for (rc = 0; rc < 4; rc ++) // početak ciklusa za provjeru usklađenosti ulaznog stanja
// bitovi porta u prethodno stanje čitanja bitova porta D
{
pinState = (PIND >> 4) & (b << rc);

if (pumrcounter [rc] != pinState) { // i ako ne odgovara, onda
pumrcounter[rc] = pinState; // dodjeljivanje varijabli statusa bita porta nove vrijednosti 1/0
}
// indikacija stanja objekata kontrole boje
// PLAVA je mala greška postojećeg zaslona (ili knjižnice?), RGB i BGR su pomiješani.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // za nisku razinu brojanja promijenite ZELENO u PLAVO
} Else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // za nisku razinu brojanja promijenite PLAVO u ZELENO
pumpa [rc] += 1; // dodajte 1 sekundu brojaču vremena rada
}
}

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

tft.fillRect(30, pomak, 97, 40, ST7735_CRNO); // brisanje područja prikaza radnog vremena
tft.fillRect(60, 120, 73, 7, ST7735_CRNO); // i datumi

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

za (rc = 0; rc < 4; rc ++) //izlazni radni sati u cijelosti, desetinke i
{
tft.setCursor (30, rc * 10 + shift); // stotinke sata s pomakom zaslona prema dolje za 10 piksela
tft.println(pumpa [rc] / m);
}

// pisanje “neobrađenih” vrijednosti radnih sati (u sekundama) u EEPROM ///////////////////////////////

za (rc = 0; rc < 4; rc++)
{
EEPROM.put(adresa, pumpa [rc]);
adresa += sizeof(float); // povećava varijablu adrese pisanja
}
}

// slanje podataka preko radio kanala iz podataka koji pokazuju koliko bajtova treba poslati.
if ((k == 6 ) || (k == 18 ) || (k == 30 )) {

dugi podaci bez potpisa;

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

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

Nekoliko napomena na kraju. Brojanje se događa na niskoj logičkoj razini na ulazima.

Pull-up otpori R2-R5 su 36 kOhm za opciju s fotootpornicima GL5516. U slučaju foto-tranzistorskog optokaplera i releja, postavite na 4,7-5,1 kOhm. Arduino Nano v3.0 bootloader zamijenjen je Arduino Uno pomoću programatora TL866A za ispravan rad watchdog timera. Osigurači su ispravljeni za rad na naponima iznad 4,3 V. Eksterni krug resetiranja R6 C3 nije korišten. U oglednom programu frekvencija odašiljača ne odgovara nelicenciranom rasponu; raspon od 2,4 MHz ograničen je na frekvencije 2400.0-2483.5 MHz.

Raspon odašiljača E01-ML01DP05 je 2400-2525 MHz. Propusnost jednog kanala je 1 MHz, kada se brzina postavi na “RF24_2MBPS” navedeni radio.setChannel(120) kanal i sljedeći će biti zauzeti, tj. opseg će biti 2 MHz.

Izvor: www.habr.com

Dodajte komentar