Lokaal Autonome Data Acquisition System

It bedriuw kocht NEKST-M tafersjochposten, produsearre yn eigen lân troch Next Technologies. Om fisualisaasje fan 'e wurking fan pompeenheden te garandearjen,
brân- en feiligensalarms, spanning oanwêzich by starters, keamertemperatuer, needwetternivo. It hert fan NEKST-M is ATMEGA 1280 en dit feit is bemoedigend yn termen fan de mooglikheid om jo eigen kit te meitsjen foar spesifike behoeften.

De taak wie ynsteld om in folslein autonoom lokaal ferstjoersysteem te meitsjen foar spesifike behoeften yn 'e koartst mooglike tiid en mei minimale kosten. De basis is in mikrocontroller. Untwikkeling, produksje, makke troch it personiel sels.

It systeem moat wurkje sûnder ôfhinklikens fan sellulêre netwurken, servers, it ynternet en it lisinsjesysteem foar it brûken fan radiofrekwinsjeboarnen, gjin kompjûters brûke yn 'e wurking fan it tafersjoch- en kontrôlesysteem of, op syn heechst, periodyk laptops brûke, sûnder tagong ta objekten foar in lange tiid (6-9 moannen). De netwurkkonfiguraasje hat in radiale struktuer. Gegevens wurde op in stuit sammele en dan stjoerd foar ferwurking fia reguliere kommunikaasjekanalen of as in hurde kopy.

It systeem moat leverje:

  • tafersjoch op de wurking fan pompen ienheden
  • technologyske automatisearring
  • beskerming tsjin de gefolgen fan needomstannichheden
  • need sinjalearring
  • operaasje tiid berekkening
  • it berekkenjen fan de hoemannichte elektrisiteit konsumearre
  • apparatuer temperatuer kontrôle
  • feiligens en fjoer alarm
  • periodike opname op ôfstân fan ynformaasje
  • ûnbekende takomst easken

Wurkomstannichheden:

  • dekking gebiet 1 km².
  • direkte sichtberens tusken objekten
  • temperatuer fan +50 oant -50 C
  • luchtvochtigheid oant 100%
  • biologysk aktive ôfsettings (skimmel, sulfat-ferminderende baktearjes)
  • trilling, net mear, fan masines fan klassen 1-2 neffens GOST ISO 10816-1-97
  • elektromagnetyske omjouwing - skeakeljen fan elektryske motoren mei KT 6053-kontaktors, RVS-DN-softstart-apparatuer, SIEMENS MICROMASTER PID-kontrôleapparatuer, strieling yn it ISM- en GSM-berik neffens de easken foar dizze apparaten, hantlieding foar arc welding on site
  • oermjittige netwurk spanning, koarte-termyn ûnderbrekkings yn macht oanbod, bliksem overvoltages, faze ûnbalâns as in overhead line tried brekt yn 6-10 kV distribúsje netwurken.

Nettsjinsteande sokke strange easken, ymplemintaasje is frij simpel by it oplossen fan it probleem stap foar stap.

Mei alles yn rekken brocht, waard it "Arduino Nano 3.0" board it "harsens" fan it plan. It robotdyn board hat in ATMEGA 328 controller, de nedige 3,3V spanning stabilisator foar
hjoeddeistige 800 mA en converter nei CH340G UART-USB.

As earste binne wurktidentellers makke as de meast aktuele. Earder brûkte yndustriële meters gearstald op PIC's mei in transformatorleaze stroomfoarsjenning mislearre fanwege spanningsstoten binnen in jier fan operaasje. Allinich dejingen dy't ferbûn binne mei selsmakke 5V-voedingsfoarsjenningen bleaunen yntakt. Om de ynstallaasje en de veelzijdigheid fan ferbining te rapperjen, wurdt in sinjaal oer de steat fan 'e ienheden nommen fan' e terminals fan 'e skeakelapparaten, d.w.s. registraasje fan 'e oanwêzigens fan' e 1e faze spanning mei in trije-fase voeding fan 380V. Om te koördinearjen mei de controller, wurdt in intermediate relais mei in 220V winding of in optocoupler gearstald út in LED en in GL5516 photoresistor of in PC817 optocoupler brûkt. Alle opsjes waarden hifke. De LED wurdt oandreaun troch in rjochte spanning mei stroombeheining mei twa SVV22-kondensatoren ûntworpen foar in spanning fan 630V ferbûn yn searje foar feiligens by tafallige testen fan 'e circuits mei in megohmmeter.
Lêzen fan wurktiidlêzingen mei it ST7735S LCD-skerm, realtime gegevensferfier fia radio mei de E01-ML01DP05-module op in frekwinsje fan 2,4 MHz. Dit apparaat befettet de nRF24L01+-chip en de RFX2401C-útstjoer-/ûntfangfersterker,
útfier macht oant 100 mW. Helical antennes ûntworpen foar it winske berik yn 'e online rekkenmasine side. De kar fan antennetype wurdt bepaald troch it útsluten fan 'e ûntfangst fan inkeld reflektearre weagen út omlizzende metalen struktueren. Antenne dielen wurde printe op in 3D printer. De hjoeddeistige tastân fan 'e tellers wurdt opslein yn' e EEPROM fan 'e controller sels en wurdt restaurearre yn gefal fan in ûnferwachte stroomûnderbrekking. Tiid yntervallen foar tellen wurde fersoarge troch de RTC chip DS3231 yn 'e foarm fan in module mei in reservekopy batterij. De stroomfoarsjenning brûkt 3 modules, de eigentlike pulsboarne 220/5V HLK-PM01 600mA, in converter fan 1-5V nei 5V HW-553 и 03962A - batterij controller mei skema beskerming tsjin koartsluting, overdischarge en overcharge. Alle komponinten waarden kocht op 'e Aliexpress-webside.

Bread boardLokaal Autonome Data Acquisition System
4-kanaal teller. D'r binne LC-filters by de yngongen om te beskermjen tsjin ynterferinsje oer in twisted pear kommunikaasjeline. Gegevens oer de steat fan kontrôle objekten wurdt konstant lêzen ien kear per sekonde en werjûn yn kleur op de LCD. Lêzingen wurde bywurke en opnommen yn net-flechtich ûnthâld elke 1 sekonden. 36 sekonden is 36/1 fan in oere, dit is it formaat wêryn de gegevens nedich binne. Elke 100 sekonden. ynformaasje wurdt oerdroegen oer it oantal sekonden fan operaasje foar elke kontrôle ienheid. EEPROM-ûnthâld hat in beheind oantal skriuw-wissyklusen, neffens de fabrikant, 12 kear. De minste opsje is as op syn minst ien sel konstant wurdt bywurke. It folume fan de 100000e teller is 1 bytes, dit is in lang formaat nûmer, 4 tellers, in totaal fan 4 bytes wurdt beset troch ien record. De lingte fan it ûnthâld fan 'e chip is 16 bytes; nei 1024 yngongen fan 64 tellers sil de opname opnij begjinne. Yn 'e EEPROM-bibleteek skriuwt de metoade EEPROM.put net; as de wearde fan 'e sel en de skreaune ynformaasje oerienkomt, sil d'r gjin degradaasje fan 'e sellen wêze. As gefolch, de garandearre ûnthâld operaasje tiid sil wêze mear as 4 jier. De tiid fan mooglik, mar net garandearre wurk kin folle langer wêze.

Circuit diagramLokaal Autonome Data Acquisition System
Programma yn Arduino IDE//12 bytes (328%)

#ynklusyf // Core graphics bibleteek
#ynklusyf // Hardware-spesifike bibleteek
#include
#ynklusyf
#include
#ynklusyf
#ynklusyf
RF24 radio(9, 10); // radioobjekt foar wurkjen mei de RF24-bibleteek,
// en pinnûmers nRF24L01+ (CE, CSN)
#ynklusyf
DS3231 rtc(SDA, SCL);
tiid t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // jo kinne dit ek ferbine mei de Arduino-reset
// yn dat gefal, set dizze #define pin op -1!
//#define TFT_DC 9 // DC=RS=A0 - oantsjuttingsopsjes foar it selektearjen fan in kommando of gegevensregister.
#define TFT_DC 3

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

// Opsje 2: brûk alle pinnen, mar in bytsje stadiger!
#define TFT_SCLK 13 // set dizze op hokker pins jo wolle!
#define TFT_MOSI 11 // set dizze op hokker pins jo wolle!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#ynklusyf

byte shift = 52;
byte pinState;
net ûndertekene lange pomp[4];// array mei 4 sekonden tellerwearden
float m = 3600.0;
unsigned int adres = 0;
int rc;// fariabele foar tellers
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 foar it bewarjen fan foarwerp steaten, 1 - út, 0 - oan.
int start = 0; //

lege opset () {

rtc.begin();
radio.begin(); // Initiate wurk nRF24L01+
radio.setChannel(120); // gegevens kanaal (fan 0 oan 127).
radio.setDataRate(RF24_250KBPS); // gegevens oerdracht rate (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // stjoerder macht (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Iepenje in piip mei in identifier foar gegevens oerdracht

// Om de tiid yn te stellen, uncommentearje de nedige rigels
//rtc.setDOW(1); // Dei fan de wike
//rtc.setTime(21, 20, 0); // Tiid, yn 24 oere opmaak.
//rtc.setDate(29, 10, 2018); // Datum, 29 oktober 2018

tft.initR(INITR_BLACKTAB); // inisjalisearje in ST7735S chip, swarte ljepper
// Brûk dizze initializer (ûnkommentaar) as jo in 1.44" TFT brûke
//tft.initR(INITR_144GREENTAB); // inisjalisearje in ST7735S chip, RED rcB ljepper
tft.setTextWrap(false); // Tastean tekst te rinnen fan rjochter râne
tft.setRotation( 2 ); // foar BLACK PCB en RED tft.setRotation (0) of net.
tft.fillScreen(ST7735_BLACK); // dúdlik skerm

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // software tightening wurket, heech nivo -
// kontrolearre objekten "wurke net", "4" wurdt skreaun oan alle 1 senior havens D, gjin tellen optreedt.

foar (rc = 0; rc < 4; rc++)
{
tft.setCursor (3, rc * 10 + shift); // werjaan fan posysje nûmers fan kontrôle objekten
tft.print(rc + 1);
}

tft.setCursor(12, 0); // útfier 3 rigels fan tekst
tft.println("DEVELOPERS & BUILD"); // om dysels leafsten te priizgjen
tft.setCursor(24, 10); // of kwea auteursrjocht
tft.print("DEVELOPER MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//data weromhelje////////////////////////////////////////////// //////////

foar (z = 0; z <1023; z += 16) {// Iterearret troch alle sellen fan 'e yndustry
// en skriuwt nei in array fan 4 pump fariabelen, 4 bytes foar eltse teller, omdat
// net ûndertekene lange fariabele. D'r binne 4 tellers, ien rekord fan alle 4 nimt 16 bytes.
EEPROM.get(z, pump[0]); // dus, sûnder de for loop, minder folume
EEPROM.get(z+4, pump[1]);
EEPROM.get(z+8, pump[2]);
EEPROM.get(z+12, pump[3]);

// tawizen fan in nije folgjende wearde foar de som fan 4 counters
sumprim = (pomp [0] + pump [1] + pump [2] + pump [3]);

// fergeliket de nije wearde fan 'e som fan 4 tellers yn' e sumprim fariabele mei de foarige wearde yn 'e fariabele
// sumsec en as de foarige som minder is as of gelyk oan de nije som, wurdt de nije grutter of gelyk taskreaun
// sumsec wearde.

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

// en de hjoeddeistige wearde z wurdt tawiisd oan de adresfariabele, z is it adres fan it begjin fan in 16-byte blok fan 4 wearden
// tellers tagelyk opnommen (sûnt by it pollen fan in poarte, wurde alle 8 bits dêrfan tagelyk skreaun,
// ynklusyf ús nedige hege 4 bits fan haven D).
adres = z;
}
}

// wer tagong ta it eeprom-ûnthâld op it adres fan it begjin fan in blok fan 16 bytes fan 4 opnommen tellerwearden
// lêste, i.e. wearden foardat it ôfsluten of opnij opstarte fanwege befriezing. Recording de lêste
// teller wearden yn in array fan 4 fariabelen pomp.

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

adres += 16; // it adres ferheegje foar it skriuwen fan it folgjende blok sûnder de gegevens fan 'e lêste record te oerskriuwen

//ein fan gegevensherstel////////////////////////////////////////// ////////////////

attachInterrupt(0, count, RISING); // pin D2, ynskeakelje interrupts, kom elke sekonde
// pulses út RTC DS3231 út SQW útfier

wdt_enable(WDTO_8S); // start de watchdog timer, start de controller op 'e nij yn gefal fan befriezen, tiid,
// wêrfoar jo it timer-reset-kommando wdt_reset (en foarkom opnij opstarten ûnder normale operaasje - 8 sek.
// foar testen is it net oan te rieden om de wearde op minder dan 8 sekonden yn te stellen. Yn dit gefal wurdt de timer by foarkar weromset
// jerking, en it bart elke sekonde.

}

leechte loop () {
// lege syklus, hjir sil wêze kontrôle oer de iepen-fase operaasje fan de elektryske motor
}

ûnjildich oantal () {

tft.setTextColor(ST7735_WHITE); // set it lettertype kleur
t = rtc.getTime(); // lês tiid
tft.setCursor(5, 120); // it ynstellen fan de rinnerke posysje
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // it tiidútfiergebiet wiskje
tft.print(rtc.getTimeStr()); // útfier klok lêzingen

wdt_reset(); // reset de wachthûn elke syklus, i.e. twadde

foar (rc = 0; rc <4; rc ++) // begjin fan 'e syklus foar it kontrolearjen fan it neilibjen fan' e ynfierstatus
// haven bits nei de foarige lêzen steat fan haven D bits
{
pinState = (PIND >> 4) & (b << rc);

if (pumrcounter [rc] != pinState) {// en as it net oerienkomt, dan
pumrcounter[rc] = pinState; // tawizen fan de haven bit status fariabele in nije wearde 1/0
}
// oantsjutting fan de steat fan kleur kontrôle objekten
// BLAU is in lytse glitch fan it besteande skerm (of bibleteek?), RGB en BGR wurde trochinoar mingd.
if (pinState == (b << rc)) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // foar leech nivo tellen feroarje GREEN nei BLAU
} Else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // foar leech nivo tellen feroarje BLAUW nei GREEN
pump [rc] += 1; // add 1 sekonde oan de wurktiid teller
}
}

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

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // wiskjen fan de wurktiid werjefte gebiet
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // en datums

tft.setCursor(60, 120); // it ynstellen fan de rinnerke posysje
tft.print(rtc.getDateStr()); // werjaan de datum op it LCD-skerm

foar (rc = 0; rc < 4; rc ++) //útfier wurkoeren yn totaal, tsienden en
{
tft.setCursor (30, rc * 10 + shift); // hûndertste fan in oere mei in skermferskowing mei 10 piksels omleech
tft.println(pomp [rc] / m);
}

// skriuwe "rauwe" wurktiden wearden (yn sekonden) nei EEPROM ///////////////////////////////////////////////

foar (rc = 0; rc < 4; rc++)
{
EEPROM.put(adres, pomp [rc]);
adres += sizeof(float); // fergrutsje de skriuwadresfariabele
}
}

// stjoer gegevens oer de radio kanaal út gegevens oanjaan hoefolle bytes moatte wurde ferstjoerd.
if ((k == 6 ) || (k == 18 ) || (k == 30 )) {

net ûndertekene lange gegevens;

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

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

In pear oantekeningen oan 'e ein. Tellen bart op in leech logysk nivo by de yngongen.

Pull-up wjerstannen R2-R5 binne 36 kOhm foar de opsje mei photoresistors GL5516. Yn it gefal fan in fototransistor optocoupler en estafette, ynsteld op 4,7-5,1 kOhm. De Arduino Nano v3.0 bootloader waard ferfongen troch de Arduino Uno mei de TL866A-programmeur foar de juste wurking fan 'e watchdog-timer. De lonten wurde korrizjearre om te operearjen by spanningen boppe 4,3 V. De eksterne reset circuit R6 C3 waard net brûkt. Yn it foarbyldprogramma komt de stjoerfrekwinsje net oerien mei it net lisinsearre berik; it 2,4 MHz-berik is beheind ta frekwinsjes 2400.0-2483.5 MHz.

It berik fan 'e E01-ML01DP05-stjoerder is 2400-2525 MHz. De bânbreedte fan ien kanaal is 1 MHz, by it ynstellen fan de snelheid as "RF24_2MBPS" it oantsjutte radio.setChannel(120) kanaal en de folgjende sil beset wurde, d.w.s. de band sil wêze 2 MHz.

Boarne: www.habr.com

Add a comment