Kohalik autonoomne andmekogumisseade

Ettevõttesse on soetatud kodumaise tootmise NЕКСТ-М jälgimisseadmed "Нэкст Технолоджис". Seadmed tagavad pumpade töövisualiseerimise,
tule- ja häiresignalisatsiooni, pinget käivitites, ruumi temperatuuri, hädaolukorra vee taset. НЕКСТ-М südameks on ATMEGA 1280, mis annab lootust kohandatud lahenduste loomise võimalustele.

Kohustus oli luua võimalikult lühikese aja jooksul ja minimaalsete kuludega täiesti autonoomne kohandatud juhtimissüsteem. Aluseks on mikrokontroller. Arendus ja tootmine toimub firma enda personali abil.

Süsteem peab töötama sõltumatult mobiilsetest võrgustikutest, serverid, internetist ja raadiosageduse kasutamise loa süsteemist, mitte kasutades juhtimise ja kontrollimise süsteemides arvuteid või maksimaalselt perioodiliselt sülearvuteid, ilma juurdepääsuta objektidele pika aja jooksul (6-9 kuud). Võrgu konfigureerimine on raadiustruktuuriga. Andmed kogutakse ühes punktis ja edastatakse töötlemiseks tavakanalite kaudu või kindla koopiana.

Süsteem peab tagama:

  • pumba seadmete töö jälgimise
  • tehnoloogilise automaatika
  • kaitse hädaolukordade tagajärgede eest
  • hädaolukordade signalisatsiooni
  • tööaja arvestuse
  • elektritarbimise arvestuse
  • seadmete temperatuuri jälgimise
  • tule- ja häiresignalisatsiooni
  • infokaardi perioodiline kaugülekanne
  • tulevikus teadmata nõuded

Töötingimused:

  • katteala 1 km².
  • otsene nähtavus objektide vahel
  • temperatuur vahemikus +50 kuni -50 C
  • niiskus kuni 100%
  • bioloogiliselt aktiivsed sademed (hallitus, sulfaate vähendavad bakterid)
  • vibratsioon, mitte rohkem kui 1-2 klassi masinaid vastavalt GOST ISO 10816-1-97
  • elektromagnetiline keskkond – mootori lülitamine KТ 6053 releedega, sujuva käivitamise seadmed RVS-DN, PID-reguleerimise seadmed SIEMENS MICROMASTER, kiired ISM ja GSM sagedusvahemikus vastavalt nende seadmete nõuetele, käsitsi kaarekeevitus objektis.
  • võrgu ülepinged, lühiajalised elektrikatkestused, äikesega seotud ülepinged, faaside tasakaalu probleemid, kui kõrgepingeliinil juhe katkevad jaotamisvõrkudes 6-10 kV.

Hoolimata sellistest rangetest nõudmistest on teostamine täiesti lihtne, kui probleem lahendada järk-järgult.

Kõiki arvesse võttes sai projekti "ajuks" valitud arduino nano 3.0 plaat. Robotdyn'i tõukeplaat sisaldab ATMEGA 328 kontrollerit, vajalikku 3,3V pingestabilisaatorit.
800 mA voolu ja CH340G UART-USB konverterit.

Esiteks loodi tööaegade mõõturid, kuna need on kõige asjakohasemad. Varem kasutatud tööstuslikud mõõturid, mis olid ehitatud PIC-idel ilma trafo toitekaemikuta, läksid pingehüppest välja töö käigus. Ainult ise valmistatud 5V toiteplokiga ühendatud seadmed jäid terveks. Montaaži kiirus ja ühendamise universaalsus said tagatud, kui signaal seadmete olekust võetakse ühenduspunktide klemmidelt, st 380V kolmes faasis 1. faasi kohaloleku registreerimine. Kontrolleriga kooskõla saavutamiseks kasutatakse vahepealset releed 220V mähisega või optoparaat, mis koosneb LED-ist ja GL5516 fotoregestorist või optoparaat RS817-st. Kõiki valikuid on testitud töös. LED toidetakse sirgendatud pingega, voolu piiramisega kahte kondensaatorit, SВВ22, mis on valmistatud 630V pingele, järjestikku ühendatuna, et kaitsta juhusliku katse korral megaohmmeteriga.
Tööaja näitude lugemine ST7735S LCD ekraani kaudu, andmete edastamine reaalajas raadioside kaudu E01-ML01DP05 mooduli abil sagedusel 2,4 MHz. Seade sisaldab nRF24L01+ kiipi ja RFX2401C vastuvõtu-edastusvõimendit.
maksimaalne väljundvõimsus kuni 100 mW. Antennid on spiraalsed ja arvutatud vajalikul sagedusalal veebikalkulaatoris. leheltAntennitüübi valik põhineb ümbritsevate metallstruktuuride tõttu tagasipeegelduse vältimisel. Antennid on 3D-printeriga välja trükitud. Praegune mõõturite olek salvestatakse kontrolleri EEPROM-i ja taastatakse ootamatute toitekatkestuste korral. Aja intervallide mõõtmiseks kasutab RTC mikrokiip DS3231 varutoiteakuga moodulina. Toiteallikas sisaldab kolme moodulit: impulsstoiteallikas 220/5V HLK-PM01 600mA ja muundur 1-5V-st 5V-ks. HW-553 ja 03962A — akude kontroller, mis omab skeemi lühise, alalaadimise ja ülelaadimise kaitsega. Kõik komponendid on ostetud veebilehelt Aliexpress.

KatsekohverKohalik autonoomne andmekogumisseade
4-kanaline mõõtur. Sissevoolu jaoks on paigaldatud LC-filtrid, et kaitsta kohalike ühenduste häirete eest. Andmed jälgitavate objektide oleku kohta luetakse pidevalt iga sekundi järel ja kuvatakse LCD-l värvi abil. Andmete uuendamine ja kirjutamine energiat mittehoidvasse mällu toimub iga 36 sekundi järel. 36 sekundit on 1/100 tundi, just sellises formaadis on andmed vajalikud. Iga 12 sekundi järel edastatakse teavet sekundite arvu kohta, mis on kulutatud iga kontrollitava seadme kohta. EEPROM-i mälu on piiratud kirjutamis- ja kustutamistsüklitega, tootja andmetel 100000 korda. Halvim stsenaarium on see, kui pidevalt värskendatakse vähemalt ühte mälu elementi. 1. mooduli maht on 4 baiti, see on long formaadis number, 4 mõõturit kokku 16 baiti ühe kirjutamise jaoks. Mikrokiibi mälu pikkus on 1024 baiti, pärast 64. kirjutamist 4 mõõturi kohta algab kirjutamine uuesti. EEPROM-i raamatukogus ei teosta meetod EEPROM.put kirjutamist, kui mäluelemendi ja kirjutatava info väärtus on sama, elementide degradeerumist ei toimu. Seega on mälu tagatud tööaeg üle 7 aasta. Võimalik, kuid mitte garanteeritud tööaeg võib olla palju pikem.

Põhimõtteline skeemKohalik autonoomne andmekogumisseade
Programmi kirjutamine Arduino IDE-s//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); // radio objekt töötamiseks RF24 raamatukoguga,
// и номера выводов nRF24L01+ (CE, CSN)
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
Time 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]; // massiiv, mis sisaldab 4 sekundi mõõturit
float m = 3600.0;
unsigned int address = 0;
int rc; // mõõturite muutujad
unsigned long sumprim = 0;
unsigned long sumsec = 0;
byte i = 0;
byte k = 34;
unsigned int z = 0;
byte b = B00000001;
byte pumrcounter[4]; // massiiv objektide olekute hoidmiseks, 1 - väljas, 0 - sees.
int start = 0; //

void setup() {

rtc.begin();
radio.begin(); // Käivitame nRF24L01+ töö
radio.setChannel(120); // andmeside kanal (0-st 127-ni).
radio.setDataRate (RF24_250KBPS); // andmeedastuskiirus (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel (RF24_PA_MAX); // saatja võimsus (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe (0xAABBCCDD11LL); // Avame toru identifikaatoriga andmete edastamiseks

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

tft.initR(INITR_BLACKTAB); // ST7735S kiibi initsialiseerimine, must tab
// 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); // Luba tekstil voolata parema ääre peale
tft.setRotation( 2 ); // musta PCB jaoks ja punase tft.setRotation(0) või mitte.
tft.fillScreen(ST7735_BLACK); // ekraani puhastamine

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // tarkvaraline tõstmine töötab, kõrge tase-
// контролируемые объекты «не работают», во все 4 старших порта D записана «1», не идет счет.

for ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // objekti positsioonide numbrite väljund
tft.print ( rc + 1 );
}

tft.setCursor (12, 0); // kolme reaga teksti väljund
tft.println («DEVELOPERS & BUILD» ); // enese kiitmiseks
tft.setCursor (24, 10); // või vihaste autoriõiguste jaoks
tft.print («DEVELOPER M.M.»);
tft.setCursor (28, 20);
tft.print («BUILD-ER D.D.»);

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

for ( z = 0; z < 1023; z += 16 ) { // Läbib kõik EEPROM-i mälurakud
//и записывает в массив из 4-х переменных pump, по 4 байта каждый счетчик, т.к.
// переменная беззнаковая лонг. Счетчиков 4, одна запись всех 4-х занимает 16 байт.
EEPROM.get ( z, pump [0]); // nii, ilma tsüklist, vähem mahtu
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; // aadressi suurendamine järgmise ploki salvestamiseks, viimata viimase kirje andmeid

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

attachInterrupt(0, count, RISING); // pin D2, katkestuse aktiveerimise lubamine, iga sekundi tagant tulevad.
// импульсы от RTC DS3231 с выхода SQW

wdt_enable (WDTO_8S); // vallandab valvuri taimeri, taaskäivitab mikrokontrolleri, kui see hangub, aeg,
// за которое надо подать команду сброса таймера wdt_reset( и избежать перезагрузки при нормальной работе- 8 сек.
// для тестов не рекомендуется устанавливать значение менее 8 сек.В данном случае сброс таймера происходит в пре-
// рывании, а оно каждую секунду.

}

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

void count() {

tft.setTextColor(ST7735_WHITE); // teksti värvi seadmine
t = rtc.getTime(); // kellaaja lugemine
tft.setCursor ( 5, 120 ); // kursori positsiooni seadmine
tft.fillRect ( 5, 120, 50, 7, ST7735_BLACK); // kustutab aja väljundpiirkonna
tft.print(rtc.getTimeStr()); // kellaja näitude väljund

wdt_reset(); // nullib valvuri taimeri iga tsükli, st. sekundi

for (rc = 0; rc < 4; rc ++) // sisenemise oleku kontrollimise tsükli algus
// битов порта предыдущему считанному состоянию битов порта D
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // ja kui see ei vasta, siis
pumrcounter [rc] = pinState; // määrake muutuja oleku bitten värv õige väärtus 1/0
}
// индикация состояния объектов контроля цветом
// BLUE- это небольшой глюк имеющегося экрана ( или библиотеки? ), перепутаны RGB и BGR.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // madalal tasemel loendamiseks muutke ROHELINE SINISEKS
} else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // madalal tasemel loendamiseks muutke SININE ROHELISEKS
pump [rc] += 1; // lisame tööaegade loendisse 1 sekund
}
}

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

tft.fillRect ( 30, shift, 97, 40, ST7735_BLACK ); // kustutab tööaja väljundpiirkonna
tft.fillRect ( 60, 120, 73, 7, ST7735_BLACK); // ja kuupäevade

tft.setCursor ( 60, 120 ); // kursori positsiooni seadmine
tft.print(rtc.getDateStr()); // kuupäeva ekraanile väljastamine

for (rc = 0; rc < 4; rc++) // näidud jagatakse täisarvudeks, kümnendikeks ja
{
tft.setCursor ( 30, rc * 10 + shift ); // tunni sajandikega nihutamine ekraanil alla 10 pikslit
tft.println(pump [rc] / m);
}

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

for (rc = 0; rc < 4; rc++)
{
EEPROM.put(address, pump [rc]);
address += sizeof(float); // aadressi kirjutamise muutuja inkrememint
}
}

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

Lõpus väikesed märkused. Loendamine toimub madala loogilise taseme korral sissetulekutel.

Tõmbluku R2-R5 takistused on 36 kΩ fotoresistorite GL5516 versiooni jaoks. Fototransistori isolatooriga ja releega tuleks paigaldada 4,7-5,1 kΩ. Arduino Nano v3.0 laadija vahetati Arduino Uno vastu TL866A programmeerijaga, et tagada järeltuleva ajutine taimeri korrektne töö. Füüsi on parandatud üle 4,3 V pingega töötamiseks. Välist nullimise ahelat R6 C3 ei kasutatud. Näidisprogrammis ei vasta edastaja sagedus litsentseerimata vahemikule, 2,4 MHz vahemik on piiratud sagedustega 2400,0–2483,5 MHz.

E01-ML01DP05 edastaja vahemik on 2400-2525 MHz. Ühe kanali ribalaius on 1 MHz, kui seadistada kiirus 'RF24_2MBPS', on kasutusel näidatud radio.setChannel(120) kanal ja järgmine, st ribalaius on 2 MHz.

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster