Lokálny autonómny systém zberu dát

Spoločnosť zakúpila monitorovacie stĺpiky NEKST-M, vyrábané na domácom trhu spoločnosťou Next Technologies. Na zabezpečenie vizualizácie prevádzky čerpacích jednotiek,
požiarne a bezpečnostné alarmy, prítomnosť napätia na štartéroch, izbová teplota, núdzová hladina vody. Srdcom NEKST-M je ATMEGA 1280 a táto skutočnosť je povzbudzujúca z hľadiska možnosti vytvorenia vlastnej stavebnice pre špecifické potreby.

Úlohou bolo vytvoriť plne autonómny lokálny dispečerský systém pre špecifické potreby v čo najkratšom čase a s minimálnymi nákladmi. Základom je mikrokontrolér. Vývoj, výroba, vytvorený samotným personálom.

Systém musí fungovať bez závislosti od mobilných sietí, serverov, internetu a licenčného systému na využívanie rádiofrekvenčných zdrojov, nepoužívať počítače pri prevádzke riadiaceho a riadiaceho systému alebo nanajvýš pravidelne používať notebooky, bez prístupu k predmety na dlhú dobu (6-9 mesiacov). Konfigurácia siete má radiálnu štruktúru. Údaje sa zhromažďujú v jednom bode a potom sa odosielajú na spracovanie prostredníctvom bežných komunikačných kanálov alebo ako tlačená kópia.

Systém musí poskytovať:

  • monitorovanie prevádzky čerpacích jednotiek
  • technologická automatizácia
  • ochranu pred následkami havarijných stavov
  • núdzová signalizácia
  • výpočet prevádzkového času
  • výpočet množstva spotrebovanej elektriny
  • regulácia teploty zariadenia
  • bezpečnostný a požiarny alarm
  • pravidelné diaľkové zaznamenávanie informácií
  • neznáme budúce požiadavky

Pracovné podmienky:

  • plocha pokrytia 1 km štvorcový.
  • priama viditeľnosť medzi objektmi
  • teplota od +50 do -50 C
  • vlhkosť do 100%
  • biologicky aktívne usadeniny (plesne, baktérie redukujúce sírany)
  • už nie vibrácie strojov tried 1-2 podľa GOST ISO 10816-1-97
  • elektromagnetické prostredie - spínanie elektromotorov stýkačmi KT 6053, zariadenie mäkkého rozbehu RVS-DN, riadiace zariadenie SIEMENS MICROMASTER PID, žiarenie v rozsahu ISM a GSM podľa požiadaviek na tieto zariadenia, ručné oblúkové zváranie na mieste
  • nadmerné sieťové napätie, krátkodobé prerušenia napájania, bleskové prepätia, fázová nerovnováha pri pretrhnutí vodiča nadzemného vedenia v rozvodných sieťach 6-10 kV.

Napriek týmto prísnym požiadavkám je implementácia pri riešení problému krok za krokom pomerne jednoduchá.

Ak vezmeme do úvahy všetko, doska „Arduino Nano 3.0“ sa stala „mozgom“ plánu. Doska robotdyn má ovládač ATMEGA 328, potrebný 3,3V stabilizátor napätia pre
prúd 800 mA a prevodník na CH340G UART-USB.

V prvom rade boli ako najaktuálnejšie vytvorené počítadlá prevádzkových hodín. Predtým používané priemyselné merače montované na PIC s beztransformátorovým napájacím obvodom zlyhali v dôsledku prepätia v priebehu jedného roka prevádzky. Iba tie, ktoré boli pripojené pomocou domácich 5V napájacích zdrojov, zostali nedotknuté. Pre urýchlenie inštalácie a všestrannosť zapojenia sa zo svoriek spínacích prístrojov odoberá signál o stave jednotiek, t.j. registrácia prítomnosti 1.fázového napätia pri trojfázovom napájaní 380V. Na koordináciu s regulátorom sa používa medzirelé s vinutím 220V alebo optočlen zložený z LED a fotorezistora GL5516 alebo optočlen PC817. Všetky možnosti boli testované. LED je napájaná usmerneným napätím s prúdovým obmedzením pomocou dvoch kondenzátorov SVV22 určených pre napätie 630V zapojených do série pre bezpečnosť pri náhodnom skúšaní obvodov megohmetrom.
Čítanie odčítania prevádzkového času pomocou LCD obrazovky ST7735S, prenos dát v reálnom čase cez rádio pomocou modulu E01-ML01DP05 na frekvencii 2,4 MHz. Toto zariadenie obsahuje čip nRF24L01+ a vysielací/prijímací zosilňovač RFX2401C,
výstupný výkon až 100 mW. Skrutkovité antény navrhnuté pre požadovaný dosah v online kalkulačke site. Výber typu antény je určený vylúčením príjmu jednotlivo odrazených vĺn z okolitých kovových konštrukcií. Diely antény sú vytlačené na 3D tlačiarni. Aktuálny stav počítadiel je uložený v EEPROM samotného regulátora a je obnovený v prípade neočakávaného výpadku prúdu. Časové intervaly pre počítanie zabezpečuje RTC čip DS3231 vo forme modulu so záložnou batériou. Napájanie využíva 3 moduly, vlastný impulzný zdroj 220/5V HLK-PM01 600mA, prevodník z 1-5V na 5V HW-553 и 03962 - ovládač batérie s systém ochrana proti skratu, nadmernému vybitiu a prebitiu. Všetky komponenty boli zakúpené na webovej stránke Aliexpress.

Doska na chliebLokálny autonómny systém zberu dát
4-kanálové počítadlo. Na vstupoch sú LC filtre na ochranu pred rušením cez krútenú dvojlinku. Údaje o stave riadiacich objektov sa neustále čítajú raz za sekundu a zobrazujú sa farebne na LCD. Hodnoty sa aktualizujú a zaznamenávajú do energeticky nezávislej pamäte každých 1 sekúnd. 36 sekúnd je 36/1 hodiny, toto je formát, v ktorom sa vyžadujú údaje. Každých 100 sek. prenáša sa informácia o počte sekúnd prevádzky pre každú riadiacu jednotku. Pamäť EEPROM má obmedzený počet cyklov zápisu a vymazania, podľa výrobcu 12 100000-krát. Najhoršia možnosť je, keď sa aspoň jedna bunka neustále aktualizuje. Objem 1. počítadla je 4 bajty, toto je číslo dlhého formátu, 4 počítadlá, spolu 16 bajtov zaberá jeden záznam. Dĺžka pamäte čipu je 1024 bajtov, po 64 záznamoch 4 počítadiel sa nahrávanie spustí odznova. V knižnici EEPROM metóda EEPROM.put nezapisuje, ak sa hodnota bunky a zapisovaná informácia zhodujú, nedôjde k degradácii buniek. V dôsledku toho bude garantovaná prevádzková doba pamäte viac ako 7 rokov. Čas možnej, ale nie garantovanej práce môže byť oveľa dlhší.

Schéma zapojeniaLokálny autonómny systém zberu dát
Program v Arduino IDE//12 328 bajtov (38 %)

#include // Základná grafická knižnica
#include // Knižnica špecifická pre hardvér
#include
#include
#include
#include
#include
rádio RF24(9, 10); // rádiový objekt pre prácu s knižnicou RF24,
// a čísla pinov nRF24L01+ (CE, ČSN)
#include
DS3231 rtc(SDA, SCL);
čas t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // toto môžete pripojiť aj k resetu Arduina
// v takom prípade nastavte tento pin #define na -1!
//#define TFT_DC 9 // DC=RS=A0 - možnosti označenia pre výber príkazového alebo dátového registra.
#define TFT_DC 3

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

// Možnosť 2: použite akékoľvek kolíky, ale trochu pomalšie!
#define TFT_SCLK 13 // nastavte tieto piny, ktoré chcete!
#define TFT_MOSI 11 // nastavte to tak, aby boli piny, ktoré chcete!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#include

bajtový posun = 52;
byte pinState;
unsigned long pump[4];// pole so 4 sekundovými hodnotami počítadla
plavák m = 3600.0;
unsigned int adresa = 0;
int rc;// premenná pre počítadlá
dlhý sumprim bez znamienka = 0;
dlhý súčet bez znamienka = 0;
bajt i = 0;
bajt k = 34;
bez znamienka int z = 0;
bajt b = B00000001;
byte pumrcounter[4]; // pole pre ukladanie stavov objektu, 1 - vypnuté, 0 - zapnuté.
int začiatok = 0; //

void setup () {

rtc.begin();
radio.begin(); // Spustite prácu nRF24L01+
radio.setChannel(120); // dátový kanál (od 0 do 127).
radio.setDataRate(RF24_250KBPS); // rýchlosť prenosu dát (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // výkon vysielača (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Otvorenie kanála s identifikátorom na prenos údajov

// Ak chcete nastaviť čas, odkomentujte potrebné riadky
//rtc.setDOW(1); // Deň v týždni
//rtc.setTime(21, 20, 0); // Čas v 24-hodinovom formáte.
//rtc.setDate(29, 10, 2018); // Dátum, 29. október 2018

tft.initR(INITR_BLACKTAB); // inicializácia čipu ST7735S, čierna karta
// Tento inicializátor použite (odkomentujte), ak používate 1.44" TFT
//tft.initR(INITR_144GREENTAB); // inicializácia čipu ST7735S, ČERVENÁ karta rcB
tft.setTextWrap(false); // Povoliť, aby text prebehol cez pravý okraj
tft.setRotation( 2 ); // pre BLACK PCB a RED tft.setRotation(0) alebo nie.
tft.fillScreen(ST7735_BLACK); // vymazať obrazovku

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // softvérové ​​uťahovanie funguje, vysoká úroveň -
// kontrolované objekty „nefungujú“, „4“ sa zapíše na všetky 1 senior porty D, nepočíta sa.

pre ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + posun ); // zobrazenie čísel pozícií riadiacich objektov
tft.print(rc + 1);
}

tft.setCursor(12, 0); // výstup 3 riadkov textu
tft.println("VÝVOJÁRI A BUDOVANIE"); // chváliť sa milovaní
tft.setCursor(24, 10); // alebo zlé autorské práva
tft.print("DEVELOPER MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//obnova dát////////////////////////////////////////////// ///////////

for ( z = 0; z < 1023; z += 16 ) { // Iteruje cez všetky bunky odvetvia
//a zapíše do poľa 4 premenných pumpy, 4 bajty pre každý čítač, pretože
// dlhá premenná bez znamienka. K dispozícii sú 4 počítadlá, jeden záznam zo všetkých 4 má 16 bajtov.
EEPROM.get(z, pumpa[0]); // takže, bez slučky for, menšia hlasitosť
EEPROM.get(z+4, pumpa[1]);
EEPROM.get(z+8, pumpa[2]);
EEPROM.get(z+12, pumpa[3]);

// priradenie novej ďalšej hodnoty pre súčet 4 počítadiel
sumprim = (čerpadlo [0] + čerpadlo [1] + čerpadlo [2] + čerpadlo [3]);

// porovná novú hodnotu súčtu 4 počítadiel v premennej sumprim s predchádzajúcou hodnotou v premennej
// sumasec a ak je predchádzajúci súčet menší alebo rovný novému súčtu, priradí sa nový väčší alebo rovný
// hodnota sumsec.

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

//a aktuálna hodnota z je priradená premennej adresy, z je adresa začiatku 16-bajtového bloku 4 hodnôt
// počítadlá zaznamenané v rovnakom čase (keďže pri dotazovaní portu sa všetkých jeho 8 bitov zapíše súčasne,
// vrátane našich potrebných vysokých 4 bitov portu D).
adresa = z;
}
}

// opäť prístup do pamäte eeprom na adrese začiatku bloku 16 bajtov 4 zaznamenaných hodnôt počítadla
// posledný, t.j. hodnoty pred vypnutím alebo reštartom z dôvodu zamrznutia. Nahrávanie najnovšieho
// počítadlo hodnôt do poľa 4 premenných 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; //zvýšenie adresy pre zápis ďalšieho bloku bez prepísania údajov posledného záznamu

//koniec obnovy dát/////////////////////////////////////////// //////////////////

pripojiťPrerušenie(0, počet, stúpajúca); // pin D2, povolí prerušenia, prichádza každú sekundu
// impulzy z RTC DS3231 z výstupu SQW

wdt_enable(WDTO_8S); // spustenie časovača strážneho psa, reštartovanie ovládača v prípade zamrznutia, času,
// pre ktorý musíte zadať príkaz na resetovanie časovača wdt_reset( a vyhnúť sa reštartovaniu počas normálnej prevádzky - 8 sek.
// pri testoch sa neodporúča nastaviť hodnotu na menej ako 8 sekúnd. V tomto prípade sa prednostne resetuje časovač
// trhanie a stáva sa to každú sekundu.

}

void loop () {
// prázdny cyklus, tu bude kontrola nad prevádzkou elektromotora s otvorenou fázou
}

void count() {

tft.setTextColor(ST7735_WHITE); // nastavenie farby písma
t = rtc.getTime(); // čas čítania
tft.setCursor(5, 120); // nastavenie polohy kurzora
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // vymazanie oblasti výstupu času
tft.print(rtc.getTimeStr()); // výstupné hodnoty hodín

wdt_reset(); // resetovať strážneho psa každý cyklus, t.j. druhý

for (rc = 0; rc < 4; rc ++) // začiatok cyklu na kontrolu súladu stavu vstupu
// bitov portu na predchádzajúci stav čítania bitov portu D
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // a ak sa nezhoduje, potom
pumrcounter[rc] = pinState; // priradenie premennej stavu bitu portu novej hodnoty 1/0
}
// indikácia stavu objektov ovládania farieb
// MODRÁ je malá chyba existujúcej obrazovky (alebo knižnice?), RGB a BGR sú zmiešané.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + posun)), 7, 7, ST7735_BLUE); // pre počítanie nízkej úrovne zmeňte ZELENÚ na MODRÁ
} Else {
tft.fillRect(15, ((rc * 10 + posun)), 7, 7, ST7735_GREEN); // pre počítanie nízkej úrovne zmeňte MODRÚ na ZELENÚ
čerpadlo [rc] += 1; // pridajte 1 sekundu k počítadlu prevádzkového času
}
}

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

tft.fillRect(30, posun, 97, 40, ST7735_BLACK); // vymazanie oblasti zobrazenia prevádzkového času
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // a dátumy

tft.setCursor(60, 120); // nastavenie polohy kurzora
tft.print(rtc.getDateStr()); // zobrazenie dátumu na LCD obrazovke

pre (rc = 0; rc < 4; rc ++) //výstup prevádzkových hodín v celku, desatiny a
{
tft.setCursor ( 30, rc * 10 + posun ); // stotiny hodiny s posunom obrazovky nadol o 10 pixelov
tft.println(čerpadlo [rc] / m);
}

// zápis „surových“ hodnôt prevádzkových hodín (v sekundách) do EEPROM //////////////////////////////

pre (rc = 0; rc < 4; rc++)
{
EEPROM.put(adresa, pumpa [rc]);
adresa += sizeof(float); // zvýšenie premennej adresy zápisu
}
}

// odoslanie údajov cez rádiový kanál z údajov označujúcich, koľko bajtov sa má odoslať.
if ((k == 6 ) || (k == 18 ) || (k == 30 )) {

nepodpísané dlhé dáta;

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

for (i = 0; i < 4; i++) {
údaje = čerpadlo [i ];
radio.write( &data, sizeof( data));
}
}
}

Pár poznámok na záver. Počítanie prebieha na nízkej logickej úrovni na vstupoch.

Vyťahovacie odpory R2-R5 sú 36 kOhm pre možnosť s fotorezistormi GL5516. V prípade fototranzistorového optočlena a relé nastavte na 4,7-5,1 kOhm. Bootloader Arduino Nano v3.0 bol nahradený Arduino Uno pomocou programátora TL866A pre správnu činnosť časovača watchdog. Poistky sú upravené tak, aby fungovali pri napätiach nad 4,3 V. Externý resetovací obvod R6 C3 nebol použitý. Vo vzorovom programe frekvencia vysielača nezodpovedá nelicencovanému rozsahu, rozsah 2,4 MHz je obmedzený na frekvencie 2400.0-2483.5 MHz.

Dosah vysielača E01-ML01DP05 je 2400-2525 MHz. Šírka pásma jedného kanála je 1 MHz, pri nastavení rýchlosti ako „RF24_2MBPS“ bude obsadený určený kanál radio.setChannel(120) a ďalší, t.j. pásmo bude 2 MHz.

Zdroj: hab.com

Pridať komentár