Lokal na autonomous na sistema ng pagkolekta ng data

Bumili ang kumpanya ng mga post sa pagsubaybay sa NEKST-M, na ginawa sa loob ng bansa ng Next Technologies. Upang matiyak ang visualization ng pagpapatakbo ng mga pumping unit,
mga alarma sa sunog at seguridad, presensya ng boltahe sa mga starter, temperatura ng silid, pang-emergency na antas ng tubig. Ang puso ng NEKST-M ay ATMEGA 1280 at ang katotohanang ito ay nakapagpapatibay sa mga tuntunin ng posibilidad na lumikha ng iyong sariling kit para sa mga partikular na pangangailangan.

Ang gawain ay itinakda upang lumikha ng isang ganap na autonomous na lokal na dispatch system para sa mga partikular na pangangailangan sa pinakamaikling posibleng panahon at sa minimal na gastos. Ang batayan ay isang microcontroller. Pag-unlad, pagmamanupaktura, na nilikha ng mga tauhan mismo.

Dapat gumana ang system nang walang pag-asa sa mga cellular network, server, Internet at sistema ng paglilisensya para sa paggamit ng mga mapagkukunan ng dalas ng radyo, hindi gumamit ng mga computer sa pagpapatakbo ng sistema ng pagsubaybay at kontrol o, higit sa lahat, pana-panahong gumagamit ng mga laptop, nang walang access sa mga bagay sa mahabang panahon (6-9 na buwan). Ang pagsasaayos ng network ay may radial na istraktura. Kinokolekta ang data sa isang punto at pagkatapos ay ipinadala para sa pagproseso sa pamamagitan ng regular na mga channel ng komunikasyon o bilang isang hard copy.

Ang sistema ay dapat magbigay ng:

  • pagsubaybay sa operasyon ng mga pumping unit
  • teknolohikal na automation
  • proteksyon mula sa mga kahihinatnan ng mga kondisyong pang-emergency
  • emergency signaling
  • pagkalkula ng oras ng pagpapatakbo
  • pagkalkula ng dami ng kuryenteng natupok
  • kontrol ng temperatura ng kagamitan
  • seguridad at alarma sa sunog
  • panaka-nakang malayuang pagtatala ng impormasyon
  • hindi kilalang mga kinakailangan sa hinaharap

Mga kondisyon sa pagtatrabaho:

  • saklaw na lugar 1 sq.
  • direktang visibility sa pagitan ng mga bagay
  • temperatura mula +50 hanggang -50 C
  • halumigmig hanggang 100%
  • biologically active deposits (amag, sulfate-reducing bacteria)
  • panginginig ng boses, wala na, ng mga makina ng mga klase 1-2 ayon sa GOST ISO 10816-1-97
  • electromagnetic na kapaligiran - paglipat ng mga de-koryenteng motor na may KT 6053 contactor, RVS-DN soft start equipment, SIEMENS MICROMASTER PID control equipment, radiation sa ISM at GSM range ayon sa mga kinakailangan para sa mga device na ito, manual arc welding on site
  • labis na boltahe ng network, panandaliang pagkagambala sa suplay ng kuryente, sobrang boltahe ng kidlat, hindi balanseng bahagi kapag naputol ang wire sa overhead sa 6-10 kV na mga network ng pamamahagi.

Sa kabila ng mahigpit na mga kinakailangan, ang pagpapatupad ay medyo simple kapag nilutas ang problema sa hakbang-hakbang.

Isinasaalang-alang ang lahat, ang "Arduino Nano 3.0" board ay naging "utak" ng plano. Ang robotdyn board ay mayroong ATMEGA 328 controller, ang kinakailangang 3,3V voltage stabilizer para sa
kasalukuyang 800 mA at converter sa CH340G UART-USB.

Una sa lahat, ang mga counter ng oras ng pagpapatakbo ay ginawa bilang ang pinaka-napapapanahon. Ang mga dating ginamit na pang-industriya na metro na naka-assemble sa mga PIC na may transformerless power supply circuit ay nabigo dahil sa mga pagtaas ng boltahe sa loob ng isang taon ng operasyon. Tanging ang mga nakakonekta gamit ang mga homemade 5V power supply ang nanatiling buo. Upang mapabilis ang pag-install at versatility ng koneksyon, ang isang senyas tungkol sa estado ng mga yunit ay kinuha mula sa mga terminal ng mga switching device, i.e. pagpaparehistro ng pagkakaroon ng 1st phase boltahe na may tatlong-phase power supply ng 380V. Upang makipag-ugnayan sa controller, ginagamit ang isang intermediate relay na may 220V winding o isang optocoupler na binubuo ng LED at isang GL5516 photoresistor o isang PC817 optocoupler. Sinubukan ang lahat ng mga opsyon. Ang LED ay pinapagana ng isang rectified boltahe na may kasalukuyang limitasyon gamit ang dalawang SVV22 capacitors na idinisenyo para sa isang boltahe ng 630V konektado sa serye para sa kaligtasan sa panahon ng aksidenteng pagsubok ng mga circuit na may isang megohmmeter.
Pagbabasa ng mga pagbabasa sa oras ng pagpapatakbo gamit ang ST7735S LCD screen, real-time na paghahatid ng data sa pamamagitan ng radyo gamit ang E01-ML01DP05 module sa frequency na 2,4 MHz. Ang device na ito ay naglalaman ng nRF24L01+ chip at ang RFX2401C transmit/receive amplifier,
kapangyarihan ng output hanggang sa 100 mW. Helical antenna na idinisenyo para sa nais na hanay sa online na calculator сайта. Ang pagpili ng uri ng antena ay natutukoy sa pamamagitan ng pagbubukod ng pagtanggap ng mga singly reflected waves mula sa nakapalibot na mga istrukturang metal. Ang mga bahagi ng antena ay naka-print sa isang 3D printer. Ang kasalukuyang estado ng mga counter ay naka-imbak sa EEPROM ng controller mismo at ibinabalik sa kaganapan ng isang hindi inaasahang pagkawala ng kuryente. Ang mga agwat ng oras para sa pagbibilang ay ibinibigay ng RTC chip DS3231 sa anyo ng isang module na may backup na baterya. Gumagamit ang power supply ng 3 module, ang aktwal na pinagmulan ng pulso 220/5V HLK-PM01 600mA, isang converter mula 1-5V hanggang 5V HW-553 ΠΈ 03962A - controller ng baterya na may pamamaraan proteksyon laban sa short circuit, overdischarge at overcharge. Ang lahat ng mga bahagi ay binili sa Aliexpress website.

Bread boardLokal na autonomous na sistema ng pagkolekta ng data
4-channel na counter. May mga LC filter sa mga input upang maprotektahan laban sa interference sa isang twisted pair na linya ng komunikasyon. Ang data sa estado ng mga kontrol na bagay ay patuloy na binabasa isang beses bawat segundo at ipinapakita sa kulay sa LCD. Ang mga pagbabasa ay ina-update at naitala sa non-volatile memory bawat 1 segundo. Ang 36 segundo ay 36/1 ng isang oras, ito ang format kung saan kinakailangan ang data. Bawat 100 segundo. ipinapadala ang impormasyon tungkol sa bilang ng mga segundo ng operasyon para sa bawat control unit. Ang memorya ng EEPROM ay may limitadong bilang ng mga write-erase cycle, ayon sa manufacturer, 12 beses. Ang pinakamasamang opsyon ay kapag hindi bababa sa isang cell ang patuloy na ina-update. Ang volume ng 100000st counter ay 1 bytes, ito ay isang mahabang format na numero, 4 na counter, isang kabuuang 4 bytes ay inookupahan ng isang record. Ang haba ng memorya ng chip ay 16 bytes; pagkatapos ng 1024 na entry ng 64 na counter, magsisimulang muli ang pagre-record. Sa EEPROM library, ang EEPROM.put method ay hindi nagsusulat, kung ang halaga ng cell at ang impormasyong isinusulat ay magkatugma, hindi magkakaroon ng degradation ng mga cell. Bilang resulta, ang garantisadong oras ng pagpapatakbo ng memorya ay higit sa 4 taon. Ang oras ng posible ngunit hindi garantisadong trabaho ay maaaring mas matagal.

Diagram ng circuitLokal na autonomous na sistema ng pagkolekta ng data
Programa sa Arduino IDE//12 byte (328%)

#isama // Core graphics library
#isama // library na partikular sa hardware
# isama
#isama
# isama
#isama
#isama
RF24 radio(9, 10); // radio object para sa pagtatrabaho sa RF24 library,
// at mga pin number nRF24L01+ (CE, CSN)
#isama
DS3231 rtc(SDA, SCL);
Oras t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // maaari mo ring ikonekta ito sa Arduino reset
// kung saan, itakda itong #define pin sa -1!
//#define TFT_DC 9 // DC=RS=A0 - mga opsyon sa pagtatalaga para sa pagpili ng command o data register.
#define TFT_DC 3

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

// Opsyon 2: gumamit ng anumang mga pin ngunit mas mabagal nang kaunti!
#define TFT_SCLK 13 // itakda ang mga ito sa anumang pin na gusto mo!
#define TFT_MOSI 11 // itakda ang mga ito sa anumang pin na gusto mo!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#isama

byte shift = 52;
byte pinState;
unsigned long pump[4];// array na may 4 na segundong counter value
lumutang m = 3600.0;
unsigned int address = 0;
int rc;// variable para sa mga counter
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 para sa pag-iimbak ng mga estado ng object, 1 - off, 0 - on.
int simula = 0; //

walang bisa ang pag-setup () {

rtc.begin();
radio.begin(); // Simulan ang trabaho nRF24L01+
radio.setChannel(120); // channel ng data (mula 0 hanggang 127).
radio.setDataRate(RF24_250KBPS); // rate ng paglilipat ng data (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // kapangyarihan ng transmitter (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Magbukas ng pipe na may identifier para sa paglilipat ng data

// Para itakda ang oras, alisin sa komento ang mga kinakailangang linya
//rtc.setDOW(1); // Araw
//rtc.setTime(21, 20, 0); // Oras, sa 24 na oras na format.
//rtc.setDate(29, 10, 2018); // Petsa, Oktubre 29, 2018

tft.initR(INITR_BLACKTAB); // magpasimula ng ST7735S chip, itim na tab
// Gamitin ang initializer na ito (uncomment) kung gumagamit ka ng 1.44" TFT
//tft.initR(INITR_144GREENTAB); // magpasimula ng ST7735S chip, RED rcB tab
tft.setTextWrap(false); // Payagan ang teksto na tumakbo sa kanang gilid
tft.setRotation( 2 ); // para sa BLACK PCB at RED tft.setRotation(0) o hindi.
tft.fillScreen(ST7735_BLACK); // malinaw na screen

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // gumagana ang software tightening, mataas na antas -
// kinokontrol na mga bagay "hindi gumagana", "4" ay nakasulat sa lahat ng 1 na senior port D, walang pagbibilang na nagaganap.

para sa ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // pagpapakita ng mga numero ng posisyon ng mga control object
tft.print(rc + 1);
}

tft.setCursor(12, 0); // output 3 linya ng teksto
tft.println("MGA DEVELOPERS & BUILD"); // para purihin ang iyong sarili mahal sa buhay
tft.setCursor(24, 10); // o masamang copyright
tft.print("DEVELOPER MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//pagbawi ng data////////////////////////////////////////// ///////////

para sa ( z = 0; z < 1023; z += 16 ) {/ // Umuulit sa lahat ng mga cell ng industriya
//at nagsusulat sa hanay ng 4 na variable ng bomba, 4 na byte para sa bawat counter, dahil
// unsigned long variable. Mayroong 4 na counter, isang record ng lahat ng 4 ay tumatagal ng 16 bytes.
EEPROM.get(z, pump[0]); // kaya, kung wala ang for loop, mas kaunting volume
EEPROM.get(z+4, pump[1]);
EEPROM.get(z+8, pump[2]);
EEPROM.get(z+12, pump[3]);

// pagtatalaga ng bagong susunod na halaga para sa kabuuan ng 4 na counter
sumprim = (pump [0] + pump [1] + pump [2] + pump [3]);

// inihahambing ang bagong halaga ng kabuuan ng 4 na counter sa sumprim variable sa dating value sa variable
// sumsec at kung ang dating sum ay mas mababa sa o katumbas ng bagong sum, ang bagong mas malaki o katumbas ay itatalaga
// halaga ng sumsec.

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

//at ang kasalukuyang halaga na z ay itinalaga sa variable ng address, ang z ay ang address ng simula ng isang 16-byte na bloke ng 4 na halaga
// mga counter na naitala sa parehong oras (mula noong pagboto ng isang port, lahat ng 8 bits nito ay nakasulat nang sabay-sabay,
// kasama ang aming kinakailangang mataas na 4 bits ng port D).
address = z;
}
}

// muling ina-access ang memorya ng eeprom sa address ng simula ng isang bloke ng 16 bytes ng 4 na naitala na mga halaga ng counter
// huli, ibig sabihin. mga halaga bago isara o i-reboot dahil sa pagyeyelo. Pagre-record ng pinakabago
// counter values ​​sa isang array ng 4 na variable na 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; //pagdaragdag ng address para sa pagsusulat ng susunod na bloke nang hindi inu-overwrite ang data ng huling tala

//pagtatapos ng pagbawi ng data///////////////////////////////////////// //////////////////

attachInterrupt(0, count, RISING); // pin D2, paganahin ang mga interrupts, dumating bawat segundo
// pulses mula sa RTC DS3231 mula sa SQW output

wdt_enable(WDTO_8S); // simulan ang watchdog timer, i-reboot ang controller sa kaso ng pagyeyelo, oras,
// kung saan kailangan mong mag-isyu ng timer reset command wdt_reset( at iwasan ang pag-reboot sa panahon ng normal na operasyon - 8 sec.
// para sa mga pagsubok hindi inirerekomenda na itakda ang halaga sa mas mababa sa 8 segundo. Sa kasong ito, mas mainam na i-reset ang timer
// jerking, at nangyayari ito bawat segundo.

}

void loop () {
// walang laman na cycle, dito magkakaroon ng kontrol sa open-phase operation ng electric motor
}

void count() {

tft.setTextColor(ST7735_WHITE); // itakda ang kulay ng font
t = rtc.getTime(); // oras ng pagbasa
tft.setCursor(5, 120); // pagtatakda ng posisyon ng cursor
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // nililinis ang lugar ng output ng oras
tft.print(rtc.getTimeStr()); // output clock readings

wdt_reset(); // i-reset ang watchdog bawat cycle, ibig sabihin, segundo

para sa (rc = 0; rc < 4; rc ++) // simula ng cycle para sa pagsuri sa pagsunod ng estado ng input
// port bits sa nakaraang read state ng port D bits
{
pinState = (PIND >> 4) & ( b << rc );

kung (pumrcounter [rc] != pinState) { // at kung hindi tumutugma, kung gayon
pumrcounter[rc] = pinState; // pagtatalaga ng port bit status variable ng bagong value 1/0
}
// indikasyon ng estado ng mga color control object
// Ang BLUE ay isang maliit na glitch ng kasalukuyang screen (o library?), RGB at BGR ay pinaghalo.
kung (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // para sa mababang antas ng pagbibilang baguhin ang BERDE sa BLUE
} Iba pa {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // para sa mababang antas ng pagbibilang baguhin ang BLUE sa BERDE
pump [rc] += 1; // magdagdag ng 1 segundo sa operating time counter
}
}

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

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // ni-clear ang operating time display area
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // at mga petsa

tft.setCursor(60, 120); // pagtatakda ng posisyon ng cursor
tft.print(rtc.getDateStr()); // ipakita ang petsa sa LCD screen

para sa (rc = 0; rc < 4; rc ++) // mga oras ng pagpapatakbo ng output sa kabuuan, ikasampu at
{
tft.setCursor ( 30, rc * 10 + shift ); // hundredths ng isang oras na may screen shift pababa ng 10 pixels
tft.println(pump [rc] / m);
}

// pagsulat ng "raw" na mga halaga ng oras ng pagpapatakbo (sa mga segundo) sa EEPROM ///////////////////////////

para sa (rc = 0; rc < 4; rc++)
{
EEPROM.put(address, pump [rc]);
address += sizeof(float); // dagdagan ang variable ng write address
}
}

// magpadala ng data sa channel ng radyo mula sa data na nagsasaad kung gaano karaming mga byte ang dapat ipadala.
kung ((k == 6 ) || (k == 18 ) || (k == 30 )) {

hindi pinirmahang mahabang data;

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

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

Ilang tala sa dulo. Nagaganap ang pagbibilang sa mababang antas ng lohikal sa mga input.

Ang mga pull-up na resistensya R2-R5 ay 36 kOhm para sa opsyon na may mga photoresistor na GL5516. Sa kaso ng isang phototransistor optocoupler at relay, itakda sa 4,7-5,1 kOhm. Ang Arduino Nano v3.0 bootloader ay pinalitan ng Arduino Uno gamit ang TL866A programmer para sa tamang operasyon ng watchdog timer. Ang mga piyus ay itinatama upang gumana sa mga boltahe na higit sa 4,3 V. Ang panlabas na reset circuit na R6 C3 ay hindi ginamit. Sa sample na programa, ang frequency ng transmitter ay hindi tumutugma sa hindi lisensyadong hanay; ang 2,4 MHz range ay limitado sa mga frequency na 2400.0-2483.5 MHz.

Ang saklaw ng E01-ML01DP05 transmitter ay 2400-2525 MHz. Ang bandwidth ng isang channel ay 1 MHz, kapag itinatakda ang bilis bilang "RF24_2MBPS" ang tinukoy na radio.setChannel(120) channel at ang susunod na isa ay sasakupin, i.e. ang banda ay magiging 2 MHz.

Pinagmulan: www.habr.com

Magdagdag ng komento