Sistem Akusisi Data Otonomi Lokal

Kelanjutan artikel ini
Perusahaan membeli pos pemantauan NEXT-M untuk produksi dalam negeri NEXT Technologies. Untuk memastikan visualisasi operasi unit pompa,
alarm kebakaran, tegangan di starter, suhu kamar, ketinggian air darurat. Inti dari NEXT-M adalah ATMEGA 1280 dan fakta ini menggembirakan dalam hal kemungkinan membuat kit sendiri untuk kebutuhan spesifik.

Tugas tersebut ditetapkan untuk menciptakan sistem pengiriman lokal yang sepenuhnya otonom dalam waktu sesingkat mungkin dan dengan biaya serendah mungkin. Dasarnya adalah mikrokontroler. Pengembangan, pembuatan, semua oleh staf itu sendiri.

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

Sistem harus menyediakan:

  • memantau operasi unit pompa
  • otomatisasi teknologi
  • perlindungan darurat
  • alarm darurat
  • jam operasional
  • perhitungan jumlah listrik yang dikonsumsi
  • kontrol suhu peralatan
  • alarm kebakaran
  • pembacaan informasi jarak jauh secara berkala
  • persyaratan masa depan yang tidak diketahui

Kondisi kerja:

  • area cakupan 1 km persegi.
  • visibilitas langsung antara 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 sesuai dengan GOST ISO 10816-1-97
  • lingkungan elektromagnetik - perpindahan motor listrik oleh kontaktor KT 6053, permulaan RVS-DN lembut, peralatan kontrol PEM SIEMENS MICROMASTER, radiasi dalam rentang ISM dan GSM sesuai dengan persyaratan untuk perangkat ini, pengelasan busur manual di lokasi
  • tegangan lebih dari jaringan, pemadaman listrik jangka pendek, tegangan lebih petir, ketidakseimbangan fase dalam hal gangguan saluran udara di jaringan distribusi 6-10 kV.

Meskipun persyaratan ketat seperti itu, implementasinya cukup sederhana dengan solusi bertahap untuk masalah tersebut.

Dengan semua ini dalam pikiran, papan Arduino Nano 3.0 menjadi "otak" dari yang dikandung. Selendang Robotdyn memiliki pengontrol ATMEGA 328, regulator tegangan 3.3V yang diperlukan
Arus 800 mA dan konverter ke CH340G UART-USB.

Pertama-tama, penghitung waktu pengoperasian dibuat sebagai yang paling relevan. Meter industri yang sebelumnya digunakan dikumpulkan pada PIC dengan sirkuit catu daya transformerless gagal dari lonjakan daya selama tahun operasi. Hanya utuh dengan bantuan catu daya buatan rumah untuk 5V tetap utuh. Untuk mempercepat pemasangan dan universalitas koneksi, sinyal pada keadaan unit diambil dari terminal perangkat switching, mis. pendaftaran kehadiran fase 1 tegangan dengan power supply tiga fase 380V. Untuk berkoordinasi dengan pengontrol, estafet antara dengan belitan 220V atau optocoupler yang terdiri dari LED dan photoresistor GL5516 atau PC817 optocouple digunakan. Semua opsi diuji. LED ini ditenagai oleh tegangan yang diperbaiki dengan batasan arus menggunakan dua kapasitor CBV22 yang dirancang untuk tegangan 630V dan dihubungkan secara seri untuk keselamatan selama pemeriksaan acak rangkaian dengan megohmmeter.
Membaca waktu pengoperasian menggunakan layar LCD ST7735S, mentransmisikan data waktu nyata melalui udara menggunakan modul E01-ML01DP05 pada frekuensi 2,4 MHz. Perangkat ini mengandung chip nRF24L01 + dan amplifier penerima-terima RFX2401C,
output daya hingga 100 mW. Antena spiral yang dirancang untuk rentang yang diinginkan dalam kalkulator online situs . Pilihan jenis antena adalah karena tidak termasuk penerimaan gelombang yang pernah dipantulkan dari struktur logam di sekitarnya. Bagian antena dicetak pada printer 3D. Keadaan counter saat ini disimpan di EEPROM dari controller itu sendiri dan dikembalikan jika terjadi pemadaman listrik yang tidak terduga. Interval waktu untuk penghitungan disediakan oleh chip RTC DS3231 dalam bentuk modul dengan baterai cadangan. Tiga modul digunakan dalam unit catu daya, sumber pulsa HLK-PM01 600mA 220 / 5V itu sendiri, konverter HW-553 dan 03962A dari 1-5V ke 5V adalah pengontrol baterai dengan sirkuit proteksi terhadap korsleting, pengisian berlebih, dan pengisian berlebih. Semua komponen dibeli di situs web Aliexpress.

Papan tempat memotong roti
alt gambar

Penghitung 4 saluran. Pada input adalah filter LC untuk melindungi terhadap gangguan pada jalur komunikasi twisted pair. Data tentang keadaan objek kontrol secara konstan dibaca 1 kali per detik, ditampilkan dalam warna pada LCD. Pembacaan diperbarui dan direkam dalam memori non-volatile setiap 36 detik. 36 detik, 1/100 jam, dalam format ini data diperlukan. Setiap 12 detik informasi dikirimkan pada jumlah detik operasi untuk setiap unit kontrol. Memori EEPROM memiliki jumlah siklus write-erase yang terbatas, menurut produsen, 100.000 kali. Pilihan terburuk adalah ketika setidaknya satu sel terus diperbarui. Ukuran penghitung pertama adalah 4 byte, ini adalah angka format panjang, 4 penghitung, total 16 byte membutuhkan satu catatan. Panjang memori chip adalah 1024 byte, setelah 64 entri dari 4 penghitung, perekaman akan dimulai lagi. Di perpustakaan EEPROM, metode EEPROM.put tidak mencatat, jika nilai sel dan informasi yang ditulis cocok, tidak akan ada degradasi sel. Akibatnya, waktu pengoperasian memori yang dijamin akan lebih dari 7 tahun. Waktu yang memungkinkan, tetapi pekerjaan yang tidak beralasan bisa lebih lama.

Diagram sirkuit
alt gambar

Program dalam Arduino IDE
// 12 328 byte (38%)

#include <Adafruit_GFX.h> // Pustaka grafis inti
#include <Adafruit_ST7735.h> // Pustaka khusus perangkat keras
#termasuk <SPI.h>
#termasuk <EEPROM.h>
#termasuk <Wire.h>
#termasuk <nRF24L01.h>
#termasuk <RF24.h>
Radio RF24 (9, 10); // objek radio untuk bekerja dengan perpustakaan RF24,
// dan pin nomor nRF24L01 + (CE, CSN)
#termasuk <DS3231.h>
DS3231 rtc (SDA, SCL);
Waktu t;

// # define TFT_CS 10
#define TFT_CS 8
#define TFT_RST -1 // Anda juga bisa menghubungkan ini ke pengaturan ulang Arduino
// jika demikian, tetapkan pin #define ini menjadi -1!
// # define TFT_DC 9 // DC = RS = A0- opsi untuk menentukan output dari pilihan daftar perintah atau data.
#define TFT_DC 3

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

// Opsi 2: gunakan pin apa saja tapi sedikit lebih lambat!
#define TFT_SCLK 13 // tetapkan ini menjadi pin apa pun yang kamu suka!
#define TFT_MOSI 11 // atur ini menjadi pin apa pun yang kamu suka!
// Adafruit_ST7735 tft = Adafruit_ST7735 (TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
#termasuk <avr / wdt.h>

byte shift = 52;
byte pinState;
unsigned long pump [4]; // array dengan hitungan 4 detik
float m = 3600.0;
alamat int unsigned = 0;
int rc; // variabel untuk penghitung
sumprim panjang unsigned = 0;
sumsec panjang yang tidak ditandatangani = 0;
byte i = 0;
byte k = 34;
unsigned int z = 0;
byte b = B00000001;
pumrcounter byte [4]; // array untuk menyimpan status objek, 1- off, 0- on
mulai int = 0; //

pengaturan batal () {

rtc.begin ();
radio.begin (); // Mulai operasi nRF24L01 +
radio.setChannel (120); // saluran transmisi 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 pengenal untuk transfer data

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

tft.initR (INITR_BLACKTAB); // menginisialisasi chip ST7735S, tab hitam
// Gunakan penginisialisasi ini (tanda komentar) jika Anda menggunakan TFT 1,44 "
//tft.initR(INITR_144GREENTAB); // inisialisasi chip ST7735S, tab RED rcB
tft.setTextWrap (false); // Izinkan teks mengalir dari tepi kanan
tft.setRotation (2); // untuk PCB HITAM dan RED 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 dipantau "tidak berfungsi", "1" ditulis ke semua 4 port senior D, akun tidak pergi.

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

tft.setCursor (12, 0); // output 3 baris teks
tft.println ("DEVELOPERS & BUILD"); // untuk memuji orang yang Anda cintai
tft.setCursor (24, 10); // atau hak cipta jahat
tft.print ("DEVELOPER MM");
tft.setCursor (28, 20);
tft.print ("BUILD-ER DD");

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

untuk (z = 0; z <1023; z + = 16) {// Iterate atas semua sel industrinya
// dan menulis ke array pompa 4 variabel, masing-masing 4 byte penghitung, karena
// variabel tidak ditandai lama. Penghitung 4, satu catatan dari semua 4 membutuhkan 16 byte.
EEPROM.get (z, pompa [0]); // jadi, tanpa for loop, volume lebih sedikit
EEPROM.get (z + 4, pompa [1]);
EEPROM.get (z + 8, pompa [2]);
EEPROM.get (z + 12, pompa [3]);

// penetapan nilai baru berikutnya dari jumlah penghitung 4-x
sumprim = (pompa [0] + pompa [1] + pompa [2] + pompa [3]);

// membandingkan nilai baru dari jumlah 4 penghitung di variabel sumprim dengan nilai sebelumnya dalam variabel
// sumsec dan jika jumlah sebelumnya kurang dari atau sama dengan jumlah baru, lebih besar atau sama baru ditugaskan
// nilai sumsec.

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

// dan nilai saat ini z ditugaskan ke variabel alamat, z adalah alamat awal blok 16 byte dari 4 nilai
// penghitung direkam pada saat yang sama (karena saat polling port, semua 8 bitnya direkam secara bersamaan
// termasuk 4 bit tinggi port D yang kami inginkan.
address = z;
}
}

// Sekali lagi, akses ke memori epromprom di alamat awal blok adalah 16 byte dari 4 nilai penghitung yang direkam
// terakhir, mis. nilai sebelum mematikan atau me-reboot karena hang. Rekam terakhir
// nilai counter ke array pompa 4 variabel.

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; // tingkatkan alamat untuk menulis blok berikutnya tanpa menimpa data dari catatan terakhir

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

attachInterrupt (0, count, RISING); // pin D2, aktifkan operasi interupsi, setiap detik mereka tiba
// pulsa dari RTC DS3231 dari output SQW

wdt_enable (WDTO_8S); // mulai pengawas waktu, reboot controller jika terjadi hang, waktu,
// yang Anda perlu mengirim perintah reset timer wdt_reset (dan menghindari reboot saat operasi normal - 8 detik.
// untuk pengujian, tidak disarankan untuk menetapkan nilai kurang dari 8 detik. Dalam hal ini, timer disetel ulang sebelumnya
// menggali, dan setiap detik.

}

void loop () {
// siklus kosong, di sini akan ada kontrol atas mode operasi out-of-fase motor listrik
}

jumlah kosong () {

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

wdt_reset (); // atur ulang pengawas waktu setiap siklus, yaitu satu detik

untuk (rc = 0; rc <4; rc ++) // mulai dari loop untuk memeriksa keadaan input
// port bit ke status baca bit port D sebelumnya
{
pinState = (PIND >> 4) & (b << rc);

if (pumrcounter [rc]! = pinState) {// dan jika tidak cocok, maka
pumrcounter [rc] = pinState; // tetapkan variabel status bit port ke nilai baru 1/0
}
// indikasi status objek kontrol warna
// BIRU adalah kesalahan kecil dari layar yang ada (atau perpustakaan?), RGB dan BGR dicampur.
if (pinState == (b << rc)) {
tft.fillRect (15, ((rc * 10 + shift)), 7, 7, ST7735_BLUE); // untuk akun tingkat rendah, ubah GREEN ke BLUE
} lain {
tft.fillRect (15, ((rc * 10 + shift)), 7, 7, ST7735_GREEN); // untuk akun level rendah, ubah BIRU ke HIJAU
pump [rc] + = 1; // tambahkan 1 detik ke penghitung runtime
}
}

k ++;
if (k == 36) {
k adalah 0;

tft.fillRect (30, shift, 97, 40, ST7735_BLACK); // kosongkan area keluaran runtime
tft.fillRect (60, 120, 73, 7, ST7735_BLACK); // dan tanggal

tft.setCursor (60, 120); // atur posisi kursor
tft.print (rtc.getDateStr ()); // tampilkan tanggal di layar LCD

untuk (rc = 0; rc <4; rc ++) // keluaran waktu operasi keluaran dalam bilangan bulat, persepuluh dan
{
tft.setCursor (30, rc * 10 + shift); // seperseratus jam dengan pergeseran 10 piksel ke bawah pada layar
tft.println (pompa [rc] / m);
}

// catat nilai waktu pengoperasian "mentah" (dalam detik) di EEPROM ////////////////////////////

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

// kirim data melalui udara dari data yang menunjukkan berapa byte yang dikirim.
if ((k == 6) || (k == 18) || (k == 30)) {

data panjang yang tidak ditandatangani;

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

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

Beberapa komentar di bagian akhir. Akun berjalan pada level logika rendah pada input.
Resistensi suspensi R2-R5 36 kOhm untuk versi dengan photoresistor GL5516. Dalam hal optocoupler dan relay fototransistor, suplai 4.7-5.1 kOhm. Arduino Nano v3.0 bootloader diganti dengan Arduino Uno menggunakan programmer TL866A untuk operasi pengawas yang benar. Sekering diperbaiki untuk beroperasi pada tegangan di atas 4,3 V. Sirkuit reset eksternal R6 C3 tidak digunakan. Dalam contoh program, frekuensi pemancar tidak sesuai dengan rentang tidak berlisensi, kisaran 2,4 MHz terbatas pada frekuensi 2400,0-2483,5 MHz.
Jangkauan pemancar E01-ML01DP05 adalah 2400-2525 MHz. Bandwidth dari satu saluran adalah 1 MHz, ketika mengatur kecepatan sebagai "RF24_2MBPS", saluran radio.setChannel (120) yang ditentukan dan yang berikutnya, mis. pita akan 2 MHz.
Lanjutan

Source: https://habr.com/ru/post/id447168/


All Articles