Sistemi lokal autonom i mbledhjes së të dhënave

Në ndërmarrje u blenë postet e monitorimit NËKST-M të prodhimit vendas "Nekst Technologies". Për të siguruar vizualizimin e punës së grupeve të pompave,
sistemëve të alarmit për zjarri dhe mbrojtje, pranishmërinë e tensionit në filluesit, temperaturën në ambient, nivelin emergjent të ujit. Zemra e NËKST-M është ATMEGA 1280 dhe kjo fakt e inkurajoi në planin e mundësive për të krijuar një komplekset të vet për nevojat specifike.

U vendos detyra për të krijuar një sistem plotësisht autonom të menaxhimit lokal për nevoja specifike në afatin e shkurtër dhe me pak shpenzime. Baza - mikro Kontrollori. Zhvillimi, prodhimi, krijohet nga stafi i vet.

Sistemi duhet të punojë pa varësi nga rrjetet celulare, serverësh, interneti dhe sistemi i miratimit për përdorimin e burimeve radiofonike, pa përdorur në punën e sistemit të kontrollit dhe menaxhimit kompjuterët ose maksimumi përdorimin e përkohshëm të laptopëve, pa akses në objektet për një periudhë të gjatë (6-9 muaj). Konfigurimi i rrjetit ka një strukturë radiale. Të dhënat mblidhen në një pikë dhe më pas dërgohen për përpunim përmes kanaleve të zakonshme të komunikimit ose në formë të një kopje të ngurtë.

Sistemi duhet të sigurojë:

  • kontrollin e punës së instalimeve të pompave
  • automatikën teknologjike
  • mbrojtjen nga pasojat e skenarëve emergjentë
  • alarmimin për skenarët emergjentë
  • numërimin e kohës së punës
  • numërimin e sasisë së energjisë elektrike të konsumuar
  • kontrollin e temperaturës së pajisjeve
  • alarmimin për mbrojtjen nga zjarri
  • marrjen periodike të informacionit në distancë
  • kërkesa të panjohura në të ardhmen

Kushtet e punës:

  • territori i mbulimit 1 km².
  • pamje e drejtpërdrejtë midis objekteve
  • temperatura nga +50 deri në -50 °C
  • lagështia deri në 100%
  • depozita biologjikisht aktive (myku, bakteret sulfato-redukuese)
  • vibrimi, jo më shumë se klasat 1-2 të makinave sipas GOST ISO 10816-1-97
  • situata elektromagnetike - çakërritja e motorëve elektrikë me kontaktorët KT 6053, pajisjet e regjimit të butë RVS-DN, pajisjet e PID-regulimit SIEMENS MICROMASTER, rrezatime në ISM dhe GSM sipas kërkesave për këto pajisje, saldimi manual me arka në objekt
  • ndihma e shtuar e tensionit të rrjetit, pezullimi i përkohshëm i energjisë elektrike, mbingarkesat e shkaktuara nga stuhitë, devijimi i fazave gjatë thyerjes së telit në rrjetet shpërndarëse 6-10 kV.

Megjithë këto kërkesa të rrepta, realizimi është shumë i thjeshtë nëse zgjidhet në faza.

Duke marrë parasysh të gjitha, truri i konceptuar është karta "Arduino Nano 3.0". Karta nga "Robotdyn" ka kontrolluesin ATMEGA 328, stabilizuesin e tensionit 3,3V me
rrjedhje 800 mA dhe konvertuesin CH340G UART-USB.

Në radhë të parë, u krijuan matësit e funksionimit si më aktualët. Matësit industrialë të përdorur më parë të ndërtuar mbi PIC me një skemë furnizimi pa transformator u prishën nga goditjet e tensionit gjatë një viti pune. Vetëm ato të lidhura përmes blloqeve të energjisë të fabrikuar për tensionin 5V mbetën të padëmtuara. Për të përshpejtuar instalimin dhe për të rritur universitetin e lidhjeve, sinjali i gjendjes së pajisjeve merret nga terminalet e aparateve të lidhjes, dmth. regjistrimi i pranisë së fazës së parë të tensionit me furnizim trefazor 380V. Për të harmonizuar me kontrolluesin përdoret një rele ndërmjetës me një bobinë 220V ose një opto-parë e përbërë nga një LED dhe një foto-rezistor GL5516 ose opto-parë RC817. Të gjitha variantet u testuan në punë. LED-i ushqehet me tension të drejtuar me kufizim të rrjedhës përmes dy kondensatorëve SVV22 të dizajnuar për një tension 630V të lidhur në seri për mbrojtje gjatë kontrollit të rastësishëm të qarqeve me megohmetër.
Leximi i të dhënave të kohës së funksionimit me anë të ekranit LCD ST7735S, transmetimi i të dhënave në mënyrë të menjëhershme përmes moduleve E01-ML01DP05 në frekuencën 2,4 MHz. Ky pajisje përmban çipin nRF24L01+ dhe përforcuesin e pranimit-dëshirues RFX2401C,
puthja e daljes deri në 100 mW. Antenat spirale janë të dizajnuara për gamën e nevojshme në kalkulatorin online. the siteZgjedhja e llojit të antenave është e bazuar në përjashtimin e pranimit të valëve të reflektuara një herë nga strukturat metalike përreth. Detajet e antenave janë shtypura në një printer 3D. Gjendja aktuale e matësve ruhet në EEPROM të kontrolluesit dhe, në rast të ndërrimit të papritur të energjisë, rikuperohet. Intervalet kohore për llogaritjen sigurohen nga çipi RTC DS3231 në formën e një moduli me bateri rezervë. Në BП janë përdorur 3 modula, burimi impulsor 220/5V HLK-PM01 600mA, përkthyesi nga 1-5V në 5V. HW-553 и 03962A — kontrollues baterie që ka skemën e mbrojtjes nga KZ, descarga e tepërt dhe mbushjes së tepërt. Të gjitha komponentët janë blerë në faqen Aliexpress.

Tavolina prototipeSistemi lokal autonom i mbledhjes së të dhënave
Matës 4-kanal. Në hyrje ka filtrat LC për mbrojtje nga ndërhyrjet në linjën e komunikimit me tel çift. Të dhënat mbi gjendjen e objekteve të kontrollit lexohen vazhdimisht 1 herë në sekondë, shfaqen me ngjyrë në LCD. Rinnovimi i leximeve dhe regjistrimi në memorien e paenergji bëhet çdo 36 sekonda. 36 sekonda - kjo është 1/100 ore, është në këtë format që kërkohen të dhënat. Çdo 12 sekonda ndodh transmetimi i informacionit mbi numrin e sekondave të punës për çdo pajisje kontrolluese. Memoria EEPROM ka një numër të kufizuar ciklesh regjistrimi - fshirjeje, sipas të dhënave të prodhuesit, 100000 herë. Varianti më i keq është kur vazhdimisht bëhet rinovimi edhe i një qelize. Vëllimi i një matësi është 4 byte, ky është një numër në format long, 4 matës, gjithsej 16 byte zë një regjistrim. Gjatësia e memories së çipit është 1024 byte, pas 64 regjistrimeve të 4 matësve regjistrimi do të fillojë përsëri. Në bibliotekën EEPROM metoda EEPROM.put nuk bën regjistrim, nëse vlera e qelisë dhe informacioni i regjistrimit përputhen, nuk do të ketë degradim të qelizave. Si rezultat, koha e garantuar e funksionimit të memories do të jetë më shumë se 7 vjet. Koha e mundshme, por e pa garantuar, mund të jetë shumë më e madhe.

Skema parimoreSistemi lokal autonom i mbledhjes së të dhënave
Programi në 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); // objekti radio për punën me bibliotekën RF24,
// и номера выводов nRF24L01+ (CE, CSN)
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Koha 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]; // array me 4 vlera matësish
float m = 3600.0;
unsigned int address = 0;
int rc; // variabla për matësit
unsigned long sumprim = 0;
unsigned long sumsec = 0;
byte i = 0;
byte k = 34;
unsigned int z = 0;
byte b = B00000001;
byte pumrcounter [4]; // array për ruajtjen e gjendjeve të objekteve, 1 - ndalesë, 0 - aktiv.
int start = 0; //

void setup() {

rtc.begin();
radio.begin(); // Inicion punën e nRF24L01+
radio.setChannel(120); // kanali i transmetimit të të dhënave (nga 0 deri në 127).
radio.setDataRate (RF24_250KBPS); // shpejtësia e transmetimit të të dhënave (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel (RF24_PA_MAX); // fuqia e transmetuesit (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe (0xAABBCCDD11LL); // Hapim tubin me identifikues për transmetimin e të dhënave.

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

tft.initR(INITR_BLACKTAB); // filloni një çip ST7735S, tab i zi.
// 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); // Lejoni tekstin të dalë jashtë skajit të djathtë.
tft.setRotation( 2 ); // për PCB të ZI dhe TË KUQE tft.setRotation(0) apo jo.
tft.fillScreen(ST7735_BLACK); // pastrimi i ekranit.

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // ngjitur programore punon, nivel i lartë-
// контролируемые объекты «не работают», во все 4 старших порта D записана «1», не идет счет.

for ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // shfaqja e numrave të pozicioneve të objekteve të kontrollit.
tft.print ( rc + 1 );
}

tft.setCursor (12, 0); // shfaqja e 3 rreshtave të tekstit.
tft.println («DEVELOPERS & BUILD» ); // për të lavdëruar veten tuaj të dashur.
tft.setCursor (24, 10); // ose e keqe e kopjuesit.
tft.print («DEVELOPER M.M.»);
tft.setCursor (28, 20);
tft.print («BUILD-ER D.D.»);

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

for ( z = 0; z < 1023; z += 16 ) { // Kalon në të gjitha qelizat e EEPROM-it.
//и записывает в массив из 4-х переменных pump, по 4 байта каждый счетчик, т.к.
// переменная беззнаковая лонг. Счетчиков 4, одна запись всех 4-х занимает 16 байт.
EEPROM.get ( z, pump [0]); // kështu, pa ciklin for, më pak hapësirë.
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; // rritni adresën për regjistrimin e bllokut të ardhshëm pa fshirë të dhënat e regjistrimit të fundit.

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

attachInterrupt(0, count, RISING); // pin D2, lejon funksionimin e ndërprerjes, çdo sekondë vijnë.
// импульсы от RTC DS3231 с выхода SQW

wdt_enable (WDTO_8S); // aktivizimi i orës së ruajtjes, ri-nis kontrollin në rast ngërçi, koha,
// за которое надо подать команду сброса таймера wdt_reset( и избежать перезагрузки при нормальной работе- 8 сек.
// для тестов не рекомендуется устанавливать значение менее 8 сек.В данном случае сброс таймера происходит в пре-
// рывании, а оно каждую секунду.

}

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

void count() {

tft.setTextColor(ST7735_WHITE); // vendosja e ngjyrës së shkrimit.
t = rtc.getTime(); // leximi i kohës.
tft.setCursor ( 5, 120 ); // vendosja e pozicionit të kursorit.
tft.fillRect ( 5, 120, 50, 7, ST7735_BLACK); // pastrimi i zonës së nxjerrjes së kohës.
tft.print(rtc.getTimeStr()); // shfaqja e leximeve të orës.

wdt_reset(); // rivendosja e orës së ruajtjes çdo cikël, dmth. çdo sekondë.

for (rc = 0; rc < 4; rc ++) // fillimi i ciklit për kontrollin e përputhshmërisë së gjendjes së hyrjes.
// битов порта предыдущему считанному состоянию битов порта D
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // dhe nëse nuk është në përputhje, atëherë
pumrcounter [rc] = pinState; // caktimi i variablës gjendjes së bitit të portit me vlerën e re 1/0.
}
// индикация состояния объектов контроля цветом
// BLUE- это небольшой глюк имеющегося экрана ( или библиотеки? ), перепутаны RGB и BGR.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // për numërimin me nivel të ulët ndryshoni GREEN në BLUE.
} else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // për numërimin me nivel të ulët ndryshoni BLUE në GREEN.
pump [rc] += 1; // shtoni në numëruesin e kohës së punës 1 sekondë.
}
}

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

tft.fillRect ( 30, shift, 97, 40, ST7735_BLACK ); // pastrimi i zonës së nxjerrjes së kohës së punës.
tft.fillRect ( 60, 120, 73, 7, ST7735_BLACK); // dhe datat

tft.setCursor ( 60, 120 ); // vendosja e pozicionit të kursorit
tft.print(rtc.getDateStr()); // shfaqja e datës në ekranin LCD

for (rc = 0; rc < 4; rc ++) // shfaqja e të dhënave të punës në tërë, dhjetëra dhe
{
tft.setCursor ( 30, rc * 10 + shift ); // qindarkave të orës me një zhvendosje poshtë në ekran për 10 piksel
tft.println(pump [rc] / m);
}

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

for (rc = 0; rc < 4; rc ++)
{
EEPROM.put(address, pump [rc]);
address += sizeof(float); // inkrementi i adresës së variablit të shkrimit
}
}

// отправляем данные по радиоканалу из 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));
}
}
}

Vërejtje të vogla në fund. Numërimi fillon kur niveli logjik është i ulët në hyrje.

Rezistencat e tërheqjes R2-R5 36 kΩ për variantin me fotoresistorë GL5516. Në rastin e optokoplerëve me fototransistorë dhe rele, vendosni 4.7-5.1 kΩ. Bootloader-i i Arduino Nano v3.0 është zëvendësuar me Arduino Uno përmes programatorit TL866A për funksionimin e saktë të timer-it të rojeve. Fuzat janë rregulluar për të punuar me tension mbi 4,3 V. Gaza e jashtme R6 C3 nuk është përdorur. Në shembullin e programit, frekuenca e transmetuesit nuk përputhet me spektrin e pa licencuar, spektri 2.4 MHz është i kufizuar në frekuencat 2400.0—2483.5 MHz.

Spektri i transmetuesit E01-ML01DP05 është 2400-2525 MHz. Gjerësia e kanalit është 1 MHz, kur vendosni shpejtësinë si "RF24_2MBPS", kanali i caktuar radio.setChannel(120) dhe ai pasues do të zënë, dmth. spektri do të jetë 2 MHz.

Burimi: habr.com

Купить надежный хостинг для сайтов с защитой от DDoS, VPS VDS серверы 🔥 Купить надежный хостинг для сайтов с защитой от DDoS, VPS VDS серверы | ProHoster