Kohalik autonoomne andmekogumissüsteem

Ettevõte ostis ettevõtte Next Technologies siseriiklikult toodetud NEKST-M seirepostid. Pumbaseadmete töö visualiseerimise tagamiseks,
tule- ja valvesignalisatsioonid, pinge olemasolu starteritel, toatemperatuur, avariiline veetase. NEKST-M südameks on ATMEGA 1280 ja see asjaolu on julgustav, kuna on võimalik luua oma komplekt konkreetsete vajaduste jaoks.

Ülesandeks seati luua võimalikult lühikese aja ja minimaalsete kuludega täielikult autonoomne kohalik dispetšersüsteem konkreetsete vajaduste jaoks. Aluseks on mikrokontroller. Arendus, tootmine, personali enda loodud.

Süsteem peab töötama sõltumata mobiilsidevõrkudest, serveritest, Internetist ja raadiosagedusressursside kasutamise litsentsisüsteemist, mitte kasutama juhtimis- ja haldussüsteemi töös arvuteid või äärmisel juhul perioodiliselt sülearvuteid, ilma juurdepääsuta objektid pikka aega (6-9 kuud). Võrgukonfiguratsioonil on radiaalne struktuur. Andmed kogutakse ühel hetkel ja saadetakse seejärel töötlemiseks tavaliste sidekanalite kaudu või paberkoopiana.

Süsteem peab pakkuma:

  • pumbaseadmete töö jälgimine
  • tehnoloogiline automatiseerimine
  • kaitse hädaolukordade tagajärgede eest
  • hädaolukorra signalisatsioon
  • tööaja arvestus
  • tarbitud elektrienergia koguse arvutamine
  • seadmete temperatuuri reguleerimine
  • valve- ja tuletõrjesignalisatsioon
  • teabe perioodiline kaugsalvestus
  • teadmata tulevased nõuded

Töötingimused:

  • leviala 1 ruutkilomeetrit.
  • otsene nähtavus objektide vahel
  • temperatuur +50 kuni -50 C
  • niiskus kuni 100%
  • bioloogiliselt aktiivsed ladestused (hallitus, sulfaate redutseerivad bakterid)
  • klasside 1-2 masinate vibratsioon, mitte enam vastavalt standardile GOST ISO 10816-1-97
  • elektromagnetiline keskkond - elektrimootorite lülitamine kontaktoritega KT 6053, pehmekäivitusseadmed RVS-DN, juhtimisseadmed SIEMENS MICROMASTER PID, kiirgus ISM ja GSM vahemikus vastavalt nendele seadmetele esitatavatele nõuetele, käsitsi kaarkeevitus kohapeal
  • võrgu liigpinge, lühiajalised katkestused toiteallikas, äikese ülepinged, faaside tasakaalustamatus õhuliini juhtme katkemisel 6-10 kV jaotusvõrkudes.

Vaatamata nii rangetele nõuetele on probleemi samm-sammult lahendamisel rakendamine üsna lihtne.

Kõike arvesse võttes sai plaani “ajuks” “Arduino Nano 3.0” tahvel. Robotdyn plaadil on ATMEGA 328 kontroller, vajalik 3,3V pingestabilisaator
vool 800 mA ja muundur CH340G UART-USB-ks.

Esiteks loodi töötundide loendurid kõige ajakohasematena. Varem kasutatud tööstuslikud arvestid, mis olid kokku pandud trafodeta toiteahelaga PIC-idele, ebaõnnestusid pingetõusu tõttu aasta jooksul. Ainult need, mis olid ühendatud omatehtud 5 V toiteallikatega, jäid terveks. Paigaldamise ja ühendamise mitmekülgsuse kiirendamiseks võetakse lülitusseadmete klemmidest signaal seadmete oleku kohta, s.o. 1. faasi pinge olemasolu registreerimine kolmefaasilise toiteallikaga 380 V. Kontrolleriga kooskõlastamiseks kasutatakse 220V mähisega vahereleed või LED-ist ja GL5516 fototakistist koosnevat optroni või PC817 optroni. Kõik variandid on testitud. Valgusdioodi toiteallikaks on voolupiiranguga alaldatud pinge, kasutades kahte SVV22 kondensaatorit, mis on ette nähtud pingele 630 V, mis on jadamisi ühendatud ohutuse tagamiseks ahelate juhuslikul katsetamisel megoommeetriga.
Tööaja näitude lugemine ST7735S LCD ekraani abil, reaalajas andmeedastus raadio teel mooduli E01-ML01DP05 abil sagedusel 2,4 MHz. See seade sisaldab nRF24L01+ kiipi ja RFX2401C saate-/vastuvõtuvõimendit,
väljundvõimsus kuni 100 mW. Helikujulised antennid, mis on loodud veebikalkulaatori soovitud vahemiku jaoks сайта. Antenni tüübi valiku määrab ümbritsevate metallkonstruktsioonide üksikult peegeldunud lainete vastuvõtu välistamine. Antenni osad prinditakse 3D-printerile. Loendurite hetkeseisund salvestatakse kontrolleri enda EEPROM-i ja see taastatakse ootamatu elektrikatkestuse korral. Ajavahemikud loendamiseks pakub RTC kiip DS3231 varuakuga mooduli kujul. Toiteallikas on 3 moodulit, tegelik impulsiallikas 220/5V HLK-PM01 600mA, muundur 1-5V kuni 5V HW-553 и 03962 - aku kontroller koos skeem kaitse lühise, ülelaadimise ja ülelaadimise eest. Kõik komponendid osteti Aliexpressi veebisaidilt.

LeivalaudKohalik autonoomne andmekogumissüsteem
4-kanaliline loendur. Sisendites on LC-filtrid, mis kaitsevad keerdpaarsideliini häirete eest. Andmeid juhtobjektide oleku kohta loetakse pidevalt kord sekundis ja kuvatakse värviliselt LCD-ekraanil. Näidud värskendatakse ja salvestatakse püsimällu iga 1 sekundi järel. 36 sekundit on 36/1 tunnist, selles vormingus andmeid nõutakse. Iga 100 sek. edastatakse teave iga juhtseadme töö sekundite arvu kohta. EEPROM-mälus on piiratud arv kirjutamis-kustutustsükleid, tootja sõnul 12 100000 korda. Halvim variant on see, kui vähemalt ühte lahtrit pidevalt uuendatakse. 1. loenduri maht on 4 baiti, see on pikk vormingu number, 4 loendurit, kokku võtab üks kirje 16 baiti. Kiibi mälu pikkus on 1024 baiti, pärast 64 4 loenduri sisestamist algab salvestamine otsast. EEPROM-i teegis meetod EEPROM.put ei kirjuta; kui lahtri väärtus ja kirjutatav teave ühtivad, siis lahtrite halvenemist ei toimu. Selle tulemusena on mälu garanteeritud tööaeg üle 7 aasta. Võimalik, kuid garanteerimata töö tegemise aeg võib olla palju pikem.

VooluskeemKohalik autonoomne andmekogumissüsteem
Programm Arduino IDE-s//12 328 baiti (38%)

#kaasa // Põhiline graafikateek
#kaasa // Riistvaraspetsiifiline teek
#kaasake
#kaasa
# kaasata
#kaasa
#kaasa
RF24 raadio(9, 10); // raadioobjekt RF24 teegiga töötamiseks,
// ja PIN-koodid nRF24L01+ (CE, CSN)
#kaasa
DS3231 rtc (SDA, SCL);
Aeg t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // saate selle ühendada ka Arduino lähtestamisega
// Sel juhul määra selle #define pin väärtuseks -1!
//#define TFT_DC 9 // DC=RS=A0 - käsu või andmeregistri valimise tähistusvalikud.
#define TFT_DC 3

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

// Variant 2: kasutage mis tahes tihvte, kuid veidi aeglasemalt!
#define TFT_SCLK 13 // määrake need tihvtidele, mis teile meeldivad!
#define TFT_MOSI 11 // määrake need tihvtidele, mis teile meeldivad!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#kaasa

baidi nihe = 52;
bait pinState;
märgita pikk pump[4];// massiiv 4 sekundi loenduri väärtustega
ujuki m = 3600.0;
allkirjastamata siseaadress = 0;
int rc;// loendurite muutuja
märgita pikk suprim = 0;
märgita pikk summek = 0;
bait i = 0;
bait k = 34;
märgita int z = 0;
bait b = B00000001;
bait-pumrloendur[4]; // massiiv objekti olekute salvestamiseks, 1 - väljas, 0 - sees.
int algus = 0; //

void setup () {

rtc.begin();
raadio.begin(); // Töö alustamine nRF24L01+
radio.setChannel(120); // andmekanal (0 kuni 127).
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); // Avage andmeedastuseks toru identifikaatoriga

// Kellaaja määramiseks tühjendage vajalikud read
//rtc.setDOW(1); // Nädalapäev
//rtc.setTime(21, 20, 0); // Aeg, 24 tunni formaadis.
//rtc.setDate(29, 10, 2018); // Kuupäev, 29. oktoober 2018

tft.initR(INITR_BLACKTAB); // ST7735S kiibi lähtestamine, must vahekaart
// Kui kasutate 1.44-tollist TFT-d, kasutage seda initsialiseerijat (kommentaaride tühistamine).
//tft.initR(INITR_144GREENTAB); // lähtestage ST7735S kiip, PUNANE rcB sakk
tft.setTextWrap(false); // Luba tekstil paremast servast maha joosta
tft.setRotation( 2 ); // BLACK PCB ja RED jaoks tft.setRotation(0) või mitte.
tft.fillScreen(ST7735_BLACK); // Tühjenda ekraan

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // tarkvara pingutamine töötab, kõrge tase -
// juhitavad objektid “ei tööta”, “4” kirjutatakse kõigile 1 vanempordile D, loendamist ei toimu.

for ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + vahetus ); // juhtobjektide positsiooninumbrite kuvamine
tft.print(rc + 1);
}

tft.setCursor(12, 0); // väljastab 3 rida teksti
tft.println("ARENDAJAD JA EHITUS"); // kiita ennast kallid
tft.setCursor(24, 10); // või kuri autoriõigus
tft.print("ARENDAJA MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//andmete taastamine////////////////////////////////////////////// ///////////

for ( z = 0; z < 1023; z += 16 ) { // Itereerib läbi kõik valdkonna lahtrid
//ja kirjutab 4 pumba muutuja massiivi, iga loenduri jaoks 4 baiti, sest
// märgita pikk muutuja. Seal on 4 loendurit, üks kirje kõigist neljast võtab 4 baiti.
EEPROM.get(z, pump[0]); // seega, ilma for-tsüklita, väiksem helitugevus
EEPROM.get(z+4, pump[1]);
EEPROM.get(z+8, pump[2]);
EEPROM.get(z+12, pump[3]);

// uue järgmise väärtuse määramine 4 loenduri summale
summ = (pump [0] + pump [1] + pump [2] + pump [3]);

// võrdleb sumprim-muutuja 4 loenduri summa uut väärtust muutuja eelmise väärtusega
// summasec ja kui eelmine summa on väiksem või võrdne uue summaga, määratakse uus summa, mis on suurem või võrdne
// summasec väärtus.

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

//ja aadressi muutujale määratakse praegune väärtus z, z on 16-baidise 4 väärtusega ploki alguse aadress
// üheaegselt salvestatud loendurid (kuna pordi pollimisel kirjutatakse selle kõik 8 bitti korraga,
// sealhulgas meie vajalikud kõrged 4 bitti pordist D).
aadress = z;
}
}

// 16 salvestatud loenduri väärtusega 4-baidise ploki alguse aadressil pääseb uuesti eeprom-mällu
// viimane, st. väärtused enne väljalülitamist või taaskäivitamist külmumise tõttu. Viimase salvestamine
// loenduri väärtused 4 muutuja massiivi pump.

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

aadress += 16; //järgmise ploki kirjutamise aadressi suurendamine ilma viimase kirje andmeid üle kirjutamata

//andmete taastamise lõpp//////////////////////////////////////////// ///////////////////

attachInterrupt(0, count, RISING); // pin D2, luba katkestused, tuleb iga sekund
// impulsid RTC DS3231-st SQW väljundist

wdt_enable(WDTO_8S); // käivitage valvekoera taimer, taaskäivitage kontroller külmumise korral, aeg,
// mille jaoks peate andma taimeri lähtestamise käsu wdt_reset( ja vältima tavatöö ajal taaskäivitamist - 8 sek.
// testide puhul ei ole soovitatav seada väärtust alla 8 sekundi Sel juhul lähtestatakse eelistatavalt taimer
// tõmblemine, ja seda juhtub iga sekund.

}

void loop () {
// tühi tsükkel, siin saab juhtida elektrimootori avatud faasi tööd
}

tühine arv() {

tft.setTextColor(ST7735_WHITE); // määrake fondi värv
t = rtc.getTime(); // lugemisaeg
tft.setCursor(5, 120); // kursori asukoha määramine
tft.fillRect(5, 120, 50, 7, ST7735_MUST); // ajaväljundi ala tühjendamine
tft.print(rtc.getTimeStr()); // väljundkella näidud

wdt_reset(); // lähtestab valvekoera iga tsükli, st sekundi järel

for (rc = 0; rc < 4; rc ++) // sisendoleku vastavuse kontrollimise tsükli algus
// pordi bitid pordi D bittide eelmisele lugemisolekule
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // ja kui ei sobi, siis
pumrcounter[rc] = pinState; // pordibiti olekumuutujale uue väärtuse määramine 1/0
}
// värvijuhtimise objektide oleku näitamine
// SININE on olemasoleva ekraani (või teegi?) väike tõrge, RGB ja BGR on segamini.
if (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + vahetus)), 7, 7, ST7735_BLUE); // madala taseme lugemiseks muutke ROHELINE SINISEKS
} Else {
tft.fillRect(15, ((rc * 10 + vahetus)), 7, 7, ST7735_ROHELINE); // madala taseme loendamiseks muutke SININE ROHELISEKS
pump [rc] += 1; // lisage tööaja loendurile 1 sekund
}
}

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

tft.fillRect(30, vahetus, 97, 40, ST7735_MUST); // tööaja kuvamise ala tühjendamine
tft.fillRect(60, 120, 73, 7, ST7735_MUST); // ja kuupäevad

tft.setCursor(60, 120); // kursori asukoha määramine
tft.print(rtc.getDateStr()); // kuupäeva kuvamine LCD-ekraanil

for (rc = 0; rc < 4; rc ++) //väljund töötunnid tervikuna, kümnendikud ja
{
tft.setCursor ( 30, rc * 10 + shift ); // tunnisajandikud ekraani 10 piksli võrra allapoole nihutamisega
tft.println(pump [rc] / m);
}

// "toorete" töötundide väärtuste (sekundites) kirjutamine EEPROM-i //////////////////////////////

jaoks (rc = 0; rc < 4; rc++)
{
EEPROM.put(aadress, pump [rc]);
aadress += sizeof(float); // kirjutusaadressi muutuja suurendamine
}
}

// saadab andmeid raadiokanali kaudu andmetest, mis näitavad, mitu baiti tuleks saata.
if ((k == 6 ) || (k == 18 ) || (k == 30 )) {

allkirjastamata pikad andmed;

radio.write(&start, suurus(algus));

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

Paar märkust lõpetuseks. Loendamine toimub sisendites madalal loogilisel tasemel.

Tõmbetakistused R2-R5 on 36 kOhm fototakistitega GL5516. Fototransistori optroni ja relee puhul seadke 4,7-5,1 kOhm. Arduino Nano v3.0 alglaadur asendati Arduino Unoga, kasutades valvekoera taimeri õigeks tööks programmeerijat TL866A. Kaitsmed on korrigeeritud töötama pingetel üle 4,3 V. Välist lähtestusahelat R6 C3 ei kasutatud. Näidisprogrammis ei vasta saatja sagedus litsentsimata vahemikule, 2,4 MHz vahemik on piiratud sagedustega 2400.0-2483.5 MHz.

E01-ML01DP05 saatja tööulatus on 2400-2525 MHz. Ühe kanali ribalaius on 1 MHz, kiiruseks “RF24_2MBPS” määrates on määratud radio.setChannel(120) kanal ja järgmine hõivatud, st. sagedus on 2 MHz.

Allikas: www.habr.com

Lisa kommentaar