Sistem pengumpulan data autonomi tempatan

Syarikat itu membeli jawatan pemantauan NEKST-M, yang dihasilkan di dalam negara oleh Next Technologies. Untuk memastikan visualisasi operasi unit pengepaman,
penggera kebakaran dan keselamatan, kehadiran voltan pada permulaan, suhu bilik, paras air kecemasan. Nadi NEKST-M ialah ATMEGA 1280 dan fakta ini menggalakkan dari segi kemungkinan mencipta kit anda sendiri untuk keperluan tertentu.

Tugas itu ditetapkan untuk mencipta sistem penghantaran tempatan autonomi sepenuhnya untuk keperluan khusus dalam masa yang sesingkat mungkin dan pada kos yang minimum. Asasnya ialah mikropengawal. Pembangunan, pembuatan, dicipta oleh kakitangan sendiri.

Sistem ini mesti beroperasi tanpa bergantung pada rangkaian selular, pelayan, Internet dan sistem pelesenan untuk penggunaan sumber frekuensi radio, tidak menggunakan komputer dalam pengendalian sistem pemantauan dan kawalan atau, paling banyak, menggunakan komputer riba secara berkala, tanpa akses kepada objek untuk masa yang lama (6-9 bulan). Konfigurasi rangkaian mempunyai struktur jejari. Data dikumpul pada satu ketika dan kemudian dihantar untuk diproses melalui saluran komunikasi biasa atau sebagai salinan cetak.

Sistem mesti menyediakan:

  • memantau operasi unit pengepaman
  • automasi teknologi
  • perlindungan daripada akibat keadaan kecemasan
  • isyarat kecemasan
  • pengiraan masa operasi
  • mengira jumlah tenaga elektrik yang digunakan
  • kawalan suhu peralatan
  • keselamatan dan penggera kebakaran
  • rakaman jauh berkala maklumat
  • keperluan masa hadapan yang tidak diketahui

Keadaan kerja:

  • kawasan liputan 1 km persegi.
  • penglihatan langsung antara objek
  • suhu dari +50 hingga -50 C
  • kelembapan sehingga 100%
  • deposit aktif secara biologi (kulat, bakteria penurun sulfat)
  • getaran, tiada lagi, mesin kelas 1-2 mengikut GOST ISO 10816-1-97
  • persekitaran elektromagnet - pensuisan motor elektrik dengan penyentuh KT 6053, peralatan mula lembut RVS-DN, peralatan kawalan SIEMENS MICROMASTER PID, sinaran dalam julat ISM dan GSM mengikut keperluan untuk peranti ini, kimpalan arka manual di tapak
  • voltan rangkaian yang berlebihan, gangguan jangka pendek dalam bekalan kuasa, lebihan voltan kilat, ketidakseimbangan fasa apabila wayar talian atas putus dalam rangkaian pengedaran 6-10 kV.

Walaupun keperluan ketat sedemikian, pelaksanaannya agak mudah apabila menyelesaikan masalah langkah demi langkah.

Mengambil kira segala-galanya, papan "Arduino Nano 3.0" menjadi "otak" rancangan itu. Papan robotdyn mempunyai pengawal ATMEGA 328, penstabil voltan 3,3V yang diperlukan untuk
800 mA semasa dan penukar kepada CH340G UART-USB.

Pertama sekali, kaunter waktu operasi diwujudkan sebagai yang paling terkini. Meter industri yang digunakan sebelum ini dipasang pada PIC dengan litar bekalan kuasa tanpa pengubah gagal disebabkan lonjakan voltan dalam tempoh setahun beroperasi. Hanya yang disambungkan menggunakan bekalan kuasa 5V buatan sendiri kekal utuh. Untuk mempercepatkan pemasangan dan kepelbagaian sambungan, isyarat tentang keadaan unit diambil dari terminal peranti pensuisan, i.e. pendaftaran kehadiran voltan fasa pertama dengan bekalan kuasa tiga fasa 1V. Untuk menyelaraskan dengan pengawal, geganti perantaraan dengan penggulungan 380V atau optocoupler yang terdiri daripada LED dan photoresistor GL220 atau optocoupler PC5516 digunakan. Semua pilihan telah diuji. LED dikuasakan oleh voltan diperbetulkan dengan pengehadan arus menggunakan dua kapasitor SVV817 yang direka untuk voltan 22V yang disambungkan secara bersiri untuk keselamatan semasa ujian litar secara tidak sengaja dengan megohmmeter.
Membaca bacaan masa operasi menggunakan skrin LCD ST7735S, penghantaran data masa nyata melalui radio menggunakan modul E01-ML01DP05 pada frekuensi 2,4 MHz. Peranti ini mengandungi cip nRF24L01+ dan penguat hantar/terima RFX2401C,
kuasa keluaran sehingga 100 mW. Antena heliks direka untuk julat yang dikehendaki dalam kalkulator dalam talian laman web ini. Pilihan jenis antena ditentukan oleh pengecualian penerimaan gelombang pantulan tunggal daripada struktur logam sekeliling. Bahagian antena dicetak pada pencetak 3D. Keadaan semasa kaunter disimpan dalam EEPROM pengawal itu sendiri dan dipulihkan sekiranya berlaku gangguan bekalan elektrik yang tidak dijangka. Selang masa untuk mengira disediakan oleh cip RTC DS3231 dalam bentuk modul dengan bateri sandaran. Bekalan kuasa menggunakan 3 modul, sumber nadi sebenar 220/5V HLK-PM01 600mA, penukar daripada 1-5V kepada 5V HW-553 ΠΈ 03962A - pengawal bateri dengan skim perlindungan terhadap litar pintas, overdischarge dan overcharge. Semua komponen telah dibeli di laman web Aliexpress.

Papan rotiSistem pengumpulan data autonomi tempatan
Kaunter 4 saluran. Terdapat penapis LC pada input untuk melindungi daripada gangguan melalui talian komunikasi pasangan terpiuh. Data tentang keadaan objek kawalan sentiasa dibaca sekali sesaat dan dipaparkan dalam warna pada LCD. Bacaan dikemas kini dan direkodkan dalam memori tidak meruap setiap 1 saat. 36 saat ialah 36/1 daripada sejam, ini ialah format di mana data diperlukan. Setiap 100 saat. maklumat dihantar tentang bilangan saat operasi bagi setiap unit kawalan. Memori EEPROM mempunyai bilangan kitaran padam-tulis yang terhad, menurut pengilang, 12 kali. Pilihan yang paling teruk ialah apabila sekurang-kurangnya satu sel sentiasa dikemas kini. Jumlah pembilang pertama ialah 100000 bait, ini adalah nombor format panjang, 1 pembilang, sejumlah 4 bait diduduki oleh satu rekod. Panjang memori cip ialah 4 bait; selepas 16 entri daripada 1024 pembilang, rakaman akan dimulakan semula. Dalam pustaka EEPROM, kaedah EEPROM.put tidak menulis; jika nilai sel dan maklumat yang ditulis sepadan, tidak akan berlaku kemerosotan sel. Akibatnya, masa operasi memori yang dijamin akan melebihi 64 tahun. Masa kerja yang mungkin tetapi tidak dijamin boleh menjadi lebih lama.

Gambar rajah litarSistem pengumpulan data autonomi tempatan
Program dalam Arduino IDE//12 bait (328%)

#termasuk // Pustaka grafik teras
#termasuk // Pustaka khusus perkakasan
#sertakan
#termasuk
#sertakan
#termasuk
#termasuk
Radio RF24(9, 10); // objek radio untuk bekerja dengan perpustakaan RF24,
// dan nombor pin nRF24L01+ (CE, CSN)
#termasuk
DS3231 rtc(SDA, SCL);
Masa t;

//#define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // anda juga boleh menyambungkannya ke tetapan semula Arduino
// dalam kes ini, tetapkan pin #define ini kepada -1!
//#define TFT_DC 9 // DC=RS=A0 - pilihan penetapan untuk memilih arahan atau daftar data.
#define TFT_DC 3

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

// Pilihan 2: gunakan sebarang pin tetapi perlahan sedikit!
#define TFT_SCLK 13 // tetapkan ini kepada sebarang pin yang anda suka!
#define TFT_MOSI 11 // tetapkan ini kepada sebarang pin yang anda suka!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#termasuk

anjakan bait = 52;
byte pinState;
pam panjang yang tidak ditandatangani[4];// tatasusunan dengan nilai pembilang 4 saat
terapung m = 3600.0;
alamat int tidak ditandatangani = 0;
int rc;// pembolehubah untuk pembilang
sumrim panjang yang tidak ditandatangani = 0;
sumsec panjang tidak ditandatangani = 0;
bait i = 0;
bait k = 34;
int z yang tidak ditandatangani = 0;
bait b = B00000001;
bait pumrcounter[4]; // tatasusunan untuk menyimpan keadaan objek, 1 - mati, 0 - hidup.
int mula = 0; //

batal persediaan () {

rtc.begin();
radio.begin(); // Mulakan kerja nRF24L01+
radio.setChannel(120); // saluran data (dari 0 hingga 127).
radio.setDataRate(RF24_250KBPS); // kadar pemindahan data (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS).
radio.setPALevel(RF24_PA_MAX); // kuasa pemancar (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,
// RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openWritingPipe(0xAABBCCDD11LL); // Buka paip dengan pengecam untuk pemindahan data

// Untuk menetapkan masa, nyahkomen baris yang diperlukan
//rtc.setDOW(1); // Hari dalam seminggu
//rtc.setTime(21, 20, 0); // Masa, dalam format 24 jam.
//rtc.setDate(29, 10, 2018); // Tarikh, 29 Oktober 2018

tft.initR(INITR_BLACKTAB); // memulakan cip ST7735S, tab hitam
// Gunakan pemula ini (nyah ulasan) jika anda menggunakan TFT 1.44".
//tft.initR(INITR_144GREENTAB); // memulakan cip ST7735S, tab rcB MERAH
tft.setTextWrap(false); // Benarkan teks lari dari tepi kanan
tft.setRotation( 2 ); // untuk BLACK PCB dan RED tft.setRotation(0) atau tidak.
tft.fillScreen(ST7735_BLACK); // skrin jelas

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // pengetatan perisian berfungsi, tahap tinggi -
// objek terkawal "tidak berfungsi", "4" ditulis ke semua 1 port kanan D, tiada pengiraan berlaku.

untuk ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // memaparkan nombor kedudukan objek kawalan
tft.print(rc + 1);
}

tft.setCursor(12, 0); // keluarkan 3 baris teks
tft.println("PEMBANGUN & BINA"); // untuk memuji diri sendiri orang tersayang
tft.setCursor(24, 10); // atau hak cipta jahat
tft.print("PEMBANGUN MM");
tft.setCursor(28, 20);
tft.print("BUILD-ER DD");

//pemulihan data////////////////////////////////////////////// ///////////

untuk ( z = 0; z < 1023; z += 16 ) { // Berulang melalui semua sel industri
//dan menulis kepada tatasusunan 4 pembolehubah pam, 4 bait untuk setiap pembilang, kerana
// pembolehubah panjang tidak ditandatangani. Terdapat 4 pembilang, satu rekod daripada semua 4 mengambil 16 bait.
EEPROM.get(z, pam[0]); // jadi, tanpa gelung for, kurang volum
EEPROM.get(z+4, pam[1]);
EEPROM.get(z+8, pam[2]);
EEPROM.get(z+12, pam[3]);

// memberikan nilai seterusnya yang baharu untuk jumlah 4 pembilang
sumprim = (pam [0] + pam [1] + pam [2] + pam [3]);

// membandingkan nilai baharu hasil tambah 4 pembilang dalam pembolehubah sumprim dengan nilai sebelumnya dalam pembolehubah
// sumsec dan jika jumlah sebelumnya kurang daripada atau sama dengan jumlah baru, lebih besar atau sama baru ditetapkan
// nilai sumsec.

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

//dan nilai semasa z diberikan kepada pembolehubah alamat, z ialah alamat permulaan blok 16-bait 4 nilai
// pembilang direkodkan pada masa yang sama (sejak semasa mengundi port, kesemua 8 bitnya ditulis serentak,
// termasuk 4 bit port D tinggi yang diperlukan kami).
alamat = z;
}
}

// sekali lagi mengakses memori eeprom pada alamat permulaan blok 16 bait daripada 4 nilai pembilang yang direkodkan
// terakhir, i.e. nilai sebelum menutup atau but semula kerana pembekuan. Rakaman terkini
// nilai balas ke dalam susunan 4 pam pembolehubah.

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

alamat += 16; //menambahkan alamat untuk menulis blok seterusnya tanpa menimpa data rekod terakhir

//tamat pemulihan data///////////////////////////////////////// //////////////////

attachInterrupt(0, count, RISING); // pin D2, dayakan gangguan, datang setiap saat
// denyutan daripada RTC DS3231 daripada output SQW

wdt_enable(WDTO_8S); // mulakan pemasa pengawas, but semula pengawal sekiranya berlaku pembekuan, masa,
// yang mana anda perlu mengeluarkan arahan tetapan semula pemasa wdt_reset( dan elakkan but semula semasa operasi biasa - 8 saat.
// untuk ujian tidak disyorkan untuk menetapkan nilai kepada kurang daripada 8 saat. Dalam kes ini, pemasa ditetapkan semula sebaiknya
// jerking, dan ia berlaku setiap saat.

}

gelung kosong () {
// kitaran kosong, di sini akan ada kawalan ke atas operasi fasa terbuka motor elektrik
}

void count() {

tft.setTextColor(ST7735_WHITE); // tetapkan warna fon
t = rtc.getTime(); // membaca masa
tft.setCursor(5, 120); // menetapkan kedudukan kursor
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // mengosongkan kawasan keluaran masa
tft.print(rtc.getTimeStr()); // bacaan jam keluaran

wdt_reset(); // tetapkan semula pengawas setiap kitaran, iaitu saat

untuk (rc = 0; rc < 4; rc ++) // permulaan kitaran untuk menyemak pematuhan keadaan input
// bit port ke keadaan baca sebelumnya bit port D
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // dan jika tidak sepadan, maka
pumrcounter[rc] = pinState; // memberikan pembolehubah status bit port nilai baharu 1/0
}
// petunjuk keadaan objek kawalan warna
// BIRU ialah gangguan kecil pada skrin sedia ada (atau perpustakaan?), RGB dan BGR bercampur-campur.
jika (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // untuk pengiraan aras rendah tukar HIJAU kepada BIRU
} Lain {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // untuk pengiraan aras rendah tukar BIRU kepada HIJAU
pam [rc] += 1; // tambah 1 saat pada kaunter masa operasi
}
}

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

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // mengosongkan kawasan paparan masa operasi
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // dan tarikh

tft.setCursor(60, 120); // menetapkan kedudukan kursor
tft.print(rtc.getDateStr()); // paparkan tarikh pada skrin LCD

untuk (rc = 0; rc < 4; rc ++) //output waktu operasi secara keseluruhan, persepuluh dan
{
tft.setCursor ( 30, rc * 10 + shift ); // seperseratus jam dengan anjakan skrin turun sebanyak 10 piksel
tft.println(pam [rc] / m);
}

// menulis nilai jam operasi "mentah" (dalam saat) ke EEPROM ///////////////////////////

untuk (rc = 0; rc < 4; rc++)
{
EEPROM.put(alamat, pam [rc]);
alamat += sizeof(float); // menambah pembolehubah alamat tulis
}
}

// menghantar data melalui saluran radio daripada data yang menunjukkan bilangan bait yang perlu dihantar.
jika ((k == 6 ) || (k == 18 ) || (k == 30 )) {

data panjang yang tidak ditandatangani;

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

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

Sedikit nota di penghujungnya. Pengiraan berlaku pada tahap logik yang rendah pada input.

Rintangan tarik naik R2-R5 ialah 36 kOhm untuk pilihan dengan photoresistors GL5516. Dalam kes optogandingan fototransistor dan geganti, tetapkan kepada 4,7-5,1 kOhm. Pemuat but Arduino Nano v3.0 telah digantikan dengan Arduino Uno menggunakan pengaturcara TL866A untuk operasi pemasa pengawas yang betul. Fius dibetulkan untuk beroperasi pada voltan melebihi 4,3 V. Litar tetapan semula luaran R6 C3 tidak digunakan. Dalam program sampel, frekuensi pemancar tidak sepadan dengan julat tidak berlesen; julat 2,4 MHz dihadkan kepada frekuensi 2400.0-2483.5 MHz.

Julat pemancar E01-ML01DP05 ialah 2400-2525 MHz. Lebar jalur satu saluran ialah 1 MHz, apabila menetapkan kelajuan sebagai "RF24_2MBPS" saluran radio.setChannel(120) yang ditentukan dan yang seterusnya akan diduduki, i.e. jalurnya ialah 2 MHz.

Sumber: www.habr.com

Tambah komen