Sistem pengumpulan data otonom lokal

Perusahaan kasebut tuku kiriman pemantauan NEKST-M, diprodhuksi ing njero negara dening Next Technologies. Kanggo mesthekake visualisasi operasi unit pompa,
weker geni lan keamanan, ngarsane voltase ing wiwitan, suhu kamar, tingkat banyu darurat. Jantung NEKST-M yaiku ATMEGA 1280 lan kasunyatan iki nyemangati babagan kemungkinan nggawe kit dhewe kanggo kabutuhan tartamtu.

Tugas kasebut disetel kanggo nggawe sistem pengiriman lokal kanthi otonom kanggo kabutuhan tartamtu ing wektu sing paling cendhak lan kanthi biaya minimal. Basis yaiku mikrokontroler. Pangembangan, manufaktur, digawe dening staf dhewe.

Sistem kasebut kudu beroperasi tanpa gumantung ing jaringan seluler, server, Internet lan sistem lisensi kanggo nggunakake sumber frekuensi radio, ora nggunakake komputer ing operasi sistem ngawasi lan kontrol utawa, paling akeh, nggunakake laptop kanthi periodik, tanpa akses menyang obyek kanggo dangu (6-9 sasi). Konfigurasi jaringan nduweni struktur radial. Data dikumpulake ing sawijining titik banjur dikirim kanggo diproses liwat saluran komunikasi biasa utawa minangka salinan hard.

Sistem kudu nyedhiyani:

  • ngawasi operasi unit pumping
  • otomatisasi teknologi
  • pangayoman saka jalaran saka kahanan darurat
  • sinyal darurat
  • pitungan wektu operasi
  • ngitung jumlah listrik sing dikonsumsi
  • kontrol suhu peralatan
  • keamanan lan weker geni
  • ngrekam remot informasi periodik
  • syarat mangsa dingerteni

Kondisi kerja:

  • wilayah jangkoan 1 km persegi.
  • visibilitas langsung antarane obyek
  • suhu saka +50 nganti -50 C
  • Kelembapan nganti 100%
  • Endapan aktif biologis (jamur, bakteri pereduksi sulfat)
  • getaran, ora luwih, saka mesin kelas 1-2 miturut GOST ISO 10816-1-97
  • lingkungan elektromagnetik - ngoper motor listrik kanthi kontaktor KT 6053, peralatan wiwitan alus RVS-DN, peralatan kontrol SIEMENS MICROMASTER PID, radiasi ing kisaran ISM lan GSM miturut syarat kanggo piranti kasebut, welding busur manual ing situs
  • voltase jaringan gedhe banget, interruptions short-term ing sumber daya, overvoltages kilat, boten seimbang kalebet phase nalika kabel line overhead break ing jaringan distribusi 6-10 kV.

Senadyan syarat sing ketat, implementasine cukup prasaja nalika ngrampungake masalah kanthi langkah.

Nganggep kabeh, papan "Arduino Nano 3.0" dadi "otak" rencana kasebut. Papan robotdyn wis ATMEGA 328 controller, perlu 3,3V voltase stabilizer kanggo
saiki 800 mA lan konverter kanggo CH340G UART-USB.

Kaping pisanan, counter jam operasi digawe minangka sing paling anyar. Meter industri sing sadurunge digunakake dipasang ing PIC kanthi sirkuit sumber daya tanpa transformator gagal amarga lonjakan voltase sajrone setahun operasi. Mung sing disambungake nggunakake sumber daya 5V krasan tetep utuh. Kanggo nyepetake instalasi lan versatility sambungan, sinyal babagan negara unit dijupuk saka terminal piranti ngoper, i.e. registrasi anané voltase fase 1 kanthi catu daya telung fase 380V. Kanggo koordinasi karo controller, relay penengah karo nduwurke tumpukan 220V utawa optocoupler dumadi saka LED lan photoresistor GL5516 utawa optocoupler PC817 digunakake. Kabeh opsi dites. LED didhukung dening voltase sing dibenerake kanthi watesan saiki nggunakake rong kapasitor SVV22 sing dirancang kanggo voltase 630V sing disambungake kanthi seri kanggo safety sajrone uji coba sirkuit kanthi megohmmeter.
Maca wacan wektu operasi nggunakake layar LCD ST7735S, transmisi data wektu nyata liwat radio nggunakake modul E01-ML01DP05 kanthi frekuensi 2,4 MHz. Piranti iki ngemot chip nRF24L01+ lan amplifier ngirim / nampa RFX2401C,
daya output nganti 100 mW. Antena helical dirancang kanggo sawetara sing dikarepake ing kalkulator online situs. Pilihan saka jinis antena ditemtokake dening pangecualian saka reception gelombang singly dibayangke saka struktur logam lingkungan. Bagean antena dicithak ing printer 3D. Ing negara saiki counters disimpen ing EEPROM saka controller dhewe lan dibalèkaké ing acara saka mati daya sing ora dikarepke. Interval wektu kanggo pancacahan diwenehake dening chip RTC DS3231 ing wangun modul karo baterei serep. Catu daya nggunakake 3 modul, sumber pulsa nyata 220/5V HLK-PM01 600mA, konverter saka 1-5V dadi 5V HW-553 и 03962A - controller baterei karo skema pangayoman marang short circuit, overdischarge lan overcharge. Kabeh komponen dituku ing situs web Aliexpress.

Papan rotiSistem pengumpulan data otonom lokal
4-saluran counter. Ana saringan LC ing input kanggo nglindhungi saka gangguan liwat jalur komunikasi pasangan bengkong. Data babagan obyek kontrol terus diwaca sapisan saben detik lan ditampilake kanthi warna ing LCD. Wacan dianyari lan direkam ing memori non-molah malih saben 1 detik. 36 detik yaiku 36/1 jam, iki minangka format sing dibutuhake data. Saben 100 detik. informasi dikirim babagan jumlah detik operasi kanggo saben unit kontrol. memori EEPROM wis nomer winates siklus nulis-mbusak, miturut Produsèn, 12 kaping. Pilihan sing paling awon yaiku nalika paling ora siji sel terus dianyari. Volume saka counter 100000 iku 1 bait, iki nomer format dawa, 4 counters, total 4 bait dikuwasani dening siji rekaman. Dawane memori chip yaiku 16 bait; sawise 1024 entri saka 64 counter, rekaman bakal diwiwiti maneh. Ing perpustakaan EEPROM, metode EEPROM.put ora nulis, yen nilai sel lan informasi sing ditulis cocog, ora bakal ana degradasi sel. Akibaté, wektu operasi memori sing dijamin bakal luwih saka 4 taun. Wektu kerja sing bisa nanging ora dijamin bisa luwih suwe.

Diagram sirkuitSistem pengumpulan data otonom lokal
Program ing Arduino IDE//12 bita (328%)

#kalebu // Pustaka grafis inti
#kalebu // Pustaka khusus hardware
#kakup
#kalebu
#kakup
#kalebu
#kalebu
Radio RF24(9, 10); // obyek radio kanggo nggarap perpustakaan RF24,
// lan nomer pin nRF24L01+ (CE, CSN)
#kalebu
DS3231 rtc(SDA, SCL);
Wektu t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // sampeyan uga bisa nyambung menyang Arduino reset
// ing kasus iki, nyetel pin #define iki kanggo -1!
//#define TFT_DC 9 // DC=RS=A0 - opsi sebutan kanggo milih printah utawa data register.
#define TFT_DC 3

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

// Opsi 2: gunakake pin apa wae nanging luwih alon!
#define TFT_SCLK 13 // atur iki dadi pin sing disenengi!
#define TFT_MOSI 11 // nyetel iki dadi pin apa wae sing disenengi!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#kalebu

shift bait = 52;
byte pinState;
pump dawa unsigned [4]; // array karo 4 nilai counter detik
ngambang m = 3600.0;
alamat int unsigned = 0;
int rc; // variabel kanggo counter
unsigned long sumprim = 0;
unsigned long sumsec = 0;
bita i = 0;
bita k = 34;
unsigned int z = 0;
bita b = B00000001;
byte pumrcounter[4]; // array kanggo nyimpen negara obyek, 1 - mati, 0 - ing.
int wiwitan = 0; //

persiyapan batal () {

rtc.begin();
radio.begin(); // Miwiti karya nRF24L01+
radio.setChannel(120); // saluran data (saka 0 kanggo 127).
radio.setDataRate(RF24_250KBPS); // tingkat transfer data (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // daya pemancar (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Mbukak pipa karo pengenal kanggo transfer data

// Kanggo nyetel wektu, uncomment baris perlu
//rtc.setDOW(1); // Dina minggu
//rtc.setTime(21, 20, 0); // Wektu, ing format 24 jam.
//rtc.setDate(29, 10, 2018); // Tanggal, 29 Oktober 2018

tft.initR(INITR_BLACKTAB); // initialize chip ST7735S, tab ireng
// Gunakake initializer iki (uncomment) yen sampeyan nggunakake 1.44 "TFT
//tft.initR(INITR_144GREENTAB); // initialize chip ST7735S, RED rcB tab
tft.setTextWrap(palsu); // Ngidini teks mbukak pinggir tengen
tft.setRotation(2); // kanggo BLACK PCB lan RED tft.setRotation (0) utawa ora.
tft.fillScreen(ST7735_BLACK); // layar cetha

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // pengetatan piranti lunak digunakake, tingkat dhuwur -
// obyek kontrol "ora bisa", "4" ditulis kanggo kabeh 1 bandar senior D, ora pancacahan dumadi.

kanggo (rc = 0; rc < 4; rc++)
{
tft.setCursor (3, rc * 10 + shift); // nampilake nomer posisi obyek kontrol
tft.print(rc + 1);
}

tft.setCursor(12, 0); // output 3 baris teks
tft.println("PENGEMBANG & BANGUN"); // kanggo memuji dhewe wong sing ditresnani
tft.setCursor(24, 10); // utawa hak cipta ala
tft.print("DEVELOPER MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

////////////////////////////////////////////// ///////////

kanggo (z = 0; z <1023; z += 16) {// Iterates liwat kabeh sel industri
// lan nulis kanggo Uploaded 4 variabel pump, 4 bait kanggo saben counter, amarga
// variabel dawa unsigned. Ana 4 counters, siji rekaman kabeh 4 njupuk 16 bita.
EEPROM.get(z, pump[0]); // dadi, tanpa kanggo daur ulang, volume kurang
EEPROM.get(z+4, pump[1]);
EEPROM.get(z+8, pump[2]);
EEPROM.get(z+12, pump[3]);

// nemtokake nilai sabanjuré anyar kanggo jumlah 4 counters
sumprim = (pompa [0] + pompa [1] + pompa [2] + pompa [3]);

// mbandhingaké Nilai anyar saka jumlah 4 counters ing variabel sumprim karo nilai sadurungé ing variabel
// sumsec lan yen jumlah sadurunge kurang saka utawa padha karo jumlah anyar, luwih gedhe utawa padha karo sing anyar ditugasake
// nilai sumsec.

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

// lan nilai saiki z ditugasake menyang variabel alamat, z minangka alamat wiwitan blok 16-byte saka 4 nilai.
// counter direkam ing wektu sing padha (wiwit nalika polling port, kabeh 8 bit ditulis bebarengan,
// kalebu kita perlu dhuwur 4 bit port D).
alamat = z;
}
}

// maneh ngakses memori eeprom ing alamat wiwitan blok 16 byte saka 4 nilai counter sing direkam
// pungkasan, i.e. nilai sadurunge mateni utawa urip maneh amarga beku. Ngrekam paling anyar
// nilai counter menyang array saka 4 variabel pump.

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

alamat += 16; // nambah alamat kanggo nulis blok sabanjure tanpa nimpa data rekaman pungkasan

//mburi pemulihan data //////////////////////////////////////// /////////////////

attachInterrupt(0, count, RISING); // pin D2, ngaktifake interrupts, teka saben detik
// pulsa saka RTC DS3231 saka output SQW

wdt_enable(WDTO_8S); // miwiti timer watchdog, urip maneh controller yen beku, wektu,
// sing sampeyan kudu ngetokake printah reset timer wdt_reset (lan aja rebooting sajrone operasi normal - 8 detik.
// kanggo tes ora dianjurake kanggo nyetel nilai kurang saka detik 8. Ing kasus iki, timer direset luwih apik.
// jerking, lan mengkono saben detik.

}

void loop () {
// siklus kosong, kene bakal ana kontrol liwat mbukak-phase operasi motor listrik
}

void count() {

tft.setTextColor(ST7735_WHITE); // nyetel werna font
t = rtc.getTime(); // maca wektu
tft.setCursor(5, 120); // nyetel posisi kursor
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // ngresiki area output wektu
tft.print(rtc.getTimeStr()); // maca jam output

wdt_reset(); // ngreset watchdog saben siklus, IE detik

kanggo (rc = 0; rc <4; rc ++) // wiwitan siklus kanggo mriksa kepatuhan negara input
// bit port menyang negara maca sadurunge port D bit
{
pinState = (PIND >> 4) & ( b << rc );

yen (pumrcounter [rc]!= pinState) {// lan yen ora cocog, banjur
pumrcounter[rc] = pinState; // nemtokake variabel status bit port nilai anyar 1/0
}
// pratondo saka negara obyek kontrol werna
// BLUE minangka kesalahan cilik saka layar sing ana (utawa perpustakaan?), RGB lan BGR dicampur.
if (pinState == (b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // kanggo tingkat kurang pancacahan ngganti GREEN kanggo BLUE
} Else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // kanggo tingkat kurang pancacahan ngganti BLUE kanggo GREEN
pompa [rc] += 1; // nambah 1 detik kanggo counter wektu operasi
}
}

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

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // ngresiki area tampilan wektu operasi
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // lan tanggal

tft.setCursor(60, 120); // nyetel posisi kursor
tft.print(rtc.getDateStr()); // nampilake tanggal ing layar LCD

kanggo (rc = 0; rc <4; rc ++) //jam operasi output kabeh, sepuluh lan
{
tft.setCursor ( 30, rc * 10 + shift ); // atus jam kanthi owah-owahan layar mudhun 10 piksel
tft.println(pompa [rc] / m);
}

// nulis nilai jam operasi "mentah" (ing detik) menyang EEPROM ///////////////////////////

kanggo (rc = 0; rc < 4; rc++)
{
EEPROM.put(alamat, pompa [rc]);
alamat += sizeof(float); // nambah variabel alamat nulis
}
}

// ngirim data liwat saluran radio saka data nuduhake carane akeh bita kudu dikirim.
yen ((k == 6 ) || (k == 18 ) || (k == 30 )) {

data dawa unsigned;

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

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

A sawetara cathetan ing mburi. Ngitung dumadi ing tingkat logis sing kurang ing input.

Pull-up resistances R2-R5 punika 36 kOhm kanggo pilihan karo photoresistors GL5516. Ing kasus optocoupler phototransistor lan relay, disetel kanggo 4,7-5,1 kOhm. Arduino Nano v3.0 bootloader diganti karo Arduino Uno nggunakake programmer TL866A kanggo operasi bener saka timer watchdog. Sekring didandani kanggo operate ing voltase ndhuwur 4,3 V. Circuit reset external R6 C3 ora digunakake. Ing program sampel, frekuensi pemancar ora cocog karo kisaran sing ora dilisensi; kisaran 2,4 MHz diwatesi karo frekuensi 2400.0-2483.5 MHz.

Jangkauan pemancar E01-ML01DP05 yaiku 2400-2525 MHz. Bandwidth saka siji saluran 1 MHz, nalika nyetel kacepetan minangka "RF24_2MBPS" radio kasebut.setChannel (120) saluran lan sabanjuré bakal dikuwasani, i.e. band bakal 2 MHz.

Source: www.habr.com

Add a comment