Lokalni autonomni sistem prikupljanja podataka

Kompanija je kupila NEKST-M kontrolne stubove, domaće proizvodnje Next Technologies. Da bi se osigurala vizualizacija rada pumpnih jedinica,
protivpožarni i sigurnosni alarmi, prisustvo napona na starterima, sobna temperatura, nivo vode u slučaju nužde. Srce NEKST-M je ATMEGA 1280 i ova činjenica ohrabruje u smislu mogućnosti kreiranja vlastitog kompleta za specifične potrebe.

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

Sistem mora funkcionisati bez zavisnosti od celularnih mreža, servera, interneta i sistema licenciranja za korišćenje radiofrekventnih resursa, ne sme koristiti računare u radu sistema za nadzor i kontrolu ili, u najvećem broju slučajeva, periodično koristiti laptop, bez pristupa objekata na duže vreme (6-9 meseci). Mrežna konfiguracija ima radijalnu strukturu. Podaci se prikupljaju u jednom trenutku, a zatim šalju na obradu putem redovnih komunikacijskih kanala ili kao štampana kopija.

Sistem mora da obezbedi:

  • praćenje rada pumpnih jedinica
  • tehnološka automatizacija
  • zaštita od posledica vanrednih situacija
  • hitna signalizacija
  • obračun radnog vremena
  • izračunavanje količine potrošene električne energije
  • kontrola temperature opreme
  • sigurnosni i protivpožarni alarm
  • periodično daljinsko snimanje informacija
  • nepoznati budući zahtjevi

Uslovi rada:

  • područje pokrivenosti 1 sq. km.
  • direktna vidljivost između objekata
  • temperatura od +50 do -50 C
  • vlažnost do 100%
  • biološki aktivne naslage (plijesan, bakterije koje reduciraju sulfate)
  • vibracije, ne više, mašina klase 1-2 prema GOST ISO 10816-1-97
  • elektromagnetno okruženje - uključivanje elektromotora sa kontaktorima KT 6053, RVS-DN oprema za meki start, SIEMENS MICROMASTER PID upravljačka oprema, zračenje u ISM i GSM opsegu prema zahtjevima za ove uređaje, ručno elektrolučno zavarivanje na licu mjesta
  • previsok mrežni napon, kratkotrajni prekidi u napajanju električnom energijom, prenaponi groma, neuravnoteženost faza pri pucanju žice nadzemnog voda u distributivnoj mreži 6-10 kV.

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

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

Prije svega, brojači radnih sati kreirani su kao najsavremeniji. Ranije korištena industrijska brojila sastavljena na PIC-ovima sa strujnim krugom bez transformatora otkazala su zbog napona u roku od godinu dana rada. Netaknuti su ostali samo oni spojeni pomoću domaćeg 5V napajanja. Da bi se ubrzala instalacija i svestranost povezivanja, signal o stanju jedinica uzima se sa terminala sklopnih uređaja, tj. registracija prisustva napona 1. faze sa trofaznim napajanjem od 380V. Za koordinaciju sa kontrolerom koristi se međurelej sa namotajem od 220V ili optokapler sastavljen od LED diode i fotootpornika GL5516 ili PC817 optokaplera. Sve opcije su testirane. LED se napaja ispravljenim naponom sa ograničenjem struje pomoću dva SVV22 kondenzatora dizajnirana za napon od 630V serijski spojena radi sigurnosti prilikom slučajnog testiranja kola megoommetrom.
Očitavanje očitavanja radnog vremena pomoću ST7735S LCD ekrana, prijenos podataka u realnom vremenu putem radija pomoću E01-ML01DP05 modula na frekvenciji od 2,4 MHz. Ovaj uređaj sadrži nRF24L01+ čip i RFX2401C pojačalo za prijenos/prijem,
izlazna snaga do 100 mW. Spiralne antene dizajnirane za željeni domet u online kalkulatoru stranice. Izbor tipa antene određen je isključenjem prijema pojedinačno reflektovanih talasa od okolnih metalnih konstrukcija. Dijelovi antene se štampaju na 3D štampaču. Trenutno stanje brojača se pohranjuje u EEPROM samog kontrolera i vraća se u slučaju neočekivanog nestanka struje. Vremenske intervale za brojanje obezbeđuje RTC čip DS3231 u obliku modula sa rezervnom baterijom. Napajanje koristi 3 modula, stvarni izvor impulsa 220/5V HLK-PM01 600mA, konvertor sa 1-5V na 5V HW-553 и 03962A - kontroler baterije sa šemu zaštita od kratkog spoja, prekomjernog pražnjenja i prekomjernog punjenja. Sve komponente su kupljene na Aliexpress web stranici.

Bread boardLokalni autonomni sistem prikupljanja podataka
4-kanalni brojač. Na ulazima se nalaze LC filteri za zaštitu od smetnji preko komunikacione linije upredene parice. Podaci o stanju kontrolnih objekata se stalno čitaju jednom u sekundi i prikazuju u boji na LCD-u. Očitavanja se ažuriraju i bilježe u nepostojanu memoriju svakih 1 sekundi. 36 sekundi je 36/1 sata, ovo je format u kojem se traže podaci. Svakih 100 sek. prenose se informacije o broju sekundi rada za svaku kontrolnu 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. Dužina memorije čipa je 16 bajta; nakon 1024 unosa od 64 brojača, snimanje će početi iznova. U EEPROM biblioteci, metoda EEPROM.put ne piše; ako se vrijednost ćelije i informacije koje se upisuju poklapaju, neće doći do degradacije ćelija. Kao rezultat toga, garantirano vrijeme rada memorije će biti više od 4 godina. Vrijeme mogućeg, ali ne garantovanog rada može biti mnogo duže.

Dijagram strujnog kolaLokalni autonomni sistem prikupljanja podataka
Program u Arduino IDE//12 bajtova (328%)

#include // Osnovna grafička biblioteka
#include // Biblioteka specifična za hardver
#include
#include
#include
#include
#include
RF24 radio(9, 10); // radio objekat za rad sa bibliotekom RF24,
// i pin brojevi nRF24L01+ (CE, CSN)
#include
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 igle, ali malo sporije!
#define TFT_SCLK 13 // postavite ove igle koje god želite!
#define TFT_MOSI 11 // postavite ove igle koje god želite!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#include

pomak bajta = 52;
bajt pinState;
unsigned long pump[4];// niz sa vrijednostima brojača od 4 sekunde
plovak m = 3600.0;
unsigned int adresa = 0;
int rc;// varijabla za brojače
unsigned long zbroj = 0;
unsigned long sumsec = 0;
bajt i = 0;
bajt k = 34;
unsigned int z = 0;
bajt b = B00000001;
bajt pumrcounter[4]; // niz za pohranjivanje stanja objekata, 1 - isključeno, 0 - uključeno.
int start = 0; //

void setup () {

rtc.begin();
radio.begin(); // Pokreni rad nRF24L01+
radio.setChannel(120); // kanal podataka (od 0 do 127).
radio.setDataRate(RF24_250KBPS); // brzina prijenosa podataka (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // snaga predajnika (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

// Da postavite vrijeme, dekomentirajte potrebne redove
//rtc.setDOW(1); // Dan u tjednu
//rtc.setTime(21, 20, 0); // Vrijeme, u 24-satnom formatu.
//rtc.setDate(29, 10, 2018); // Datum, 29. oktobar 2018

tft.initR(INITR_BLACKTAB); // inicijaliziranje ST7735S čipa, crni jezičak
// Koristite ovaj inicijalizator (dekomentirajte) ako koristite 1.44" TFT
//tft.initR(INITR_144GREENTAB); // inicijalizira ST7735S čip, RED rcB tab
tft.setTextWrap(false); // Dozvoli da tekst ide od desne ivice
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; // softversko zatezanje radi, visok nivo -
// kontrolirani objekti “ne rade”, “4” se upisuje na sva 1 viša porta 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("DEVELOPERI & GRADNJA"); // da pohvališ sebe voljene
tft.setCursor(24, 10); // ili zlo autorsko pravo
tft.print("DEVELOPER MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//oporavak podataka///////////////////////////////////////////////////////////////////// ////////////

for ( z = 0; z < 1023; z += 16 ) { // Ponavlja se kroz sve ćelije u industriji
//i upisuje u niz od 4 varijable pumpe, 4 bajta za svaki brojač, jer
// neoznačena duga varijabla. 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 zbir od 4 brojača
sumprim = (pumpa [0] + pumpa [1] + pumpa [2] + pumpa [3]);

// uspoređuje novu vrijednost zbira 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
// vrijednost sumsec.

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

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

// još jednom pristupamo eeprom memoriji na adresi početka bloka od 16 bajtova 4 snimljene vrijednosti brojača
// zadnji, tj. vrijednosti prije isključivanja ili ponovnog pokretanja zbog zamrzavanja. Snimanje najnovijeg
// brojač vrijednosti u niz od 4 varijable pumpa.

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, dolazi svake sekunde
// impulsi iz RTC DS3231 sa SQW izlaza

wdt_enable(WDTO_8S); // pokrenuti watchdog timer, restartovati kontroler u slučaju zamrzavanja, vrijeme,
// za koje trebate izdati naredbu za resetovanje tajmera wdt_reset( i izbjeći ponovno pokretanje tokom normalnog rada - 8 sek.
// za testove nije preporučljivo postaviti vrijednost na manje od 8 sekundi. U ovom slučaju, tajmer se poželjno resetuje
// trza, a to se dešava svake sekunde.

}

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

void count() {

tft.setTextColor(ST7735_WHITE); // postavlja boju fonta
t = rtc.getTime(); // vrijeme čitanja
tft.setCursor(5, 120); // postavljanje pozicije kursora
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // brisanje područja izlaznog vremena
tft.print(rtc.getTimeStr()); // izlazna očitanja sata

wdt_reset(); // resetirajte watchdog svaki ciklus, tj. sekundu

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

if (pumrcounter [rc] != pinState) { // i ako se ne podudara, onda
pumrcounter[rc] = pinState; // dodjeljivanje varijabli statusa bita porta nove vrijednosti 1/0
}
// indikacija stanja objekata kontrole boja
// PLAVA je mala greška postojećeg ekrana (ili biblioteke?), RGB i BGR su pomiješani.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // za nizak nivo brojanja promijenite ZELENO u PLAVO
} Else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // za nizak nivo brojanja promijenite PLAVO u ZELENO
pumpa [rc] += 1; // dodaj 1 sekundu na brojač radnog vremena
}
}

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

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

tft.setCursor(60, 120); // postavljanje pozicije kursora
tft.print(rtc.getDateStr()); // prikaz datuma na LCD ekranu

za (rc = 0; rc < 4; rc ++) //izlaz radnih sati u cjelini, desetine i
{
tft.setCursor ( 30, rc * 10 + shift ); // stotinke sata sa pomakom ekrana naniže za 10 piksela
tft.println(pumpa [rc] / m);
}

// upisivanje "sirovih" radnih sati (u sekundama) u EEPROM //////////////////////////////

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

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

nepotpisani dugi podaci;

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

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

Nekoliko napomena na kraju. Brojanje se dešava na niskom logičkom nivou na ulazima.

Pull-up otpori R2-R5 su 36 kOhm za opciju sa fotootpornicima GL5516. U slučaju fototranzistorskog optokaplera i releja, postavite na 4,7-5,1 kOhm. Arduino Nano v3.0 bootloader je zamijenjen Arduino Uno koristeći TL866A programator za ispravan rad watchdog tajmera. Osigurači su ispravljeni da rade na naponima iznad 4,3 V. Eksterno kolo za resetiranje R6 C3 nije korišteno. U uzorku programa, frekvencija predajnika ne odgovara nelicenciranom opsegu; opseg od 2,4 MHz je ograničen na frekvencije 2400.0-2483.5 MHz.

Opseg predajnika E01-ML01DP05 je 2400-2525 MHz. Propusni opseg jednog kanala je 1 MHz, pri postavljanju brzine kao “RF24_2MBPS” navedeni radio.setChannel(120) kanal će biti zauzeti, tj. opseg će biti 2 MHz.

izvor: www.habr.com

Dodajte komentar