Lokální autonomní systém sběru dat

Společnost zakoupila monitorovací sloupky NEKST-M, vyráběné v tuzemsku společností Next Technologies. Pro zajištění vizualizace provozu čerpacích jednotek,
požární a bezpečnostní alarmy, přítomnost napětí na startérech, pokojová teplota, nouzová hladina vody. Srdcem NEKST-M je ATMEGA 1280 a tato skutečnost je povzbudivá z hlediska možnosti vytvořit si vlastní stavebnici pro specifické potřeby.

Úkolem bylo vytvořit plně autonomní lokální dispečerský systém pro specifické potřeby v co nejkratším čase a s minimálními náklady. Základem je mikrokontrolér. Vývoj, výroba, vytvořená samotným personálem.

Systém musí fungovat bez závislosti na celulárních sítích, serverech, internetu a licenčním systému pro využívání radiofrekvenčních zdrojů, nepoužívat při provozu monitorovacího a řídicího systému počítače nebo nanejvýš periodicky používat notebooky, bez přístupu k předměty po dlouhou dobu (6-9 měsíců). Konfigurace sítě má radiální strukturu. Data jsou shromážděna v jednom okamžiku a poté odeslána ke zpracování prostřednictvím běžných komunikačních kanálů nebo jako tištěná kopie.

Systém musí poskytovat:

  • sledování provozu čerpacích jednotek
  • technologická automatizace
  • ochranu před následky mimořádných událostí
  • nouzová signalizace
  • výpočet provozní doby
  • výpočet množství spotřebované elektřiny
  • regulace teploty zařízení
  • bezpečnostní a požární signalizace
  • pravidelné dálkové nahrávání informací
  • neznámé budoucí požadavky

Pracovní podmínky:

  • plocha pokrytí 1 kmXNUMX.
  • přímou viditelnost mezi objekty
  • teplota od +50 do -50 C
  • vlhkost až 100%
  • biologicky aktivní usazeniny (plísně, bakterie redukující sírany)
  • vibrace, ne více, strojů tříd 1-2 podle GOST ISO 10816-1-97
  • elektromagnetické prostředí - spínání elektromotorů se stykači KT 6053, zařízení měkkého rozběhu RVS-DN, zařízení řízení PID SIEMENS MICROMASTER, vyzařování v rozsahu ISM a GSM dle požadavků na tato zařízení, ruční obloukové svařování na místě
  • nadměrné síťové napětí, krátkodobé výpadky napájení, blesková přepětí, nevyváženost fází při přetržení vodiče venkovního vedení v distribučních sítích 6-10 kV.

I přes tyto přísné požadavky je implementace při řešení problému krok za krokem poměrně jednoduchá.

Když vezmeme v úvahu vše, deska „Arduino Nano 3.0“ se stala „mozkem“ plánu. Deska robotdyn má ovladač ATMEGA 328, potřebný stabilizátor napětí 3,3V pro
proudu 800 mA a převodníkem na CH340G UART-USB.

Nejprve byly vytvořeny počítadla provozních hodin jako nejaktuálnější. Dříve používané průmyslové měřiče montované na PIC s beztransformátorovým napájecím obvodem selhaly kvůli napěťovým rázům během jednoho roku provozu. Pouze ty připojené pomocí domácích 5V napájecích zdrojů zůstaly nedotčeny. Pro urychlení instalace a všestrannost zapojení je ze svorek spínacích přístrojů odebírán signál o stavu jednotek, tzn. registrace přítomnosti 1.fázového napětí při třífázovém napájení 380V. Pro koordinaci s regulátorem se používá mezirelé s vinutím 220V nebo optočlen složený z LED a fotorezistoru GL5516 nebo optočlen PC817. Všechny možnosti byly testovány. LED je napájena usměrněným napětím s proudovým omezením pomocí dvou kondenzátorů SVV22 určených pro napětí 630V zapojených do série pro bezpečnost při náhodném testování obvodů megaohmetrem.
Čtení odečtů provozní doby pomocí LCD obrazovky ST7735S, přenos dat v reálném čase rádiem pomocí modulu E01-ML01DP05 na frekvenci 2,4 MHz. Toto zařízení obsahuje čip nRF24L01+ a vysílací/přijímací zesilovač RFX2401C,
výstupní výkon až 100 mW. Šroubové antény navržené pro požadovaný dosah v online kalkulačce сайта. Volba typu antény je dána vyloučením příjmu jednotlivě odražených vln od okolních kovových konstrukcí. Díly antény jsou vytištěny na 3D tiskárně. Aktuální stav čítačů je uložen v EEPROM samotného regulátoru a je obnoven v případě neočekávaného výpadku napájení. Časové intervaly pro počítání zajišťuje RTC čip DS3231 v podobě modulu se záložní baterií. Zdroj využívá 3 moduly, vlastní pulzní zdroj 220/5V HLK-PM01 600mA, převodník z 1-5V na 5V HW-553 и 03962 - ovladač baterie s schéma ochrana proti zkratu, nadměrnému vybití a přebití. Všechny komponenty byly zakoupeny na webu Aliexpress.

Prkénko na chlebaLokální autonomní systém sběru dat
4-kanálový čítač. Na vstupech jsou LC filtry pro ochranu před rušením přes kroucenou dvoulinku. Údaje o stavu řídicích objektů jsou neustále čteny jednou za sekundu a zobrazovány barevně na LCD. Naměřené hodnoty jsou aktualizovány a zaznamenávány do energeticky nezávislé paměti každých 1 sekund. 36 sekund je 36/1 hodiny, to je formát, ve kterém jsou data požadována. Každých 100 sec. jsou přenášeny informace o počtu sekund provozu pro každou řídicí jednotku. Paměť EEPROM má omezený počet cyklů zápisu a vymazání, podle výrobce 12 100000krát. Nejhorší varianta je, když se alespoň jedna buňka neustále aktualizuje. Objem 1. čítače je 4 bajty, jedná se o číslo dlouhého formátu, 4 čítače, celkem 16 bajtů zabírá jeden záznam. Délka paměti čipu je 1024 bajtů, po 64 záznamech 4 čítačů se záznam spustí znovu. V knihovně EEPROM metoda EEPROM.put nezapisuje, pokud se hodnota buňky a zapisovaná informace shodují, nedojde k degradaci buněk. V důsledku toho bude garantovaná doba provozu paměti více než 7 let. Doba možné, ale negarantované práce může být mnohem delší.

Kruhový diagramLokální autonomní systém sběru dat
Program v Arduino IDE//12 328 bajtů (38 %)

#zahrnout // Základní grafická knihovna
#zahrnout // Knihovna specifická pro hardware
#zahrnout
#zahrnout
#zahrnout
#zahrnout
#zahrnout
radiostanice RF24(9, 10); // rádiový objekt pro práci s knihovnou RF24,
// a čísla pinů nRF24L01+ (CE, ČSN)
#zahrnout
DS3231 rtc(SDA, SCL);
čas t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // toto můžete také připojit k resetu Arduina
// v tom případě nastavte tento pin #define na -1!
//#define TFT_DC 9 // DC=RS=A0 - možnosti označení pro výběr příkazového nebo datového registru.
#define TFT_DC 3

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

// Možnost 2: použijte jakékoli kolíky, ale trochu pomaleji!
#define TFT_SCLK 13 // nastavte tyto piny, které chcete!
#define TFT_MOSI 11 // nastavte tyto piny, které chcete!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#zahrnout

bajtový posun = 52;
byte pinState;
unsigned long pump[4];// pole se 4 sekundovými hodnotami čítače
plovoucí m = 3600.0;
unsigned int adresa = 0;
int rc;// proměnná pro čítače
dlouhý sumprim bez znaménka = 0;
dlouhý sumsec bez znaménka = 0;
byte i = 0;
byte k = 34;
bez znaménka int z = 0;
byte b = B00000001;
byte pumrcounter[4]; // pole pro ukládání stavů objektů, 1 - vypnuto, 0 - zapnuto.
int start = 0; //

void setup () {

rtc.begin();
radio.begin(); // Zahájení práce nRF24L01+
radio.setChannel(120); // datový kanál (od 0 do 127).
radio.setDataRate(RF24_250KBPS); // rychlost přenosu dat (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // výkon vysílače (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Otevře roura s identifikátorem pro přenos dat

// Chcete-li nastavit čas, odkomentujte potřebné řádky
//rtc.setDOW(1); // Den v týdnu
//rtc.setTime(21, 20, 0); // Čas ve 24hodinovém formátu.
//rtc.setDate(29, 10, 2018); // Datum, 29. října 2018

tft.initR(INITR_BLACKTAB); // inicializuje čip ST7735S, černá karta
// Tento inicializátor použijte (odkomentujte), pokud používáte 1.44" TFT
//tft.initR(INITR_144GREENTAB); // inicializuje čip ST7735S, ČERVENÁ karta rcB
tft.setTextWrap(false); // Umožní textu stékat přes pravý okraj
tft.setRotation( 2 ); // pro BLACK PCB a RED tft.setRotation(0) nebo ne.
tft.fillScreen(ST7735_BLACK); // vymazat obrazovku

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // softwarové utahování funguje, vysoká úroveň -
// ovládané objekty „nefungují“, „4“ je zapsáno na všechny 1 senior porty D, nedochází k žádnému počítání.

for ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + posun ); // zobrazení čísel pozic řídicích objektů
tft.print(rc + 1);
}

tft.setCursor(12, 0); // výstup 3 řádků textu
tft.println("VÝVOJÁŘI A STAVIT"); // chválit se milovaní
tft.setCursor(24, 10); // nebo zlá autorská práva
tft.print("DEVELOPER MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//obnova dat////////////////////////////////////////////// ///////////

for ( z = 0; z < 1023; z += 16 ) { // Iteruje všemi buňkami v oboru
//a zapíše do pole 4 proměnných pumpy, 4 bajty pro každý čítač, protože
// dlouhá proměnná bez znaménka. Jsou 4 čítače, jeden záznam ze všech 4 zabírá 16 bajtů.
EEPROM.get(z, pumpa[0]); // takže bez smyčky for menší objem
EEPROM.get(z+4, pumpa[1]);
EEPROM.get(z+8, pumpa[2]);
EEPROM.get(z+12, pumpa[3]);

// přiřazení nové další hodnoty pro součet 4 čítačů
sumprim = (čerpadlo [0] + čerpadlo [1] + čerpadlo [2] + čerpadlo [3]);

// porovná novou hodnotu součtu 4 čítačů v proměnné sumprim s předchozí hodnotou v proměnné
// sumsec a pokud je předchozí součet menší nebo roven novému součtu, je přiřazen nový větší nebo roven
// hodnota sumsec.

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

//a aktuální hodnota z je přiřazena proměnné adresy, z je adresa začátku 16bajtového bloku 4 hodnot
// čítače zaznamenané ve stejnou dobu (protože při dotazování portu je všech 8 bitů zapsáno současně,
// včetně našich nezbytných vysokých 4 bitů portu D).
adresa = z;
}
}

// opětovný přístup do paměti eeprom na adrese začátku bloku 16 bajtů 4 zaznamenaných hodnot čítače
// poslední, tzn. hodnoty před vypnutím nebo restartem z důvodu zamrznutí. Nahrávání nejnovějších
// počítadlo hodnot do pole 4 proměnný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ýšení adresy pro zápis dalšího bloku bez přepsání dat posledního záznamu

//konec obnovy dat//////////////////////////////////////////// //////////////////

připojitInterrupt(0, počet, RISING); // pin D2, povolí přerušení, přijde každou sekundu
// impulsy z RTC DS3231 z výstupu SQW

wdt_enable(WDTO_8S); // spuštění hlídacího časovače, restartování ovladače v případě zamrznutí, času,
// pro který musíte zadat příkaz pro reset časovače wdt_reset( a vyhnout se restartování během normálního provozu - 8 sec.
// pro testy se nedoporučuje nastavovat hodnotu na méně než 8 sekund. V tomto případě se nejlépe resetuje časovač
// škubání a děje se to každou sekundu.

}

void loop () {
// prázdný cyklus, zde bude kontrola provozu elektromotoru na otevřenou fázi
}

void count() {

tft.setTextColor(ST7735_WHITE); // nastavení barvy písma
t = rtc.getTime(); // čas čtení
tft.setCursor(5, 120); // nastavení pozice kurzoru
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // vymazání oblasti výstupu času
tft.print(rtc.getTimeStr()); // výstupní hodnoty hodin

wdt_reset(); // reset hlídacího psa každý cyklus, tj. sekundu

for (rc = 0; rc < 4; rc ++) // začátek cyklu pro kontrolu shody stavu vstupu
// bitů portu do předchozího stavu čtení bitů portu D
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // a if neodpovídá, then
pumrcounter[rc] = pinState; // přiřazení stavové proměnné bit portu novou hodnotu 1/0
}
// indikace stavu objektů řízení barev
// BLUE je malá závada stávající obrazovky (nebo knihovny?), RGB a BGR jsou zaměněny.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + posun)), 7, 7, ST7735_BLUE); // pro počítání nízké úrovně změňte ZELENOU na MODRU
} Else {
tft.fillRect(15, ((rc * 10 + posun)), 7, 7, ST7735_GREEN); // pro počítání nízké úrovně změňte MODROU na ZELENOU
čerpadlo [rc] += 1; // přidá 1 sekundu k počítadlu doby provozu
}
}

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

tft.fillRect(30, posun, 97, 40, ST7735_BLACK); // vymazání oblasti zobrazení provozní doby
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // a data

tft.setCursor(60, 120); // nastavení pozice kurzoru
tft.print(rtc.getDateStr()); // zobrazení data na LCD obrazovce

pro (rc = 0; rc < 4; rc ++) //výstupní provozní hodiny v celku, desetiny a
{
tft.setCursor ( 30, rc * 10 + posun ); // setiny hodiny s posunem obrazovky dolů o 10 pixelů
tft.println(čerpadlo [rc] / m);
}

// zápis „surových“ hodnot provozních hodin (v sekundách) do EEPROM //////////////////////////////

for (rc = 0; rc < 4; rc++)
{
EEPROM.put(adresa, pumpa [rc]);
adresa += sizeof(float); // zvýšení proměnné adresy zápisu
}
}

// odešle data přes rádiový kanál z dat udávajících, kolik bajtů má být odesláno.
if ((k == 6 ) || (k == 18 ) || (k == 30 )) {

nepodepsané dlouhé údaje;

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

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

Pár poznámek na závěr. Počítání probíhá na nízké logické úrovni na vstupech.

Vytahovací odpory R2-R5 jsou 36 kOhm pro možnost s fotoodpory GL5516. V případě fototranzistorového optočlenu a relé nastavte na 4,7-5,1 kOhm. Bootloader Arduino Nano v3.0 byl nahrazen za Arduino Uno pomocí programátoru TL866A pro správnou činnost časovače hlídacího psa. Pojistky jsou korigovány tak, aby fungovaly při napětích nad 4,3 V. Externí resetovací obvod R6 C3 nebyl použit. V ukázkovém programu frekvence vysílače neodpovídá nelicencovanému rozsahu, rozsah 2,4 MHz je omezen na frekvence 2400.0-2483.5 MHz.

Dosah vysílače E01-ML01DP05 je 2400-2525 MHz. Šířka pásma jednoho kanálu je 1 MHz, při nastavení rychlosti „RF24_2MBPS“ bude obsazen zadaný kanál radio.setChannel(120) a další, tzn. pásmo bude 2 MHz.

Zdroj: www.habr.com

Přidat komentář