Místní autonomní systém sběru dat

Na pracovišti byly zakoupeny monitorovací stanice NEXST-M domácí výroby od společnosti „Nexst Technologies“. Pro zajištění vizualizace činnosti čerpadlových agregátů,
požární a bezpečnostní signalizace, přítomnosti napětí na spínačích, teploty v místnosti, nouzové hladiny vody. Srdcem NEXST-M je ATMEGA 1280 a tento fakt povzbudil v souvislosti s možností vytvoření vlastního kompletu na míru.

Byl stanoven úkol v minimálně krátkých lhůtách a za minimálních nákladů vytvořit zcela autonomní systém lokálního dispečinku na míru. Základem je mikrořadič. Vývoj a výroba probíhá silami samotného personálu.

Systém by měl fungovat bez závislosti na mobilních sítích, servery, internetu a povolovacím systému využívání rádiových frekvenčních zdrojů, neměl by používat v práci kontrolní a řídící počítače nebo maximálně občasné využití notebooků, bez přístupu na objekty po dobu delší než 6-9 měsíců. Konfigurace sítě má radiální strukturu. Data se shromažďují na jednom místě a dále se posílají k dalšímu zpracování běžnými komunikačními kanály nebo v pevné kopii.

Systém by měl zajišťovat:

  • kontrolu činnosti čerpadlových zařízení
  • technologickou automatizaci
  • ochranu před následky havarijních režimů
  • signalizaci havarijních režimů
  • počítání doby provozu
  • počítání objemu spotřebované elektřiny
  • kontrolu teploty zařízení
  • bezpečnostní a požární signalizaci
  • periodické vzdálené sbírání informací
  • neznámé požadavky v budoucnu

Pracovní podmínky:

  • přístupové teritorium 1 km².
  • přímá viditelnost mezi objekty
  • teplota od +50 do -50 °C
  • vlhkost až 100%
  • biologicky aktivní usazeniny (plíseň, sulfátové redukující bakterie)
  • vibrace, maximálně třídy 1-2 podle GOST ISO 10816-1-97
  • elektromagnetické prostředí - spínání elektromotorů kontakty KT 6053, zařízení pro plynulé spouštění RVS-DN, PID regulační zařízení SIEMENS MICROMASTER, vyzařování v pásmu ISM a GSM podle požadavků na tato zařízení, ruční obloukový svár na místě
  • přepětí sítě, krátkodobé výpadky dodávek elektřiny, bouřková přepětí, nesymetrie fází při přerušení vodiče VLT v distribučních sítích 6-10 kV.

I přes tak přísné požadavky je realizace zcela jednoduchá, pokud se úkol řeší krok za krokem.

S ohledem na všechno se jako „mozek“ navrženého stal modul „Arduino Nano 3.0“. Deska od „Robotdyn“ obsahuje procesor ATMEGA 328, potřebný stabilizátor napětí 3,3 V na
proud 800 mA a konvertor na CH340G UART-USB.

Nejprve byly vytvořeny počítače běhu jako nejrelevantnější. Dříve používané průmyslové měřiče založené na PIC s beztransformátorovým napájecím schématem se během roku provozu rozbily kvůli napěťovým rázům. Nepoškozené zůstaly pouze ty, které byly připojeny pomocí domácích napájecích bloků na 5V. Pro urychlení montáže a univerzálnost připojení se signál o stavu zařízení bere z kontaktů spínacích aparátů, t.j. registrace přítomnosti 1. fáze napětí při třífázovém napájení 380V. Pro souhlas s kontrolérem se používá mezilé rele s cívkou na 220V nebo optočlen složený z LED a fotorezistoru GL5516 nebo optočlen PC817. Všechny varianty byly testovány v provozu. LED je napájeno usměrněným napětím s proudovým limitem pomocí dvou kondenzátorů SVV22 určených na napětí 630V zapojených sériově pro bezpečnost při náhodné kontrole obvodů megaohmetrem.
Získávání údajů o době provozu pomocí LCD displeje ST7735S, přenos dat rádiovým kanálem v reálném čase s použitím modulu E01-ML01DP05 na frekvenci 2,4 GHz. Tento přístroj obsahuje čip nRF24L01+ a zesilovač příjmu-přenosu RFX2401C,
výstupní výkon až 100 mW. Antény jsou spirálové, navržené na požadovaný rozsah v online kalkulačce. webuVýběr typu antén je založen na vyloučení příjmu jednou odražených vln od okolních kovových konstrukcí. Díly antén jsou vytištěny na 3D tiskárně. Aktuální stav měřičů je uchováván v EEPROM samotného řadiče a v případě nečekaného vypnutí napájení je obnoven. Časové intervaly pro měření zajišťuje RTC mikročip DS3231 ve formě modulu s rezervní baterií. V napájecím zdroji jsou použity 3 moduly, konkrétně impulzní zdroj 220/5V HLK-PM01 600mA, převodník z 1-5V na 5V. HW-553 a 03962A — řadič baterií, který má schéma ochrany proti zkratu, pře vybití a pře nabití. Všechny komponenty byly zakoupeny na stránkách Aliexpress.

Prototypová deskaMístní autonomní systém sběru dat
Měřič se 4 kanály. Na vstupech jsou LC filtry pro ochranu proti rušení na lince z kroucené dvojlinky. Data o stavu kontrolovaných objektů jsou neustále čtena 1x za sekundu, zobrazují se barevně na LCD. Aktualizace údajů a zápis do nezávislé paměti probíhá každých 36 sekund. 36 sekund - to je 1/100 hodiny, právě v tomto formátu jsou vyžadována data. Každých 12 sekund probíhá přenos informací o počtu sekund provozu pro každý kontrolní agregát. Paměť EEPROM má omezený počet cyklů zápisu - mazání, podle výrobcem, 100000 krát. Nejhorší varianta je, když neustále dochází k aktualizaci alespoň jedné buňky. Velikost 1. měřiče je 4 bajty, což je číslo formátu long, 4 měřiče, celkem 16 bajtů zabírá jeden zápis. Délka paměti mikročipu je 1024 bajtů, po 64 zápisech 4 měřičů zápis začne znovu. V knihovně EEPROM metoda EEPROM.put neprovádí zápis, pokud hodnota buňky a zapisované informace se shodují, degrace buněk nebude. Výsledkem je garantovaný čas provozu paměti bude více než 7 let. Čas možného, ale negarantovaného fungování může být mnohem delší.

Hlavní schémaMístní autonomní systém sběru dat
Program v Arduino IDE//12 328 байт (38%)

#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#include <EEPROM.h>
#include <Wire.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 10); // objekt radio pro práci s knihovnou RF24,
// и номера выводов nRF24L01+ (CE, CSN)
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Čas t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // you can also connect this to the Arduino reset
// in which case, set this #define pin to -1!
//#define TFT_DC 9 // DC=RS=A0- варианты обозначений вывода выбора регистра команд или данных.
#define TFT_DC 3

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

// Option 2: use any pins but a little slower!
#define TFT_SCLK 13 // set these to be whatever pins you like!
#define TFT_MOSI 11 // set these to be whatever pins you like!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#include <avr/wdt.h>

byte shift = 52;
byte pinState;
unsigned long pump[4]; // pole s 4 hodnotami měřičů sekund
float m = 3600.0;
unsigned int address = 0;
int rc; // proměnná pro měřiče
unsigned long sumprim = 0;
unsigned long sumsec = 0;
byte i = 0;
byte k = 34;
unsigned int z = 0;
byte b = B00000001;
byte pumrcounter[4]; // pole pro uchování stavů objektů, 1 - vypnuto, 0 - zapnuto.
int start = 0; //

void setup() {

rtc.begin();
radio.begin(); // Inicializujeme práci 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řeme potrubí s identifikátorem pro přenos dat

// Для установки времени- раскомментировать нужные строки
//rtc.setDOW(1); // День недели
//rtc.setTime(21, 20, 0); // Время, в формате 24 часа.
//rtc.setDate(29, 10, 2018); // Дата, 29 октября 2018г.

tft.initR(INITR_BLACKTAB); // inicializace čipu ST7735S, černá tabulka
// Use this initializer (uncomment) if you’re using a 1.44" TFT
//tft.initR(INITR_144GREENTAB); // initialize a ST7735S chip, RED rcB tab
tft.setTextWrap(false); // Umožnit textu, aby vycházel z pravého okraje
tft.setRotation( 2 ); // pro ČERNOU PCB a ČERVENOU tft.setRotation(0) nebo ne.
tft.fillScreen(ST7735_BLACK); // vyčištění obrazovky

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // softwarové tauňení funguje, vysoká úroveň-
// контролируемые объекты «не работают», во все 4 старших порта D записана «1», не идет счет.

for (rc = 0; rc < 4; rc++)
{
tft.setCursor (3, rc * 10 + shift); // výstup čísel pozic kontrolních objektů
tft.print (rc + 1);
}

tft.setCursor (12, 0); // výstup 3 řádků textu
tft.println ("DEVELOPERS & BUILD"); // pro oslavování sebe sama
tft.setCursor (24, 10); // nebo zlý autorský právo
tft.print ("DEVELOPER M.M.");
tft.setCursor (28, 20);
tft.print ("BUILD-ER D.D.");

//восстановление данных/////////////////////////////////////////////////////////

for (z = 0; z < 1023; z += 16) { // Prochází všechny buňky EEPROM
//и записывает в массив из 4-х переменных pump, по 4 байта каждый счетчик, т.к.
// переменная беззнаковая лонг. Счетчиков 4, одна запись всех 4-х занимает 16 байт.
EEPROM.get (z, pump [0]); // takto, bez smyčky for, méně objem
EEPROM.get (z + 4, pump [1]);
EEPROM.get (z + 8, pump [2]);
EEPROM.get (z + 12, pump [3]);

// присвоение нового очередного значения суммы 4-x счётчиков
sumprim = (pump [0] + pump [1] + pump [2] + pump [3]);

// сравнивается новое значение суммы 4-х счетчиков в переменной sumprim с предыдущим значением в переменной
// sumsec и если предыдущая сумма меньше или равна новой сумме, присваивается новое большее или равное
// sumsec значение.

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

//и присваивается переменной address текущее значение z, z- это адрес начала блока в 16 байт из 4-х значений
// счетчиков, записанных в одно и то-же время ( т.к. при опросе порта записываются одновременно все его 8 бит,
// в том числе наши нужные старшие 4 бита порта D).
address = z;
}
}

// еще раз обращение к памяти еепром по адресу начала блока в 16 байт из 4-х значений счетчиков записанных
// последними, т.е. значения перед выключением или перезагрузкой по причине зависания. Запись последних
// значений счетчиков в массив из 4-х переменных pump.

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

address += 16; // zvýšení adresy pro zapsání dalšího bloku, aniž by se přepsala data posledního záznamu

// конец восстановления данных////////////////////////////////////////////////////////////////

attachInterrupt(0, count, RISING); // pin D2, povolení práce přerušení, každou sekundu přicházejí
// импульсы от RTC DS3231 с выхода SQW

wdt_enable (WDTO_8S); // spuštění watchdog časovače, restartuje řadič v případě zamrznutí, čas,
// за которое надо подать команду сброса таймера wdt_reset( и избежать перезагрузки при нормальной работе- 8 сек.
// для тестов не рекомендуется устанавливать значение менее 8 сек.В данном случае сброс таймера происходит в пре-
// рывании, а оно каждую секунду.

}

void loop() {
// пустой цикл, здесь будет контроль за неполнофазным режимом работы эл.двигателя
}

void count() {

tft.setTextColor(ST7735_WHITE); // nastavení barvy písma
t = rtc.getTime(); // čtení času
tft.setCursor (5, 120); // nastavení pozice kurzoru
tft.fillRect (5, 120, 50, 7, ST7735_BLACK); // vyčištění oblasti výstupu času
tft.print(rtc.getTimeStr()); // výstup hodinových údajů

wdt_reset(); // reset watchdog časovače každou smyčku, tj. každou sekundu

for (rc = 0; rc < 4; rc++) // začátek smyčky kontrolující shodu stavu vstupních
// битов порта предыдущему считанному состоянию битов порта D
{
pinState = (PIND >> 4) & (b << rc);

if (pumrcounter [rc] != pinState) { // a pokud se neshoduje, pak
pumrcounter [rc] = pinState; // přiřazení proměnné stavu bitu portu novou hodnotu 1/0
}
// индикация состояния объектов контроля цветом
// BLUE- это небольшой глюк имеющегося экрана ( или библиотеки? ), перепутаны RGB и BGR.
if (pinState == (b << rc)) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // pro počítání při nízké úrovni změňte ZELENOU na MODROU
} else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // pro počítání při nízké úrovni změňte MODROU na ZELENOU
pump [rc] += 1; // přidáme do počítadla času práce 1 sekundu
}
}

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

tft.fillRect (30, shift, 97, 40, ST7735_BLACK); // vyčištění oblasti výstupu času na práci
tft.fillRect ( 60, 120, 73, 7, ST7735_BLACK); // a data

tft.setCursor ( 60, 120 ); // set cursor position
tft.print(rtc.getDateStr()); // display date on LCD

for (rc = 0; rc < 4; rc ++) // display readings in whole, tenths and
{
tft.setCursor ( 30, rc * 10 + shift ); // hundredths of an hour with a shift down on the screen by 10 pixels
tft.println(pump [rc] / m);
}

// запись «сырых» значений наработки (в секундах)в EEPROM //////////////////////////////

for (rc = 0; rc < 4; rc ++)
{
EEPROM.put(address, pump [rc]);
address += sizeof(float); // increment address variable
}
}

// отправляем данные по радиоканалу из data указывая сколько байт надо отправить.
if ((k == 6 ) || (k == 18 ) || (k == 30 )) {

unsigned long data;

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

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

Drobná upozornění na konci. Počítání probíhá při nízké logické úrovni na vstupech.

Pull-up rezistory R2-R5 36 kΩ pro variantu s fotorezistory GL5516. V případě fototransistorové optočlenové a relé, použijte 4,7- 5,1 kΩ. Bootloader Arduino Nano v3.0 byl nahrazen Arduino Uno pomocí programátoru TL866A pro správnou funkci watchdog timeru. Fuse byly opraveny pro provoz při napětí nad 4,3 V. Vnější resetovací obvod R6 C3 nebyl použit. V příkladu programu frekvence vysílače neodpovídá nelicencovanému pásmu, pásmo 2,4 GHz je omezeno frekvencemi 2400.0—2483.5 MHz.

Frekvenční rozsah vysílače E01-ML01DP05 je 2400- 2525 MHz. Šířka pásma jednoho kanálu je 1 MHz, při nastavení rychlosti na «RF24_2MBPS» bude obsazen daný radio.setChannel(120) kanál a následující, tj. šířka pásma bude 2 MHz.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster