Sistem pengumpulan data otonom lokal

Perusahaan membeli pos pemantauan NEKST-M, yang diproduksi di dalam negeri oleh Next Technologies. Untuk memastikan visualisasi pengoperasian unit pompa,
alarm kebakaran dan keamanan, tegangan starter, suhu ruangan, ketinggian air darurat. Inti dari NEKST-M adalah ATMEGA 1280 dan fakta ini menggembirakan dalam hal kemungkinan membuat kit Anda sendiri untuk kebutuhan spesifik.

Tugasnya ditetapkan untuk menciptakan sistem pengiriman lokal yang sepenuhnya otonom untuk kebutuhan spesifik dalam waktu sesingkat mungkin dan dengan biaya minimal. Basisnya adalah mikrokontroler. Pengembangan, manufaktur, dibuat oleh staf itu sendiri.

Sistem harus beroperasi tanpa ketergantungan pada jaringan seluler, server, Internet dan sistem perizinan penggunaan sumber daya frekuensi radio, tidak menggunakan komputer dalam pengoperasian sistem pemantauan dan pengendalian atau paling banyak menggunakan laptop secara berkala, tanpa akses ke objek dalam waktu lama (6-9 bulan). Konfigurasi jaringan memiliki struktur radial. Data dikumpulkan pada satu titik dan kemudian dikirim untuk diproses melalui saluran komunikasi reguler atau sebagai salinan cetak.

Sistem harus menyediakan:

  • memantau pengoperasian unit pompa
  • otomatisasi teknologi
  • perlindungan dari akibat kondisi darurat
  • isyarat darurat
  • perhitungan waktu operasi
  • menghitung jumlah listrik yang dikonsumsi
  • kontrol suhu peralatan
  • keamanan dan alarm kebakaran
  • pencatatan informasi jarak jauh secara berkala
  • kebutuhan masa depan yang tidak diketahui

Kondisi kerja:

  • area cakupan 1 km persegi.
  • visibilitas langsung antar objek
  • suhu dari +50 hingga -50 C
  • kelembaban hingga 100%
  • endapan yang aktif secara biologis (jamur, bakteri pereduksi sulfat)
  • getaran, tidak lebih, mesin kelas 1-2 menurut GOST ISO 10816-1-97
  • lingkungan elektromagnetik - peralihan motor listrik dengan kontaktor KT 6053, peralatan soft start RVS-DN, peralatan kontrol SIEMENS MICROMASTER PID, radiasi dalam rentang ISM dan GSM sesuai dengan persyaratan untuk perangkat ini, pengelasan busur manual di lokasi
  • tegangan jaringan yang berlebihan, gangguan jangka pendek pada pasokan listrik, tegangan lebih petir, ketidakseimbangan fasa ketika kabel saluran udara putus pada jaringan distribusi 6-10 kV.

Meskipun persyaratannya sangat ketat, implementasinya cukup sederhana ketika menyelesaikan masalah langkah demi langkah.

Dengan mempertimbangkan semuanya, board β€œArduino Nano 3.0” menjadi β€œotak” dari rencana tersebut. Papan robotdyn memiliki pengontrol ATMEGA 328, penstabil tegangan 3,3V yang diperlukan
arus 800 mA dan konverter ke CH340G UART-USB.

Pertama-tama, penghitung jam operasional diciptakan sebagai yang paling mutakhir. Meteran industri yang sebelumnya digunakan yang dirakit pada PIC dengan sirkuit catu daya tanpa transformator gagal karena lonjakan tegangan dalam satu tahun pengoperasian. Hanya yang tersambung menggunakan catu daya 5V buatan sendiri yang tetap utuh. Untuk mempercepat pemasangan dan keserbagunaan koneksi, sinyal tentang status unit diambil dari terminal perangkat switching, mis. registrasi keberadaan tegangan fasa 1 dengan catu daya tiga fasa 380V. Untuk berkoordinasi dengan pengontrol, digunakan relai perantara dengan belitan 220V atau optokopler yang terdiri dari LED dan fotoresistor GL5516 atau optokopler PC817. Semua pilihan telah diuji. LED ditenagai oleh tegangan yang diperbaiki dengan batasan arus menggunakan dua kapasitor SVV22 yang dirancang untuk tegangan 630V yang dihubungkan secara seri untuk keselamatan selama pengujian sirkuit yang tidak disengaja dengan megohmmeter.
Pembacaan pembacaan waktu pengoperasian menggunakan layar LCD ST7735S, transmisi data real-time melalui radio menggunakan modul E01-ML01DP05 pada frekuensi 2,4 MHz. Perangkat ini berisi chip nRF24L01+ dan amplifier transmisi/penerimaan RFX2401C,
daya keluaran hingga 100 mW. Antena heliks dirancang untuk rentang yang diinginkan di kalkulator online situs. Pilihan jenis antena ditentukan dengan mengecualikan penerimaan gelombang pantulan tunggal dari struktur logam di sekitarnya. Bagian antena dicetak pada printer 3D. Status penghitung saat ini disimpan di EEPROM pengontrol itu sendiri dan dipulihkan jika terjadi pemadaman listrik yang tidak terduga. Interval waktu penghitungan disediakan oleh chip RTC DS3231 dalam bentuk modul dengan baterai cadangan. Catu daya menggunakan 3 modul, sumber pulsa sebenarnya 220/5V HLK-PM01 600mA, konverter dari 1-5V ke 5V HW-553 ΠΈ 03962A - pengontrol baterai dengan skema perlindungan terhadap korsleting, pelepasan berlebih, dan pengisian berlebih. Semua komponen dibeli di situs Aliexpress.

Papan rotiSistem pengumpulan data otonom lokal
Penghitung 4 saluran. Terdapat filter LC pada input untuk melindungi dari interferensi melalui jalur komunikasi twisted pair. Data keadaan objek kontrol terus-menerus dibaca satu kali per detik dan ditampilkan dalam warna pada LCD. Pembacaan diperbarui dan dicatat dalam memori non-volatil setiap 1 detik. 36 detik adalah 36/1 jam, ini adalah format data yang diperlukan. Setiap 100 detik. informasi dikirimkan tentang jumlah detik operasi untuk setiap unit kontrol. Memori EEPROM memiliki jumlah siklus tulis-hapus yang terbatas, menurut pabrikan, 12 kali. Pilihan terburuk adalah ketika setidaknya satu sel terus diperbarui. Volume pencacah pertama adalah 100000 byte, ini adalah angka format panjang, 1 pencacah, total 4 byte ditempati oleh satu catatan. Panjang memori chip adalah 4 byte, setelah 16 entri dari 1024 penghitung, perekaman akan dimulai dari awal. Di perpustakaan EEPROM, metode EEPROM.put tidak menulis, jika nilai sel dan informasi yang ditulis cocok, tidak akan terjadi degradasi sel. Hasilnya, jaminan waktu pengoperasian memori akan lebih dari 64 tahun. Waktu pengerjaan yang memungkinkan namun tidak dijamin bisa lebih lama.

Diagram sirkuitSistem pengumpulan data otonom lokal
Program di Arduino IDE//12 byte (328%)

#termasuk // Pustaka grafis inti
#termasuk // Pustaka khusus perangkat keras
#sertakan
#termasuk
#include
#termasuk
#termasuk
Radio RF24 (9, 10); // objek radio untuk bekerja dengan perpustakaan RF24,
// dan nomor pin nRF24L01+ (CE, CSN)
#termasuk
DS3231 rtc(SDA, SCL);
Waktu t;

//#definisikan TFT_CS 10
#menentukan TFT_CS 8
#define TFT_RST -1 // Anda juga dapat menghubungkan ini ke reset Arduino
// dalam hal ini, setel pin #define ini ke -1!
//#define TFT_DC 9 // DC=RS=A0 - opsi penunjukan untuk memilih perintah atau register data.
#menentukan TFT_DC 3

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

// Opsi 2: gunakan pin apa saja tetapi sedikit lebih lambat!
#define TFT_SCLK 13 // atur ini menjadi pin apa pun yang Anda suka!
#define TFT_MOSI 11 // atur ini menjadi pin apa pun yang Anda suka!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#termasuk

pergeseran byte = 52;
byte pinStatus;
unsigned long pump[4];// array dengan nilai penghitung 4 detik
mengambang m = 3600.0;
alamat int yang tidak ditandatangani = 0;
int rc;// variabel untuk counter
sumprim panjang yang tidak ditandatangani = 0;
jumlah panjang yang tidak ditandatangani = 0;
byte saya = 0;
byte k = 34;
tidak ditandatangani int z = 0;
byte b = B00000001;
penghitung byte[4]; // array untuk menyimpan status objek, 1 - mati, 0 - aktif.
int mulai = 0; //

batal penyiapan () {

rtc.begin();
radio.begin(); // Memulai pekerjaan nRF24L01+
radio.setChannel(120); // saluran data (dari 0 hingga 127).
radio.setDataRate(RF24_250KBPS); // kecepatan 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); // Buka pipa dengan pengidentifikasi untuk transfer data

// Untuk mengatur waktu, hapus komentar pada baris yang diperlukan
//rtc.setDOW(1); // Hari di minggu ini
//rtc.setTime(21, 20, 0); // Waktu, dalam format 24 jam.
//rtc.setDate(29, 10, 2018); // Tanggal, 29 Oktober 2018

tft.initR(INITR_BLACKTAB); // inisialisasi chip ST7735S, tab hitam
// Gunakan penginisialisasi ini (batalkan komentar) jika Anda menggunakan TFT 1.44".
//tft.initR(INITR_144GREENTAB); // inisialisasi chip ST7735S, tab rcB MERAH
tft.setTextWrap(salah); // Izinkan teks keluar dari tepi kanan
tft.setRotation( 2 ); // untuk PCB HITAM dan MERAH tft.setRotation(0) atau tidak.
tft.fillScreen(ST7735_BLACK); // bersihkan layar

DDRD = DDRD | B00000000;
PORTD = PORTD | B11110000; // pengetatan perangkat lunak berfungsi, tingkat tinggi -
// objek yang dikontrol "tidak berfungsi", "4" ditulis ke keempat port senior D, tidak ada penghitungan yang terjadi.

untuk ( rc = 0; rc < 4; rc++)
{
tft.setCursor ( 3, rc * 10 + shift ); // menampilkan nomor posisi objek kontrol
tft.print(rc+1);
}

tft.setCursor(12, 0); // menghasilkan 3 baris teks
tft.println("DEVELOPERS & MEMBANGUN"); // untuk memuji diri sendiri orang-orang terkasih
tft.setCursor(24, 10); // atau hak cipta yang jahat
tft.print("DEVELOPER MM");
tft.setCursor(28, 20);
tft.print("BANGUN-ER DD");

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

for ( z = 0; z < 1023; z += 16 ) { // Iterasi melalui semua sel industri
//dan menulis ke array yang terdiri dari 4 variabel pompa, 4 byte untuk setiap penghitung, karena
// variabel panjang yang tidak ditandatangani. Ada 4 counter, satu record dari keempatnya membutuhkan 4 byte.
EEPROM.mendapatkan(z, pompa[0]); // jadi, tanpa perulangan for, volumenya lebih sedikit
EEPROM.mendapatkan(z+4, pompa[1]);
EEPROM.mendapatkan(z+8, pompa[2]);
EEPROM.mendapatkan(z+12, pompa[3]);

// memberikan nilai berikutnya yang baru untuk jumlah 4 penghitung
sumprim = (pompa [0] + pompa [1] + pompa [2] + pompa [3]);

// membandingkan nilai baru hasil penjumlahan 4 counter pada variabel sumprim dengan nilai sebelumnya pada variabel
// sumsec dan jika jumlah sebelumnya lebih kecil atau sama dengan jumlah baru, maka jumlah baru yang lebih besar atau sama akan ditetapkan
// nilai sumsec.

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

//dan nilai saat ini z ditugaskan ke variabel alamat, z adalah alamat awal blok 16-byte yang terdiri dari 4 nilai
// penghitung direkam pada waktu yang sama (karena saat melakukan polling suatu port, semua 8 bitnya ditulis secara bersamaan,
// termasuk 4 bit port D tinggi yang diperlukan).
alamat = z;
}
}

// sekali lagi mengakses memori eeprom di alamat awal blok 16 byte dari 4 nilai counter yang direkam
// terakhir, yaitu nilai sebelum mematikan atau mem-boot ulang karena pembekuan. Merekam yang terbaru
// menghitung nilai ke dalam array 4 variabel pompa.

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

alamat += 16; //menambah alamat untuk menulis blok berikutnya tanpa menimpa data dari record terakhir

//akhir pemulihan data///////////////////////////////////////////// / //////////////////

lampirkanInterrupt(0, hitung, BANGKIT); // pin D2, aktifkan interupsi, datang setiap detik
// pulsa dari RTC DS3231 dari output SQW

wdt_enable(WDTO_8S); // memulai pengatur waktu pengawas, reboot pengontrol jika terjadi pembekuan, waktu,
// yang mana Anda perlu mengeluarkan perintah reset timer wdt_reset( dan menghindari reboot selama operasi normal - 8 detik.
// untuk pengujian tidak disarankan untuk menyetel nilainya kurang dari 8 detik. Dalam hal ini, pengatur waktu sebaiknya direset
// menyentak, dan itu terjadi setiap detik.

}

void loop () {
// siklus kosong, di sini akan ada kontrol atas pengoperasian motor listrik fase terbuka
}

jumlah batal() {

tft.setTextColor(ST7735_WHITE); // mengatur warna font
t = rtc.getTime(); // membaca waktu
tft.setCursor(5, 120); // mengatur posisi kursor
tft.fillRect(5, 120, 50, 7, ST7735_BLACK); // membersihkan area keluaran waktu
tft.print(rtc.getTimeStr()); // pembacaan jam keluaran

wdt_reset(); // menyetel ulang pengawas setiap siklus, yaitu detik

for (rc = 0; rc < 4; rc ++) // awal siklus untuk memeriksa kepatuhan status input
// port bit ke status baca sebelumnya dari bit port D
{
pinState = (PIND >> 4) & ( b << rc );

if (pumrcounter [rc] != pinState) { // dan jika tidak cocok, maka
pumcounter[rc] = pinState; // menetapkan variabel status bit port dengan nilai baru 1/0
}
// indikasi status objek kontrol warna
// BIRU adalah kesalahan kecil pada layar yang ada (atau perpustakaan?), RGB dan BGR tercampur.
jika (pinState == ( b << rc )) {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // untuk penghitungan level rendah ubah HIJAU menjadi BIRU
} Else {
tft.fillRect(15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // untuk penghitungan tingkat rendah ubah BIRU menjadi HIJAU
pompa [rc] += 1; // tambahkan 1 detik ke penghitung waktu pengoperasian
}
}

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

tft.fillRect(30, shift, 97, 40, ST7735_BLACK); // mengosongkan area tampilan waktu pengoperasian
tft.fillRect(60, 120, 73, 7, ST7735_BLACK); // dan tanggal

tft.setCursor(60, 120); // mengatur posisi kursor
tft.print(rtc.getDateStr()); // menampilkan tanggal pada layar LCD

for (rc = 0; rc < 4; rc ++) //output jam operasi secara keseluruhan, persepuluh dan
{
tft.setCursor ( 30, rc * 10 + shift ); // seperseratus jam dengan pergeseran layar ke bawah sebesar 10 piksel
tft.println(pompa [rc] /m);
}

// menulis nilai jam pengoperasian β€œmentah” (dalam hitungan detik) ke EEPROM ///////////////////////////////

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

// mengirim data melalui saluran radio dari data yang menunjukkan berapa byte yang harus dikirim.
jika ((k == 6 ) || (k == 18 ) || (k == 30 )) {

data panjang yang tidak ditandatangani;

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

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

Beberapa catatan di akhir. Penghitungan terjadi pada tingkat logika rendah pada input.

Resistensi pull-up R2-R5 adalah 36 kOhm untuk opsi dengan fotoresistor GL5516. Dalam hal optocoupler dan relai fototransistor, atur ke 4,7-5,1 kOhm. Bootloader Arduino Nano v3.0 diganti dengan Arduino Uno menggunakan programmer TL866A untuk pengoperasian pengatur waktu pengawas yang benar. Sekering dikoreksi untuk beroperasi pada tegangan di atas 4,3 V. Sirkuit reset eksternal R6 C3 tidak digunakan. Dalam program sampel, frekuensi pemancar tidak sesuai dengan rentang yang tidak berlisensi; rentang 2,4 MHz dibatasi pada frekuensi 2400.0-2483.5 MHz.

Jangkauan pemancar E01-ML01DP05 adalah 2400-2525 MHz. Bandwidth satu saluran adalah 1 MHz, ketika mengatur kecepatan sebagai β€œRF24_2MBPS” saluran radio.setChannel(120) yang ditentukan dan saluran berikutnya akan ditempati, mis. pitanya akan menjadi 2 MHz.

Sumber: www.habr.com

Tambah komentar