Sistem local autonom de colectare a datelor

Compania a achiziționat posturi de monitorizare NEKST-M, produse pe plan intern de Next Technologies. Pentru a asigura vizualizarea funcționării unităților de pompare,
alarme incendiu si securitate, prezenta tensiunii la demaroare, temperatura camerei, nivelul apei de urgenta. Inima NEKST-M este ATMEGA 1280 și acest fapt este încurajator în ceea ce privește posibilitatea de a crea propriul kit pentru nevoi specifice.

Sarcina a fost stabilită pentru a crea un sistem de dispecerat local complet autonom pentru nevoi specifice în cel mai scurt timp posibil și la costuri minime. Baza este un microcontroler. Dezvoltare, producție, creată de personalul însuși.

Sistemul trebuie să funcționeze fără a depinde de rețelele celulare, servere, internetul și sistemul de licențiere pentru utilizarea resurselor de radiofrecvență, să nu folosească calculatoare în funcționarea sistemului de monitorizare și control sau, cel mult, să utilizeze periodic laptop-uri, fără acces la obiecte pentru o perioadă lungă de timp (6-9 luni). Configurația rețelei are o structură radială. Datele sunt colectate la un moment dat și apoi trimise pentru procesare prin canale obișnuite de comunicare sau ca o copie pe hârtie.

Sistemul trebuie să ofere:

  • monitorizarea functionarii unitatilor de pompare
  • automatizare tehnologică
  • protecția împotriva consecințelor condițiilor de urgență
  • semnalizare de urgență
  • calculul timpului de funcționare
  • calcularea cantității de energie electrică consumată
  • controlul temperaturii echipamentului
  • securitate si alarma de incendiu
  • înregistrarea periodică de la distanță a informațiilor
  • cerințe viitoare necunoscute

Conditii de lucru:

  • suprafata de acoperire 1 km patrati.
  • vizibilitate directă între obiecte
  • temperatura de la +50 la -50 C
  • umiditate pana la 100%
  • depozite biologic active (mucegai, bacterii reducătoare de sulfat)
  • vibrația, nu mai mult, a mașinilor din clasele 1-2 conform GOST ISO 10816-1-97
  • mediu electromagnetic - comutarea motoarelor electrice cu contactoare KT 6053, echipament soft start RVS-DN, echipament de control SIEMENS MICROMASTER PID, radiații în gama ISM și GSM conform cerințelor pentru aceste dispozitive, sudare manuală cu arc la fața locului
  • tensiune excesivă a rețelei, întreruperi de scurtă durată în alimentarea cu energie electrică, supratensiuni fulgere, dezechilibru de fază la ruperea unui fir de linie aeriană în rețelele de distribuție de 6-10 kV.

În ciuda cerințelor atât de stricte, implementarea este destul de simplă atunci când rezolvați problema pas cu pas.

Luând în considerare totul, placa „Arduino Nano 3.0” a devenit „creierul” planului. Placa robotdyn are un controler ATMEGA 328, stabilizatorul de tensiune de 3,3V necesar pentru
curent 800 mA și convertor la CH340G UART-USB.

În primul rând, contoarele de ore de funcționare au fost create ca fiind cele mai actualizate. Contoarele industriale utilizate anterior asamblate pe PIC-uri cu un circuit de alimentare fără transformator au eșuat din cauza supratensiunii în decurs de un an de la funcționare. Doar cele conectate folosind surse de alimentare de 5V de casă au rămas intacte. Pentru a accelera instalarea și versatilitatea conexiunii, un semnal despre starea unităților este preluat de la bornele dispozitivelor de comutare, de exemplu. înregistrarea prezenței tensiunii de fază 1 cu o sursă de alimentare trifazată de 380V. Pentru coordonarea cu controlerul se folosește un releu intermediar cu o înfășurare de 220V sau un optocupler compus dintr-un LED și un fotorezistor GL5516 sau un optocupler PC817. Toate opțiunile au fost testate. LED-ul este alimentat de o tensiune redresată cu limitare de curent folosind doi condensatori SVV22 proiectați pentru o tensiune de 630V conectați în serie pentru siguranță în timpul testării accidentale a circuitelor cu un megahmmetru.
Citirea citirilor timpului de funcționare folosind ecranul LCD ST7735S, transmisie de date în timp real prin radio folosind modulul E01-ML01DP05 la o frecvență de 2,4 MHz. Acest dispozitiv conține cipul nRF24L01+ și amplificatorul de transmisie/recepție RFX2401C,
putere de ieșire de până la 100 mW. Antene elicoidale concepute pentru gama dorită în calculatorul online сайта. Alegerea tipului de antenă este determinată de excluderea recepției undelor reflectate individual din structurile metalice din jur. Piesele antenei sunt imprimate pe o imprimantă 3D. Starea curentă a contoarelor este stocată în EEPROM-ul controlerului însuși și este restabilită în cazul unei întreruperi neașteptate de curent. Intervalele de timp pentru numărare sunt furnizate de cipul RTC DS3231 sub forma unui modul cu o baterie de rezervă. Sursa de alimentare foloseste 3 module, sursa de impuls propriu-zisa 220/5V HLK-PM01 600mA, un convertor de la 1-5V la 5V HW-553 и 03962A - controler baterie cu sistem protecție împotriva scurtcircuitului, supradescărcării și supraîncărcării. Toate componentele au fost achiziționate de pe site-ul Aliexpress.

Tabla de paineSistem local autonom de colectare a datelor
Contor cu 4 canale. Există filtre LC la intrări pentru a proteja împotriva interferențelor pe o linie de comunicație cu perechi răsucite. Datele despre starea obiectelor de control sunt citite constant o dată pe secundă și afișate color pe ecranul LCD. Citirile sunt actualizate și înregistrate în memoria nevolatilă la fiecare 1 de secunde. 36 de secunde este 36/1 de oră, acesta este formatul în care sunt necesare datele. La fiecare 100 sec. sunt transmise informații despre numărul de secunde de funcționare pentru fiecare unitate de control. Memoria EEPROM are un număr limitat de cicluri de scriere-ștergere, conform producătorului, de 12 de ori. Cea mai proastă opțiune este atunci când cel puțin o celulă este actualizată în mod constant. Volumul primului contor este de 100000 octeți, acesta este un număr de format lung, 1 contoare, un total de 4 octeți este ocupat de o înregistrare. Lungimea memoriei cipului este de 4 de octeți; după 16 de intrări a 1024 contoare, înregistrarea va începe de la capăt. În biblioteca EEPROM, metoda EEPROM.put nu scrie; dacă valoarea celulei și informațiile care sunt scrise se potrivesc, nu va exista nicio degradare a celulelor. Ca urmare, durata de funcționare a memoriei garantată va fi mai mare de 64 ani. Timpul de lucru posibil, dar negarantat, poate fi mult mai lung.

Schema circuituluiSistem local autonom de colectare a datelor
Program în Arduino IDE//12 octeți (328%)

#include // Bibliotecă grafică de bază
#include // Bibliotecă specifică hardware-ului
#include
#include
#include
#include
#include
radio RF24 (9, 10); // obiect radio pentru lucrul cu biblioteca RF24,
// și numerele PIN nRF24L01+ (CE, CSN)
#include
DS3231 rtc(SDA, SCL);
Timpul t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // îl puteți conecta și la resetarea Arduino
// în acest caz, setați acest #define pin la -1!
//#define TFT_DC 9 // DC=RS=A0 - opțiuni de desemnare pentru selectarea unei comenzi sau a unui registru de date.
#define TFT_DC 3

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

// Opțiunea 2: folosiți orice ace, dar puțin mai încet!
#define TFT_SCLK 13 // setați aceștia să fie orice pini doriți!
#define TFT_MOSI 11 // setați aceștia să fie orice pini doriți!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#include

deplasare octet = 52;
octet pinState;
pompă lungă nesemnată[4];// matrice cu valori de contor de 4 secunde
float m = 3600.0;
unsigned int adresa = 0;
int rc;// variabilă pentru contoare
sumprim lung nesemnat = 0;
sumsec lung nesemnat = 0;
octet i = 0;
octet k = 34;
unsigned int z = 0;
octet b = B00000001;
byte pumrcounter[4]; // matrice pentru stocarea stărilor obiectului, 1 - off, 0 - on.
int start = 0; //

void setup () {

rtc.begin();
radio.begin(); // Inițierea lucrării nRF24L01+
radio.setChannel(120); // canal de date (de la 0 la 127).
radio.setDataRate(RF24_250KBPS); // rata de transfer de date (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // puterea transmițătorului (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Deschide o conductă cu un identificator pentru transferul de date

// Pentru a seta ora, decomentați rândurile necesare
//rtc.setDOW(1); // Zi a săptămânii
//rtc.setTime(21, 20, 0); // Ora, în format de 24 de ore.
//rtc.setDate(29, 10, 2018); // Data, 29 octombrie 2018

tft.initR(INITR_BLACKTAB); // inițializați un cip ST7735S, filă neagră
// Folosiți acest inițializator (decomentați) dacă utilizați un TFT de 1.44".
//tft.initR(INITR_144GREENTAB); // inițializați un cip ST7735S, filă RED rcB
tft.setTextWrap(false); // Permite textului să curgă pe marginea dreaptă
tft.setRotation( 2 ); // pentru BLACK PCB și RED tft.setRotation(0) sau nu.
tft.fillScreen(ST7735_BLACK); // șterge ecranul

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // strângerea software-ului funcționează, nivel înalt -
// obiectele controlate „nu funcționează”, „4” este scris în toate cele 1 porturi senior D, nu are loc nicio numărare.

pentru ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // afișează numerele de poziție ale obiectelor de control
tft.print(rc + 1);
}

tft.setCursor(12, 0); // scoate 3 rânduri de text
tft.println("DEZVOLTĂTORI & CONSTRUIRE"); // a te lăuda pe cei dragi
tft.setCursor(24, 10); // sau drepturi de autor malefice
tft.print("DEVELOPER MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//recuperare date////////////////////////////////////////////// ///////////

pentru ( z = 0; z < 1023; z += 16 ) { // Iterează prin toate celulele industriei
//și scrie într-o matrice de 4 variabile pompă, 4 octeți pentru fiecare contor, deoarece
// variabilă lungă nesemnată. Există 4 contoare, o înregistrare din toate cele 4 are 16 octeți.
EEPROM.get(z, pump[0]); // deci, fără bucla for, volum mai mic
EEPROM.get(z+4, pompa[1]);
EEPROM.get(z+8, pompa[2]);
EEPROM.get(z+12, pompa[3]);

// atribuirea unei noi valori următoare pentru suma a 4 contoare
sumprim = (pompa [0] + pompa [1] + pompa [2] + pompa [3]);

// compară noua valoare a sumei a 4 contoare din variabila sumprim cu valoarea anterioară din variabilă
// sumsec și dacă suma anterioară este mai mică sau egală cu noua sumă, se atribuie noua mai mare sau egală
// valoare sumsec.

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

//și valoarea curentă z este atribuită variabilei de adresă, z este adresa începutului unui bloc de 16 octeți de 4 valori
// contoare înregistrate în același timp (din moment ce la interogarea unui port, toți cei 8 biți ai acestuia sunt scrieți simultan,
// inclusiv cei 4 biți necesari ai portului D).
adresa = z;
}
}

// accesând din nou memoria eeprom la adresa începutului unui bloc de 16 octeți din 4 valori de contor înregistrate
// ultimul, adică valorile înainte de închidere sau repornire din cauza înghețului. Înregistrarea celui mai recent
// contorează valorile într-o matrice de 4 variabile pompă.

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

adresa += 16; //creșterea adresei pentru scrierea următorului bloc fără a suprascrie datele ultimei înregistrări

//sfârșitul recuperării datelor///////////////////////////////////////////////////////////////////////// //////////////////

attachInterrupt(0, count, RISING); // pin D2, activați întreruperile, vine în fiecare secundă
// impulsuri de la RTC DS3231 de la ieșirea SQW

wdt_enable(WDTO_8S); // porniți timer-ul watchdog, reporniți controlerul în caz de îngheț, timp,
// pentru care trebuie să lansați comanda de resetare a temporizatorului wdt_reset( și să evitați repornirea în timpul funcționării normale - 8 sec.
// pentru teste nu este recomandat să setați valoarea la mai puțin de 8 secunde.În acest caz, cronometrul este resetat de preferință
// smucind, și se întâmplă în fiecare secundă.

}

bucla nulă () {
// ciclu gol, aici se va controla funcționarea în fază deschisă a motorului electric
}

void count() {

tft.setTextColor(ST7735_WHITE); // setați culoarea fontului
t = rtc.getTime(); // timp de citit
tft.setCursor(5, 120); // setarea poziției cursorului
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // șterge zona de ieșire a timpului
tft.print(rtc.getTimeStr()); // iese citiri ale ceasului

wdt_reset(); // resetați watchdog-ul la fiecare ciclu, adică în secundă

pentru (rc = 0; rc < 4; rc ++) // începutul ciclului de verificare a conformității stării de intrare
// biți portului la starea anterioară de citire a biților portului D
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // și dacă nu se potrivește, atunci
pumrcounter[rc] = pinState; // atribuirea variabilei de stare a bitului de port o nouă valoare 1/0
}
// indicarea stării obiectelor de control al culorii
// ALBASTRU este o mică eroare a ecranului existent (sau bibliotecă?), RGB și BGR sunt amestecate.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // pentru numărare de nivel scăzut, schimbați VERDE în ALBASTRU
} Else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // pentru numărare de nivel scăzut, schimbați ALBASTRU în VERDE
pompa [rc] += 1; // adăugați 1 secundă la contorul timpului de funcționare
}
}

k++;
dacă (k == 36) {
k = 0;

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // ștergerea zonei de afișare a timpului de funcționare
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // și date

tft.setCursor(60, 120); // setarea poziției cursorului
tft.print(rtc.getDateStr()); // afișează data pe ecranul LCD

pentru (rc = 0; rc < 4; rc ++) //emite ore de funcționare în întregime, zecimi și
{
tft.setCursor ( 30, rc * 10 + shift ); // sutimi de oră cu o deplasare a ecranului în jos cu 10 pixeli
tft.println(pompa [rc] / m);
}

// scrierea valorilor „brute” orelor de funcționare (în secunde) în EEPROM ///////////////////////////////

pentru (rc = 0; rc < 4; rc++)
{
EEPROM.put(adresa, pompa [rc]);
adresa += sizeof(float); // incrementează variabila adresa de scriere
}
}

// trimite date pe canalul radio din date care indică câți octeți trebuie trimiși.
dacă ((k == 6 ) || (k == 18 ) || (k == 30 )) {

date lungi nesemnate;

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

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

Câteva note la final. Numărarea are loc la un nivel logic scăzut la intrări.

Rezistențele de tragere R2-R5 sunt de 36 kOhm pentru opțiunea cu fotorezistoare GL5516. În cazul unui fototranzistor optocupler și releu, setați la 4,7-5,1 kOhm. Arduino Nano v3.0 bootloader a fost înlocuit cu Arduino Uno folosind programatorul TL866A pentru funcționarea corectă a timer-ului watchdog. Siguranțele sunt corectate pentru a funcționa la tensiuni de peste 4,3 V. Circuitul de resetare extern R6 C3 nu a fost utilizat. În programul eșantion, frecvența transmițătorului nu corespunde intervalului fără licență; intervalul de 2,4 MHz este limitat la frecvențele 2400.0-2483.5 MHz.

Raza de acțiune a emițătorului E01-ML01DP05 este 2400-2525 MHz. Lățimea de bandă a unui canal este de 1 MHz, când se setează viteza ca „RF24_2MBPS” canalul radio.setChannel(120) specificat și următorul va fi ocupat, de exemplu. banda va fi de 2 MHz.

Sursa: www.habr.com

Adauga un comentariu