Sistema ta' ġbir ta' data awtonoma lokali

Il-kumpanija xtrat postijiet ta 'monitoraġġ NEKST-M, prodotti domestikament minn Next Technologies. Biex tiġi żgurata l-viżwalizzazzjoni tal-operat tal-unitajiet tal-ippumpjar,
allarmi tan-nar u tas-sigurtà, preżenza ta 'vultaġġ fuq starters, temperatura tal-kamra, livell tal-ilma ta' emerġenza. Il-qalba ta 'NEKST-M hija ATMEGA 1280 u dan il-fatt huwa inkoraġġanti f'termini tal-possibbiltà li toħloq il-kit tiegħek għal bżonnijiet speċifiċi.

Il-kompitu ġie stabbilit biex tinħoloq sistema ta’ dispaċċ lokali kompletament awtonoma għal bżonnijiet speċifiċi fl-iqsar żmien possibbli u bi spiża minima. Il-bażi hija mikrokontrollur. Żvilupp, manifattura, maħluqa mill-persunal innifsu.

Is-sistema trid topera mingħajr dipendenza fuq netwerks ċellulari, servers, l-Internet u s-sistema ta’ liċenzjar għall-użu ta’ riżorsi ta’ frekwenza tar-radju, ma tużax kompjuters fit-tħaddim tas-sistema ta’ monitoraġġ u kontroll jew, l-iktar, tuża laptops perjodikament, mingħajr aċċess għal oġġetti għal żmien twil (6-9 xhur). Il-konfigurazzjoni tan-netwerk għandha struttura radjali. Id-dejta tinġabar f'punt wieħed u mbagħad tintbagħat għall-ipproċessar permezz ta' kanali ta' komunikazzjoni regolari jew bħala kopja stampata.

Is-sistema għandha tipprovdi:

  • il-monitoraġġ tat-tħaddim tal-unitajiet tal-ippumpjar
  • awtomazzjoni teknoloġika
  • protezzjoni mill-konsegwenzi ta’ kundizzjonijiet ta’ emerġenza
  • sinjali ta' emerġenza
  • kalkolu tal-ħin tat-tħaddim
  • tikkalkula l-ammont ta’ elettriku kkunsmat
  • kontroll tat-temperatura tat-tagħmir
  • sigurtà u allarm tan-nar
  • reġistrazzjoni perjodika mill-bogħod ta' informazzjoni
  • rekwiżiti futuri mhux magħrufa

Kundizzjonijiet tax-xogħol:

  • żona ta 'kopertura 1 sq km.
  • viżibilità diretta bejn l-oġġetti
  • temperatura minn +50 sa -50 C
  • umdità sa 100%
  • depożiti bijoloġikament attivi (moffa, batterji li jnaqqsu s-sulfat)
  • vibrazzjoni, mhux aktar, ta 'magni tal-klassijiet 1-2 skond GOST ISO 10816-1-97
  • ambjent elettromanjetiku - bidla ta 'muturi elettriċi b'kuntatturi KT 6053, tagħmir ta' startjar artab RVS-DN, tagħmir ta 'kontroll SIEMENS MICROMASTER PID, radjazzjoni fil-firxa ISM u GSM skont ir-rekwiżiti għal dawn l-apparati, iwweldjar bl-ark manwali fuq il-post
  • vultaġġ eċċessiv tan-netwerk, interruzzjonijiet għal żmien qasir fil-provvista tal-enerġija, vultaġġi żejda tas-sajjetti, żbilanċ tal-fażi meta wajer tal-linja overhead jinkiser f'netwerks ta 'distribuzzjoni 6-10 kV.

Minkejja rekwiżiti stretti bħal dawn, l-implimentazzjoni hija pjuttost sempliċi meta ssolvi l-problema pass pass.

Meta wieħed iqis kollox, il-bord "Arduino Nano 3.0" sar il-"moħħ" tal-pjan. Il-bord robotdyn għandu kontrollur ATMEGA 328, l-istabbilizzatur tal-vultaġġ 3,3V meħtieġ għal
kurrenti 800 mA u konvertitur għal CH340G UART-USB.

L-ewwelnett, inħolqu counters tas-sigħat operattivi bħala l-aktar aġġornati. Miters industrijali użati qabel immuntati fuq PICs b'ċirkwit ta 'provvista ta' enerġija mingħajr transformer fallew minħabba żidiet fil-vultaġġ fi żmien sena ta 'tħaddim. Dawk biss konnessi bl-użu ta 'provvisti ta' enerġija homemade 5V baqgħu intatti. Biex tħaffef l-installazzjoni u l-versatilità tal-konnessjoni, jittieħed sinjal dwar l-istat tal-unitajiet mit-terminals tal-apparati tal-iswiċċjar, i.e. reġistrazzjoni tal-preżenza tal-vultaġġ tal-ewwel fażi bi provvista ta 'enerġija bi tliet fażijiet ta' 1V. Biex tikkoordina mal-kontrollur, jintuża relay intermedju b'koljatura ta '380V jew optocoupler magħmul minn LED u photoresistor GL220 jew optocoupler PC5516. L-għażliet kollha ġew ittestjati. L-LED huwa mħaddem b'vultaġġ rettifikat b'limitazzjoni tal-kurrent bl-użu ta 'żewġ capacitors SVV817 iddisinjati għal vultaġġ ta' 22V konnessi f'serje għas-sigurtà waqt l-ittestjar aċċidentali taċ-ċirkwiti b'megohmmeter.
Qari tal-qari tal-ħin tat-tħaddim bl-użu tal-iskrin LCD ST7735S, trasmissjoni ta 'dejta f'ħin reali permezz tar-radju bl-użu tal-modulu E01-ML01DP05 fi frekwenza ta' 2,4 MHz. Dan l-apparat fih iċ-ċippa nRF24L01+ u l-RFX2401C li jittrasmetti/jirċievi amplifikatur,
qawwa tal-ħruġ sa 100 mW. Antenni helical iddisinjati għall-firxa mixtieqa fil-kalkolatur onlajn is-sit. L-għażla tat-tip ta 'antenna hija ddeterminata mill-esklużjoni tar-riċeviment ta' mewġ rifless waħedhom minn strutturi tal-metall tal-madwar. Il-partijiet tal-antenna huma stampati fuq printer 3D. L-istat attwali tal-counters huwa maħżun fl-EEPROM tal-kontrollur innifsu u jiġi rrestawrat fil-każ ta 'qtugħ mhux mistenni tad-dawl. L-intervalli tal-ħin għall-għadd huma pprovduti miċ-ċippa RTC DS3231 fil-forma ta 'modulu b'batterija ta' backup. Il-provvista tal-enerġija tuża 3 moduli, is-sors tal-polz attwali 220/5V HLK-PM01 600mA, konvertitur minn 1-5V għal 5V HW-553 и 03962A - kontrollur tal-batterija bil skema protezzjoni kontra short circuit, overdischarge u overcharge. Il-komponenti kollha nxtraw fuq il-websajt ta 'Aliexpress.

Bord tal-ħobżSistema ta' ġbir ta' data awtonoma lokali
Counter b'4 kanali. Hemm filtri LC fl-inputs biex jipproteġu kontra interferenza fuq linja ta 'komunikazzjoni b'par mibrum. Id-dejta dwar l-istat tal-oġġetti ta 'kontroll tinqara kontinwament darba kull sekonda u tintwera bil-kulur fuq l-LCD. Il-qari jiġi aġġornat u rreġistrat f'memorja mhux volatili kull 1 sekonda. 36 sekonda hija 36/1 ta 'siegħa, dan huwa l-format li fih id-dejta hija meħtieġa. Kull 100 sek. tiġi trażmessa informazzjoni dwar in-numru ta' sekondi ta' tħaddim għal kull unità ta' kontroll. Il-memorja EEPROM għandha numru limitat ta 'ċikli ta' kitba-tħassir, skond il-manifattur, 12 darba. L-agħar għażla hija meta mill-inqas ċellula waħda tkun qed tiġi aġġornata kontinwament. Il-volum tal-100000 counter huwa 1 bytes, dan huwa numru ta 'format twil, 4 counters, total ta' 4 bytes huwa okkupat minn rekord wieħed. It-tul tal-memorja taċ-ċippa huwa 16 bytes; wara 1024 daħla ta '64 counters, ir-reġistrazzjoni se tibda mill-ġdid. Fil-librerija EEPROM, il-metodu EEPROM.put ma jiktebx; jekk il-valur taċ-ċellula u l-informazzjoni li qed tinkiteb jaqblu, ma jkun hemm l-ebda degradazzjoni taċ-ċelloli. Bħala riżultat, il-ħin tat-tħaddim tal-memorja garantit se jkun aktar minn 4 snin. Il-ħin ta 'xogħol possibbli iżda mhux garantit jista' jkun ħafna itwal.

Dijagramma taċ-ċirkwitSistema ta' ġbir ta' data awtonoma lokali
Programm f'Arduino IDE//12 bytes (328%)

#inkludi // Librerija tal-grafika ewlenija
#inkludi // Librerija speċifika għall-ħardwer
#inkludu
#inkludi
#inkludu
#inkludi
#inkludi
Radju RF24 (9, 10); // oġġett tar-radju għal xogħol mal-librerija RF24,
// u numri tal-pin nRF24L01+ (CE, CSN)
#inkludi
DS3231 rtc(SDA, SCL);
Ħin t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // tista 'wkoll tikkonnettja dan mar-reset Arduino
// f'liema każ, issettja dan il-pin #define għal -1!
//#define TFT_DC 9 // DC=RS=A0 - għażliet ta’ nomina għall-għażla ta’ kmand jew reġistru tad-dejta.
#define TFT_DC 3

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

// Għażla 2: uża xi labar iżda ftit aktar bil-mod!
#define TFT_SCLK 13 // issettja dawn biex ikunu xi pinnijiet li tixtieq!
#define TFT_MOSI 11 // issettja dawn biex ikunu kwalunkwe pinn li tixtieq!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#inkludi

byte shift = 52;
byte pinState;
pompa twila mhux iffirmata[4];// array b'valuri ta' kontro ta' 4 sekondi
galleġġjant m = 3600.0;
indirizz int mhux iffirmat = 0;
int rc;// varjabbli għall-counters
sumprim twil mhux iffirmat = 0;
sumsec twil mhux iffirmat = 0;
byte i = 0;
byte k = 34;
unsigned int z = 0;
byte b = B00000001;
byte pumrcounter[4]; // array għall-ħażna ta' stati ta' oġġetti, 1 - off, 0 - mixgħul.
int start = 0; //

setup vojt () {

rtc.begin();
radju.begin(); // Nibda ħidma nRF24L01+
radio.setChannel(120); // kanal tad-dejta (minn 0 sa 127).
radio.setDataRate(RF24_250KBPS); // rata tat-trasferiment tad-dejta (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // qawwa tat-trasmettitur (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Iftaħ pajp b'identifikatur għat-trasferiment tad-dejta

// Biex tissettja l-ħin, neħħi l-kumment tal-linji meħtieġa
//rtc.setDOW(1); // Jum il-ġimgħa
//rtc.setTime(21, 20, 0); // Ħin, f'format ta' 24 siegħa.
//rtc.setDate(29, 10, 2018); // Data, 29 ta’ Ottubru 2018

tft.initR(INITR_BLACKTAB); // inizjalizza ċippa ST7735S, tab iswed
// Uża dan inizjalizzatur (uncommment) jekk qed tuża 1.44" TFT
//tft.initR(INITR_144GREENTAB); // Inizjalizza ċippa ST7735S, RED rcB tab
tft.setTextWrap(falza); // Ħalli t-test joħroġ mit-tarf tal-lemin
tft.setRotation( 2 ); // għal PCB ISWED u AĦMAR tft.setRotation(0) jew le.
tft.fillScreen(ST7735_BLACK); // skrin ċar

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // issikkar tas-softwer qed jaħdem, livell għoli -
// oġġetti kkontrollati "ma jaħdmux", "4" jinkiteb lill-1 portijiet anzjani D, ma jseħħ l-ebda għadd.

għal ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // turi numri ta' pożizzjoni ta' oġġetti ta' kontroll
tft.print (rc + 1);
}

tft.setCursor(12, 0); // joħroġ 3 linji ta' test
tft.println("ŻVILUPPURI U BINI"); // biex ifaħħar lilek innifsek maħbubin
tft.setCursor(24, 10); // jew awtur ħażin
tft.print("DEVELOPER MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//irkupru tad-data//////////////////////////////////////////////////////////////////////////// ///////////

għal ( z = 0; z < 1023; z += 16 ) { // Itenni fiċ-ċelloli kollha tal-industrija
//u jikteb fuq firxa ta '4 varjabbli tal-pompa, 4 bytes għal kull counter, għaliex
// varjabbli twil mhux iffirmat. Hemm 4 counters, rekord wieħed tal-4 kollha jieħu 16-il byte.
EEPROM.get(z, pompa[0]); // hekk, mingħajr il-for loop, inqas volum
EEPROM.get(z+4, pompa[1]);
EEPROM.get(z+8, pompa[2]);
EEPROM.get(z+12, pompa[3]);

// jassenja valur ġdid li jmiss għas-somma ta '4 counters
sumprim = (pompa [0] + pompa [1] + pompa [2] + pompa [3]);

// iqabbel il-valur il-ġdid tas-somma ta’ 4 counters fil-varjabbli tas-sumprim mal-valur preċedenti fil-varjabbli
// sumsec u jekk is-somma preċedenti hija inqas minn jew ugwali għas-somma l-ġdida, tiġi assenjata l-ġdida akbar jew ugwali
// valur tas-sumsec.

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

//u l-valur kurrenti z huwa assenjat għall-varjabbli ta 'l-indirizz, z huwa l-indirizz tal-bidu ta' blokka ta '16-il byte ta' 4 valuri
// counters irreġistrati fl-istess ħin (peress li meta jivvutaw port, it-8 bits kollha tiegħu jinkitbu fl-istess ħin,
// inklużi l-4 bits għolja meħtieġa tagħna tal-port D).
indirizz = z;
}
}

// għal darb'oħra aċċess għall-memorja eeprom fl-indirizz tal-bidu ta' blokka ta' 16-il byte ta' 4 valuri tal-counter irreġistrati
// l-aħħar, i.e. valuri qabel ma tintefa jew terġa 'tibda minħabba l-iffriżar. Tirreġistra l-aħħar
// kontro valuri f'firxa ta 'pompa 4 varjabbli.

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

indirizz += 16; //inżidu l-indirizz għall-kitba tal-blokk li jmiss mingħajr ma tissostitwixxi d-dejta tal-aħħar rekord

//tmiem l-irkupru tad-data///////////////////////////////////////////// //////////////////

attachInterrupt(0, għadd, Jogħla); // pin D2, jippermettu l-interruzzjonijiet, jiġu kull sekonda
// impulsi minn RTC DS3231 mill-output SQW

wdt_enable(WDTO_8S); // ibda l-watchdog timer, reboot il-kontrollur f'każ ta 'iffriżar, ħin,
// li għalih trid toħroġ il-kmand ta' reset tat-timer wdt_reset (u tevita li terġa 'tibda waqt it-tħaddim normali - 8 sek.
// għat-testijiet mhux rakkomandat li l-valur jiġi stabbilit għal inqas minn sekondi 8. F'dan il-każ, it-tajmer jiġi reset preferibbilment
// jerking, u jiġri kull sekonda.

}

linja vojta () {
// ċiklu vojt, hawn se jkun hemm kontroll fuq l-operat tal-fażi miftuħa tal-mutur elettriku
}

għadd null () {

tft.setTextColor(ST7735_WHITE); // issettja l-kulur tat-tipa
t = rtc.getTime (); // aqra l-ħin
tft.setCursor(5, 120); // tissettja l-pożizzjoni tal-cursor
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // ikklerjar iż-żona tal-output tal-ħin
tft.print(rtc.getTimeStr()); // qari tal-arloġġ tal-ħruġ

wdt_reset (); // reset il-watchdog kull ċiklu, jiġifieri t-tieni

għal (rc = 0; rc < 4; rc ++) // bidu taċ-ċiklu għall-iċċekkjar tal-konformità tal-istat tal-input
// port bits għall-istat ta' qari preċedenti tal-port D bits
{
pinState = (PIND >> 4) & ( b << rc );

jekk (pumrcounter [rc] != pinState) { // u jekk ma jaqbilx, allura
pumrcounter[rc] = pinState; // jassenja l-varjabbli tal-istatus tal-bit tal-port valur ġdid 1/0
}
// indikazzjoni tal-istat tal-oġġetti tal-kontroll tal-kulur
// BLUE huwa glitch żgħir ta 'l-iskrin eżistenti (jew librerija?), RGB u BGR huma mħallta.
jekk (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // għal għadd ta' livell baxx ibdel l-AĦDAR għal BLUE
} Inkella {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // għal għadd ta' livell baxx ibdel BLUE għal AĦDAR
pompa [rc] += 1; // żid 1 sekonda mal-counter tal-ħin tat-tħaddim
}
}

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

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // ikklerjar iż-żona tal-wiri tal-ħin tat-tħaddim
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // u dati

tft.setCursor(60, 120); // tissettja l-pożizzjoni tal-cursor
tft.print(rtc.getDateStr()); // turi d-data fuq l-iskrin LCD

għal (rc = 0; rc < 4; rc ++) //output sigħat ta' tħaddim b'mod sħiħ, minn għaxra u
{
tft.setCursor ( 30, rc * 10 + shift ); // mijiet ta' siegħa bi skrin shift 'l isfel b'10 pixels
tft.println(pompa [rc] / m);
}

// kitba ta' valuri ta' sigħat ta' tħaddim "nejjin" (f'sekondi) fl-EEPROM ///////////////////////////////

għal (rc = 0; rc < 4; rc++)
{
EEPROM.put(indirizz, pompa [rc]);
indirizz += sizeof(float); // inkrementa l-varjabbli tal-indirizz tal-kitba
}
}

// tibgħat data fuq il-kanal tar-radju minn data li tindika kemm għandhom jintbagħtu bytes.
jekk ((k == 6 ) || (k == 18 ) || (k == 30 )) {

data twila mhux iffirmata;

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

għal (i = 0; i < 4; i++) {
data = pompa [i ];
radio.write( &data, sizeof(data));
}
}
}

Ftit noti fl-aħħar. L-għadd iseħħ f'livell loġiku baxx fl-inputs.

Ir-reżistenzi tal-ġibda R2-R5 huma 36 kOhm għall-għażla b'fotoreżisturi GL5516. Fil-każ ta 'phototransistor optocoupler u relay, issettjat għal 4,7-5,1 kOhm. Il-bootloader Arduino Nano v3.0 ġie sostitwit bl-Arduino Uno bl-użu tal-programmer TL866A għat-tħaddim korrett tal-watchdog timer. Il-fjusijiet huma kkoreġuti biex jaħdmu f'vultaġġi 'l fuq minn 4,3 V. Iċ-ċirkwit ta' reset estern R6 C3 ma ntużax. Fil-programm tal-kampjun, il-frekwenza tat-trasmettitur ma tikkorrispondix mal-medda mhux liċenzjata; il-medda ta '2,4 MHz hija limitata għal frekwenzi 2400.0-2483.5 MHz.

Il-firxa tat-trasmettitur E01-ML01DP05 hija 2400-2525 MHz. Il-bandwidth ta 'kanal wieħed huwa 1 MHz, meta tissettja l-veloċità bħala "RF24_2MBPS" il-kanal speċifikat radio.setChannel(120) u dak li jmiss se jkun okkupat, i.e. il-medda se tkun 2 MHz.

Sors: www.habr.com

Żid kumment