
Tidak ada yang luar biasa, hanya pengontrol Arduino lain. Dengan sensor, gulungan, dan halaman web. Tetapi dengan karakteristiknya sendiri dan aplikasi praktis yang sangat spesifik, meskipun cukup dangkal - masuknya remote pemanas listrik di negara ini. Kutipan di header tidak acak, controller bukan rumah pintar di versi saat ini, tetapi berfungsi sebagai dasar yang baik untuk itu.
(catatan - frasa ini ditambahkan pada 12/12/18 berdasarkan komentar).Fitur Utama:
- Sensor parameter jaringan listrik - meteran listrik βNevaβ menurut RS-485;
- Modifikasi jarak jauh dari halaman web kontrol yang terletak pada kartu SD;
- Pencantuman sekelompok sensor suhu Dallas yang andal di jalur panjang;
- Grafik perubahan parameter tanpa melibatkan layanan cloud;
- Solusi gagal-aman (pengawas eksternal, UPS, restart otomatis router);
- Perlindungan perisai Internet dari pembekuan selama gangguan dari relay daya;
- Desain lengkap di kandang DIN rail.
Saya melakukan sistem ini secara perlahan, sebagai hiburan, dari waktu ke waktu melempar proyek selama berbulan-bulan ... Butuh sekitar satu setengah tahun dari ide untuk implementasi :)
Karena sebelumnya saya tidak punya urusan dengan mikrokontroler, saya mulai dengan starter kit dengan aliexpress, bermain dengan LED, tombol dan sensor, saya mengerti sesuatu tentang apa, dan mulai membangun pengontrol untuk kendali jarak jauh dan pemantauan. Yah, "rumah pintar" tidak langsung, tentu saja, tetapi sesuatu seperti itu.
Tujuan praktisnya adalah yang pertama ditetapkan - untuk menyalakan pemanas di negara itu dari jarak jauh. Saya belum berhasil membangun rumah (tangan saya tidak menjangkau, ya), tetapi saya memiliki
pondok musim panas yang nyaman dan indah dalam daging cincang yang dipanaskan oleh electric convectors. Lakukan pemanasan rumah ganti yang telah mendingin selama seminggu pada hari Jumat malam - kesempatan yang sangat menggoda di musim dingin.
Namun, tugas kontrol beban jarak jauh ternyata cukup sepele. Arduino plus perisai Internet, sketsa yang sudah jadi dari Internet, dan gulungan sudah klik dari tanda centang di halaman web. Tujuan praktis entah bagaimana dicapai dengan sangat cepat dan sederhana. Dan itu membosankan. Saya menginginkan sesuatu yang lebih menarik.
Saya menetapkan sendiri tujuan praktis kedua - untuk memantau konsumsi saat ini di jaringan pondok musim panas. Saya mendapat sensor saat ini untuk tes, bermain-main. Semuanya bekerja dengan baik, tetapi opsi ini tidak cocok untuk pekerjaan tempur. Saya tidak dapat menemukan sensor yang lebih kuat daripada pada 5A, tetapi saya membutuhkan setidaknya 25A.
Dan saya memiliki ide untuk menggunakan meteran listrik sebagai sensor daya. Dan itu pemikiran yang bagus! Dan saya membuat perangkat seperti itu, dan melihat bahwa itu bagus! Bukan tanpa kesulitan, tapi saya menyelesaikan tugas ini dengan sempurna, sebagai hasilnya, dengan perasaan kepuasan yang mendalam, dan saya akan katakan di bawah ini :).
FungsionalVersi pertempuran pertama (dan sejauh ini yang terakhir) dari pengendali "rumah pintar" memiliki fungsi ini:
- Kontrol manual jarak jauh dari aktivasi relai daya melalui browser dan pemantauan status mereka saat ini;
- Pemantauan jarak jauh dari parameter jaringan catu daya tiga fase (tegangan, arus, frekuensi, dan banyak lagi sampah yang tidak perlu, yang kemudian saya matikan);
- Pemantauan jarak jauh dari pembacaan meter listrik dua tarif;
- Pemantauan jarak jauh sekelompok sensor suhu;
- Mencatat data dan merekam peristiwa pada kartu memori;
- Tampilan di browser data dari semua sensor untuk hari yang dipilih dalam bentuk grafik.
IdeologiPrinsip membangun seluruh sistem - tanpa menggunakan layanan cloud pihak ketiga dan pengumpulan data dan server tampilan. Ini tidak baik atau buruk. Pada tahap awal "bangunan pintar" skema semacam itu sudah cukup dan sederhana. Meskipun itu memberlakukan batasan tertentu pada penggunaan.
Arduino dengan perisai Internet adalah satu-satunya server web dalam sistem. Halaman web dengan antarmuka manajemen disimpan pada kartu memori Internet dan ditransmisikan ke browser ketika diakses oleh alamat IP yang ditentukan. Interaksi lebih lanjut dari antarmuka pengguna dengan Arduino dilakukan melalui skrip java, yang tubuhnya tidak tertanam di halaman web, tetapi disimpan di penyimpanan file rumah saya dengan akses Internet. Pendekatan ini mengurangi bobot halaman web, yang mempercepat pembacaannya dari kartu SD, dan memungkinkan Anda untuk lebih cepat dan mudah memodifikasi kode skrip.
Membaca log data untuk menampilkan grafik dilakukan dari kartu memori berdasarkan permintaan (menekan tombol di browser). Data ditampilkan hanya pada sesi halaman browser saat ini, tidak disimpan di mana pun, dan ketika Anda memuat kembali halaman, Anda harus membacanya lagi. Ini adalah minus dari ideologi, karena membaca dari kartu memori agak lambat, dan mendapatkan jumlah data harian dapat memakan waktu satu atau dua menit (ada ide untuk mengolah format penyimpanan data untuk mengurangi ukurannya dan mempercepat membaca).
Nilai saat ini dari sensor ditampilkan pada halaman dan diperbarui secara real time dengan frekuensi siklus loop, yang saya miliki adalah sekitar 1 Hz.
Tidak ada "kecerdasan" dalam algoritma sekarang. Apakah saya akan memperingatkan algoritma di masa depan - saya tidak tahu, untuk saat ini versi saat ini benar-benar memuaskan bagi saya.
Topologi jaringanDi pondok, mobile Internet Yota (modem usb + router wifi). Tidak ada alamat IP tetap, dan tidak ada cara untuk mendapatkannya juga, bahkan untuk uang. Dan bahkan tidak ada alamat IP putih dinamis, jadi DynDNS tidak berlaku. Hanya alamat IP abu-abu dari jaringan internal Yota. IPota Yota tidak mendukung (setidaknya untuk 2017 ini masalahnya). Oleh karena itu, saya hanya menemukan satu cara untuk sampai ke router negara dari luar - VPN.
Di rumah (di kota) internet kabel dengan alamat IP putih tetap. Router, diikuti oleh penyimpanan jaringan. Server VPN telah dimunculkan pada router rumah ini. Router negara dikonfigurasikan untuk menaikkan terowongan PPTP VPN ke router rumah.
Pengontrol pada Arduino terhubung ke port LAN dari router negara dan duduk di belakang NAT, port ke-80 diteruskan ke sana. Jadi, saya hanya dapat mengakses Arduino dari VPN saya. Dengan demikian, LAN rumah dan VPN yang saya miliki adalah dua segmen dari subnet yang sama, akses langsung ke sana. Di komputer kantornya dan di smartphone, dia mengatur koneksi VPN dan juga mendapatkan akses ke Arduino. Sangat tidak nyaman untuk digunakan, tetapi berfungsi. Ya, dan keamanan relatif disediakan - tanpa izin di VPN saya, tidak ada orang lain yang bisa masuk ke halaman manajemen pengontrol.
Hambatannya adalah terowongan VPN ke router negara. Jatuh secara berkala. Selain itu, itu adalah koneksi PPTP yang sedang dirobohkan, akses Internet tetap ada. Dan hal yang paling buruk adalah ketika koneksi PPTP terputus, ia tidak lagi naik dengan sendirinya. Bahkan merestart router tidak menyimpan. Hanya restart penuh catu dayanya dengan modem USB, dan kemudian tidak segera. Anda harus mematikannya, tunggu 10 menit, hidupkan lagi. Beruntung - bagus, tidak - iterasi selanjutnya. Alasannya, menurut dukungan teknis Zyxel, adalah bahwa operator seluler memblokir paket-paket PPTP, karena satu sisi mengirim dengan benar, yang lain mendengarkan dengan benar, tetapi datanya tidak mencapai (saya memiliki router Zyxel di kedua ujung terowongan VPN). Yota tampaknya harus disalahkan, tetapi untuk mencapai sesuatu yang dapat dimengerti dari mereka adalah tidak mungkin. Atau mungkin bukan Yota.
WatchdogUntuk memastikan operasi VPN yang relatif lancar, saya menggunakan pengawas program
kruk - router negara diberdayakan melalui relai daya yang dikendalikan oleh Arduina, dan segera setelah server VPN berhenti melakukan ping (juga ping Arduina), lalu setelah 10 menit daya router dihapus selama 10 menit, kemudian router kembali Menyala dan diharapkan untuk membuat koneksi PPTP dalam 5 menit. Jika tidak ada koneksi, iterasi selanjutnya. Terkadang senyawa ini stabil bekerja selama berminggu-minggu bahkan berbulan-bulan, dan kadang-kadang mulai pecah hampir setiap hari. Belum ada cara lain untuk menyelesaikan masalah ini. Seperti yang sudah saya katakan, Yota tidak mendukung IPv6, tidak memberikan atau menjual IP putih kepada fisikawan, tidak ada penyedia lain dengan tarif normal dan tentu saja tidak ada lalu lintas tanpa batas. Namun keputusan ini, meski bersifat kruk, tetapi melakukan tugasnya dengan sangat baik. Sekarang saya selalu memiliki koneksi, dengan sedikit pengecualian, ketika saya sampai pada waktu reboot.
Selain perangkat lunak, saya juga menerapkan pengawas perangkat keras. Untuk jaga-jaga. Pengontrol harus bekerja selama berminggu-minggu dan bahkan terkadang berbulan-bulan tanpa kehadiran saya, dan tidak hang. Bagaimana semua ekonomi ini akan berperilaku di minus besar tidak diketahui oleh saya, jadi saya aman. Watchdog yang dibangun di Atmega tidak bekerja untuk saya karena saya tidak bekerja di Arduino Mega "di luar kotak" sama sekali, dan untuk membuatnya bekerja saya harus bersenang-senang. Masalah ini dijelaskan dengan baik di
sini . Selain itu, ia memiliki interval maksimum 8 detik, yang menurut saya tidak cukup. Oleh karena itu, saya menerapkan chip pengawas khusus TPL5000DGST, interval yang ditetapkan oleh kombinasi tiga pin dan dapat mencapai 64 detik, yang sangat cocok untuk saya. Untuk chip ini saya membeli papan tempat memotong roti kecil, disolder dan diperbaiki pada konektor dengan port IO Arduina (foto akan lebih rendah di bagian perakitan). Tes menunjukkan operasi pengawas ini dapat diandalkan, dan saya bertanya-tanya seberapa sering itu akan bekerja dalam kenyataan. Untuk melakukan ini, saya menambahkan variabel ke kode program tempat waktu dan tanggal peluncuran program disimpan, dan informasi ini ditampilkan di halaman web kontrol. Praktek telah menunjukkan bahwa, tidak seperti VPN, pengontrol bekerja dengan lancar untuk waktu yang lama, dan pengawas waktu tidak pernah berguna (saat menulis artikel, itu berfungsi untuk pertama kalinya, itu tidak sia-sia). Waktu operasi terus-menerus mencapai lebih dari 3 bulan dan bisa lebih jika saya tidak perlu memperbaiki sesuatu dalam kode dari waktu ke waktu dan reflash controller.
Sensor parameter jaringan catu daya - meteran listrik Neva
Seperti yang saya sebutkan di atas, menurut pendapat saya, tidak ada yang lebih baik dan lebih akurat daripada meteran listrik digital modern dengan antarmuka akses data eksternal dapat ditemukan sebagai sensor parameter catu daya. Saya memilih penghitung Neva dari perusahaan St. Petersburg Taypit dengan antarmuka RS-485.
Saya menekankan bahwa meteran listrik dengan kabel dari antarmuka ke-485 yang terhubung secara permanen tidak secara resmi diizinkan untuk digunakan sebagai meteran (
pembaruan : dalam
komentar mereka menyarankan itu diizinkan). Oleh karena itu, dalam jaringan listrik pondok, saya menempatkan dua counter secara seri. Yang pertama adalah meteran listrik resmi, disegel dan terdaftar, terletak di panel entri jalan. Yang kedua adalah sensor catu daya saya, tidak disegel dan tidak diperhitungkan, yang tidak dipedulikan oleh perusahaan penjualan energi, karena tidak peduli dengan semua yang dipasang setelah perangkat pengukuran. Meteran listrik ini sudah terletak di panel di dalam rumah ganti, dan di panel yang sama ada juga pengontrol di Arduino, tetapi lebih pada nanti.
Di pondok saya memiliki jaringan catu daya tiga fase. Di kota, saya hanya bisa men-debug pada satu fase. Oleh karena itu, saya memperoleh dua meter, tiga fase Neva MT-324 dan satu fase Neva MT-124. Debugging awal controller dilakukan di atas meja pada penghitung tiga fase dengan satu fase terhubung, kemudian menginstalnya secara teratur di perisai dacha dalam mode operasi tempur. Debugging modifikasi perangkat lunak berikutnya sudah dilakukan pada counter fase tunggal yang lebih murah di atas meja:

Untuk menghubungkan meter ke Arduino, diperlukan konverter level RS-485 ke TTL:

Juga, untuk bekerja dengan penghitung, Anda memerlukan port serial gratis di Arduino. Sayangnya, Arduino Uno hanya memiliki satu port serial, jika Anda mengambilnya di bawah meja, Anda harus kehilangan output debug informasi teks (monitor port), dan tanpa ini tidak mungkin untuk menulis sketsa. Karena itu, saya menggunakan Arduino Mega, yang memiliki beberapa port serial. Mungkin untuk mengimplementasikan softovo port serial kedua melalui port digital Arduino, tapi saya tidak menemukan perpustakaan yang sesuai dengan kemampuan untuk mengubah pengaturan port lain, kecuali untuk kecepatan. Dan pengaturan port counter berbeda dari yang standar: 9600 bit rate, 7 bit data, 1 stop bit, kontrol paritas - genap. Objek Serial standar di Arduino, untungnya, memungkinkan Anda untuk membuat pengaturan ini.
Itu relatif mudah untuk mendapatkan protokol pertukaran dengan counter - produsen counter
di domain publik memiliki program untuk membaca parameter di bawah Windows, yang juga memiliki monitor port. Untuk menghubungkan meter ke komputer, saya menggunakan konverter antarmuka MOXA 232/432 / 485USB. Beberapa waktu untuk analisis visual paket - dan saya memilih perintah utama.
Namun, ini sepertinya tidak cukup bagi saya, dan saya menghubungi pabrik melalui e-mail. Setelah sebulan berkorespondensi dengan Typit, saya akhirnya berhasil mendapatkan daftar lengkap perintah dengan interpretasi:
Pengkodean parameter MT3XX E4SPengkodean parameter NEVA MT124 AS OP (E4P)perbarui 10.28.2019 : Penjelasan perintah. Perintah dalam tabel direpresentasikan sebagai karakter teks. Artinya, di mana harganya 0 (nol), Anda harus mengirim 0x30. Titik-titik dan tanda bintang adalah pemisah untuk kecantikan, tidak ada artinya dan Anda tidak perlu mengirimnya. Pada akhir perintah, byte checksum ditambahkan, yang dihitung dengan mempertimbangkan awalan perintah dan postfix, yang tidak ditunjukkan dalam tabel. Awalan untuk semua perintah baca adalah 0x01 0x52 0x31 0x02. Postfix ini adalah 0x28 0x29 0x03. Namun, mengirim awalan tidak diperlukan, dan postfix tampaknya wajib. Contoh: perintah date read 09.09.02 * FF. Sebenarnya, Anda harus memasukkan kode karakter teks 000902FF. Yaitu, 0x30 0x30 0x30 0x39 0x30 0x32 0x46 0x46. Tambahkan awalan dan postfix, kita dapat mengatur 0x01 0x52 0x31 0x02 0x30 0x30 0x30 0x30 0x30 0x32 0x46 0x46 0x28 0x29 0x03. Kami membaca checksum sebagai xor dari semua byte minus 1 dan menambahkan byte yang diterima di akhir. Awalan dibuang sebagai opsional. Hasilnya, kami mengirim ini ke konter - 0x30 0x30 0x30 0x30 0x30 0x32 0x46 0x46 0x28 0x29 0x03 0x68. Awal siklus pertukaran harus didahului oleh perintah inisialisasi pertukaran, dalam sketsa di bawah ini, perintah ini ditandai sebagai // Mulai 1, 2, 3. Setelah pertukaran diinisialisasi, Anda dapat membaca data dari penghitung dalam siklus untuk waktu yang lama secara sewenang-wenang, tetapi setelah kehilangan komunikasi dan mungkin setelah beberapa kekurangan pertukaran yang berkepanjangan karena alasan lain, re-inisialisasi diperlukan.
Selanjutnya, masalah teknis adalah untuk menulis siklus polling parameter di bawah Arduino dan menampilkannya sebagai permulaan di monitor port. Waktu satu siklus ternyata sekitar satu detik. Namun, dalam versi final proyek dengan pencatatan data ke flash drive dan sensor suhu pemungutan suara, kali ini meningkat menjadi 4 detik. Ini sama sekali tidak cocok untuk saya dan harus terjun ke optimasi. Hasilnya, saya kembali mencapai interval kedua tanpa kehilangan fungsionalitas. Omong-omong, saya menulis ulang sketsa dari awal dua atau tiga kali sampai saya menemukan arsitektur yang tepat dan algoritma ekonomis.
Implementasi pertukaran perangkat lunak dengan counterKode ini dicabut dari konteks sketsa kerja saya yang besar. Disusun, tetapi dalam bentuk ini, saya tidak pernah menjalankannya. Saya berikan hanya sebagai contoh, dan bukan sebagai program kerja selesai. Meskipun secara teori semuanya harus bekerja dalam bentuk ini.
Kode ini ditulis untuk dua jenis penghitung secara bersamaan, satu fase MT-124 dan tiga fase MT-324. Jenis penghitung dipilih dalam program secara otomatis oleh kata respons dari perintah inisialisasi.
Saya mengutip kode apa adanya, tanpa kecantikan dan tidak ada komentar tambahan kecuali yang saya tulis sendiri. Dan ya, saya bukan seorang programmer, dan saya bahkan tidak mempelajarinya, jadi Anda tidak boleh menendang saya karena kualitas kodenya, tetapi Anda bisa belajar cara membuat kode:
EnergyMeterNeva.inoTambahan besar tambahan meteran listrik adalah jam waktu-nyata yang andal dan akurat. Saya tidak harus menyediakan sistem dengan modul tambahan, yang masih perlu ditemukan bukan hanya bagaimanapun, tetapi berkualitas tinggi. Waktu saat ini akurat untuk yang kedua saya dapatkan dari konter, di antara data lainnya. Ya, sehubungan dengan waktu atom, waktu penghitung sedikit bergeser (beberapa detik), saya tidak tahu apa itu terhubung, pengaturan pabrik berkualitas buruk atau sesuatu yang lain, tetapi akurasinya sangat baik, hanya dengan sedikit offset.
Pada saat-saat langka, ketika daya di pondok dimatikan dan meteran menjadi tidak tersedia, saya mendapatkan waktu saat ini dari timer internal Arduina. Ketika meter listrik berfungsi dan datanya tersedia, saya menulis ulang timer internal Arduina dengan nilai dari meter pada setiap loop loop. Ketika penghitung jatuh - waktu saat ini terus mencentang pada timer Arduina.
Selain membaca parameter, penghitung, tentu saja, dapat diprogram. Artinya, antarmuka berfungsi baik untuk membaca dan menulis. Namun, dengan kesulitan seperti itu, saya mencoba untuk mendapatkan protokol untuk membaca perintah yang saya bahkan tidak memberi petunjuk kepada pabrik tentang permintaan protokol rekaman. Pertama, saya tidak membutuhkannya, kecuali mungkin hanya sedikit waktu untuk memindahkannya. Kedua, saya menduga bahwa data ini tidak lagi publik, karena dapat digunakan untuk tujuan penipuan.
Sensor suhuSaya sudah
melakukan tes sensor suhu dengan contoh sketsa secara terpisah sebelumnya. Sekarang tinggal melekatkan survei mereka di proyek utama. Itu tidak sulit. Kesembilan sensor saya telah bekerja tanpa masalah ketika saya menyalakan 1-Wire secara paralel. Kisaran bacaan di antara mereka adalah sekitar 0,5 derajat, yang menunjukkan tidak ada gunanya menggunakannya pada akurasi maksimum 0,0625 derajat. Saya mengumpulkan sensor untuk pengujian dalam kemasan dan membungkusnya dengan beberapa lapis polietilen perekat. Untuk akurasi yang lebih besar, saya meletakkan paket secara vertikal dan menunggu satu hari untuk benar-benar menyamakan suhu. Pembacaan semua sensor ternyata tidak sama.
Namun, saya tidak mulai merusak ketepatan mengubah suhu sensor itu sendiri. Lebih mudah untuk mengakhiri pembacaan secara terprogram, dan saya tidak akan mendapatkan manfaat dari saat survei, karena saya datang dengan algoritma di mana batas waktu konversi bukanlah penundaan kosong yang sia-sia (750). Logika yang biasa untuk bekerja dengan sensor adalah pertama-tama mengeluarkan perintah untuk memulai konversi suhu, kemudian menunggu konversi selesai (minimal 750 ms yang sama), dan kemudian membaca data. Saya melakukan yang sebaliknya, yang memungkinkan saya untuk mengecualikan interval tunggu yang kosong - pertama saya membaca data dari sensor, dan kemudian segera memulai konversi. Dan sementara semua sisa kode dalam siklus LOOP akan berfungsi, data hanya memiliki waktu untuk bersiap untuk membaca di babak berikutnya. Pada waktunya, saya mendapatkan data dari sensor dalam kasus ini sedikit kemudian - siklus LOOP membutuhkan waktu sekitar 1-1.5 detik, tetapi ini sama sekali tidak kritis.Terkadang dari semua sensor saya menerima data "85" atau "0". Saya tidak mengerti apa jenis kusen ini, jadi saya melakukan pengecekan dalam kode dan mengecualikan data tersebut dari masuk ke dalam hasil. Tiang lain ditemukan di salah satu sensor - ia tidak memegang pengaturan ketika daya dimatikan. Entah flash drive internalnya sudah mati, atau yang lain. Oleh karena itu, dalam pengaturan saya mendaftarkan pengaturan untuk sensor, dan sekarang ketika daya dihidupkan (jika masih hilang), semua sensor dijamin akan dikonfigurasi.Saya mendapatkan alamat sensor tertentu menggunakan contoh sketsa, di suatu tempat menggali dan memodifikasi sedikit oleh saya: DS18x20_Temperature.inoSetelah itu saya mencetak alamat dengan konstanta dalam array dan dalam program utama saya beralih ke sensor segera di alamat mereka: TempSensors_DS18B20.inoUntuk pengoperasian sensor yang benar pada bus 1-Kawat, resistor penarik 4,7 kΞ© harus dipasang di antara jalur data dan catu daya. Itu nyaman bagi saya untuk menyolder resistor SMD antara pin blok terminal, tetapi saya hanya menemukan 5,1 kOhm dalam kasus yang sesuai, dan meletakkannya (ini terlihat di foto di bagian perakitan di sisi bawah papan). Semuanya bekerja dengan baik.Sensor suhu saya terhubung secara elektrik secara paralel pada satu garis panjang (+5, gnd dan data), semuanya 9 buah, tetapi rumit. Secara fisik, kabel twisted pair dihubungkan oleh bintang untuk kenyamanan sensor kabel di sekitar objek. Saya menggunakan dua pasang di setiap lengan kabel. Satu pasangan adalah kekuatan sensor. Pasangan kedua adalah jalur data yang melewati satu kabel ke sensor dan kembali dari itu melalui kabel kedua. Dengan demikian, dimungkinkan untuk memisahkan kabel dengan bintang dari perisai, tetapi secara elektrik bintang hanya berkuasa, dan menurut data itu adalah satu garis. Opsi koneksi ini ternyata lebih andal dalam bekerja pada saluran yang panjang, dengan koneksi paralel yang sederhana ada banyak kegagalan saat membaca data. Berikut ini adalah sketsa dari skema tersebut:
Saya tidak mempersingkat setengah meter dari kabel tiga-kawat sensor itu sendiri, saya menghubungkan mereka seolah-olah, ternyata tidak kritis.Secara total, ada tiga kabel untuk kabin, dua untuk sensor eksternal, masing-masing untuk masing-masing, dan satu untuk semua tujuh internal yang tersisa. Ketujuh sensor internal ini terhubung dengan cara yang sama, tetapi dalam satu kabel panjang dan dengan cabang pendek darinya (lihat bentuk-T bawah pada sketsa). Di suatu tempat ada cukup standar setengah meter dari sensor untuk bercabang, di suatu tempat itu bercabang dengan bantuan dari pasangan bengkok yang sama.Sirkuit switching sensor dua kawat, dengan apa yang disebut Saya tidak menggunakan daya parasit (ketika sensor menerima daya melalui jalur data) karena ... mengapa? Bagaimanapun, saya akan mengambil kabel empat pasang, hanya karena saya memilikinya. Tidak ada masalah dengan meletakkan kabel di kabin. Dan sirkuit catu daya parasit sangat penting untuk jumlah arus yang dikonsumsi dalam beberapa mode operasi, masalah yang tidak perlu bisa muncul.Total panjang pasangan terpuntir di kabin sekitar 25 meter. Potongan untuk sensor eksternal - 5 dan 10 meter, dan potongan internal sepuluh meter dengan cabang untuk tujuh sensor. Semuanya bekerja dengan sangat sempurna. Hanya kadang-kadang tanda hubung silang alih-alih nilai suhu. Ini berarti bahwa data dari sensor tertentu tidak terbaca dengan benar. Tapi ini jarang terjadi (saya perhatikan sebulan sekali mungkin) sehingga tidak menimbulkan masalah.Akses jarak jauhPerisai Ethernet dibeli untuk akses jarak jauh ke Arduino. Dengan perpustakaan bawaan, bekerja dengannya, seperti semua hal lain di Arduino, ternyata cukup sederhana.Secara fungsional, skema kerja saya adalah sebagai berikut. Server web telah dimunculkan di Arduino, yang, ketika klien (browser) mengaksesnya, menghasilkan halaman web dengan berbagai informasi. Pembaruan otomatis data pada halaman diimplementasikan menggunakan javascript polling server dengan timer.Halaman ini juga memiliki seperangkat kontrol untuk mengendalikan aktuator yang terhubung ke Arduino - relai daya yang mengalihkan beban - pemanas dan penerangan listrik.Saya tidak mandi uap dengan desain halaman web, terutama karena jumlah minimum data teks diperlukan untuk memuatnya lebih cepat, oleh karena itu html yang paling primitif dan itu saja:
Alih-alih data, saya menyematkan tag ke dalam kode html, yang dengan cepat diganti dengan data nyata saat halaman dihasilkan oleh server. Ketika data secara otomatis diperbarui berdasarkan permintaan javascript, mereka ditransfer ke browser langsung dari mikrokontroler dalam format JSON.Kode halaman terletak pada file pada kartu memori dan diambil darinya ketika mengakses server. Untuk modifikasi kode halaman yang lebih cepat dan lebih nyaman, saya membangun sendiri mekanisme untuk memperbaruinya. Di bagian bawah, di bawah blok kontrol dasar, ada kotak teks dan tombol Kirim. Saya menyalin kode html baru ke dalam bidang teks, tekan tombol, setelah itu script java mengirim data ke server web controller, yang pertama-tama menyimpannya ke file spooled. Jika transfer berhasil, maka file utama diganti dengan buffer, halaman diperbarui secara otomatis. Itu saja.
Perubahan diterima.Saya mengutip fragmen kode dari implementasi mekanisme ini.Di halaman html kami menyematkan formulir:<script type="text/javascript" src="http://domain/send_HTM.js"></script></pre> <pre style="font-size: 14px;"><form> <br><br> CONTROL.HTM:<br> <textarea cols="100" rows="20" wrap="off" id="htm"></textarea><br> <input type="button" value="" onclick="send_HTM();"><br> <div id="progress" style="display:none"> <div id="label"> :</div> <div style="width:800px;border:1px solid #000"> <div id="bar" style="background:#00f;height:10px;width:0px"></div> </div> </div> </form>
Tombol "Kirim" meluncurkan skrip
Java berikut:
send_HTM.jsDalam sketsa dalam fungsi untuk memproses permintaan server web dengan awalan dalam permintaan 'CONTROL.HTM' (mulai mengirim file), 'htmlineN' (mengirim nomor jalur) dan 'END_CONTROL.HTM' (akhir pengiriman file), kami menentukan tindakan berikut:
File acceptHtmFile; ................ if (fl_accept_htm) // 'CONTROL.HTM' { SD.remove(CTRL_HTM); acceptHtmFile = SD.open(CTRL_HTM, FILE_WRITE); // if (!acceptHtmFile) // - { #ifdef DEBUG_SD Serial.println("SD-card not found"); #endif client.print("FAIL"); client.stop(); } else client.print("OK_OPEN_FILE"); acceptHtmMode = true; break; } if (fl_htmline) // 'htmlineN' { int b = acceptHtmFile.println(tag); if (b == 0) { client.print("FAIL"); acceptHtmMode = false; cntHtmModeIteration = 0; } else { client.print("OK"); } cntHtmModeIteration = 0; break; } if (fl_endhtm) // 'END_CONTROL.HTM' { SD.remove(CONTROL_HTM); acceptHtmFile.close(); File htmlFile = SD.open(CONTROL_HTM, FILE_WRITE); // acceptHtmFile = SD.open(CTRL_HTM); // for (int i = 0; i < acceptHtmFile.size(); i++) { digitalWrite(PIN_WATCHDOG_DONE, 1); htmlFile.write(acceptHtmFile.read()); digitalWrite(PIN_WATCHDOG_DONE, 0); } acceptHtmFile.close(); htmlFile.close(); client.print("OK_CLOSE_FILE"); acceptHtmMode = false; cntHtmModeIteration = 0; break; }
CONTROL_HTM dan CTRL_HTM mendefinisikan di sini adalah nama-nama file html. Yang pertama adalah file utama, yang kedua adalah file buffer. Dalam array tag char terletak teks dari string yang diterima, dipilih dari permintaan. Logikanya adalah sebagai berikut: ketika menerima data, mereka ditulis ke file spooled, pada akhir penerimaan, file spooled ditimpa di yang utama. Saya masih tidak mengerti bagaimana cara mengganti nama file, perpustakaan standar SD tidak memiliki fungsi seperti itu, sehingga menyalin karakter-demi-karakter yang bodoh, yang membutuhkan banyak waktu.
Akan lebih mudah untuk menyimpan kode dari halaman web kontrol bukan pada kartu memori controller, tetapi pada mesin klien, atau mengunduhnya dari beberapa sumber daya eksternal. Tetapi larangan permintaan lintas domain tidak memungkinkan ini. Javascripts dapat mengirim permintaan mereka hanya ke utara dari mana mereka dimuat. Dalam hal ini, isi javascripts dapat diambil dari mana saja, hanya penting dari mana halaman dengan panggilan mereka diambil.
Pencatatan dataPerisai Ethernet memiliki slot kartu micro-SD. Itu karena kehadirannya sehingga saya memutuskan untuk menulis data ke file log. Untuk bekerja dengan kartu memori, ada juga perpustakaan built-in, dan untuk mengelola penulisan-membaca file dengan itu umumnya dasar.
Untuk menyimpan jumlah data, saya membangun algoritme logging sehingga catatan hanya terjadi ketika data berubah lebih dari ambang yang telah ditentukan. Untuk suhu 0,1 Β°, untuk tegangan 0,2V. Data untuk satu hari ditulis dalam satu file. Pada nol jam, file baru dibuat. Saya memilih format teks biasa, dengan pembatas, sehingga Anda dapat dengan cepat mengontrol konten file selama proses debug, dan akan ada kemampuan sederhana untuk memuat ke dalam Excel.
Batasan desain tidak memungkinkan Anda dengan mudah memasukkan / mengeluarkan kartu memori, jadi saya menggunakan kartu besar. Menurut perhitungan saya, itu akan diisi selama beberapa tahun, setelah itu akan diperlukan untuk membongkar kasing, keluarkan kartu memori dan bersihkan.
Saya tidak melihat gunanya mencatat kode, semuanya benar-benar sepele di sana - catatan teks yang dangkal dalam sebuah file. Dan kode ini tersebar di seluruh sketsa (tidak hanya parameter sensor dicatat, tetapi juga berbagai peristiwa satu kali), sulit untuk mengisolasi.
GrafikSebagai mesin charting, saya menggunakan perpustakaan visualisasi javascript
amavart yang sangat fleksibel. Perpustakaan gratis dan tersedia untuk diunduh dan digunakan secara offline. Saya juga menemukan perpustakaan ini di NAS saya dengan akses Internet permanen. Menghubungkan dan menggunakannya dengan pengaturan default tidak sulit, namun, untuk mendapatkan tampilan yang saya butuhkan, saya harus mengotak-atik banyak. Sejumlah besar contoh di situs dan ketersediaan dokumentasi terperinci membantu.
Sebagai contoh saya akan memberikan javascript menggambar jadwal. Dengan sendirinya, itu tidak berguna, karena hanya bekerja bersama dengan server web, dan dengan halaman html, dan mungkin terikat dengan skrip lain (itu sudah lama sekali, saya tidak ingat semua detail). Tetapi pengaturan tampilan grafik saya terkandung di dalamnya dan Anda bisa mendapatkannya dari sana:
get_log.jsKeuntungan besar dari pustaka amchart adalah ia dapat menggambar grafik yang benar dari data yang dirobek. Seperti yang saya sebutkan di atas, dalam log saya menyimpan data hanya ketika mereka berubah. Artinya, ini terjadi secara tidak sinkron dan acak. Mungkin tidak ada data baru selama beberapa menit, dan kemudian dalam beberapa detik mereka akan berubah beberapa kali. Dengan demikian, entri dalam log berjalan dengan interval waktu sewenang-wenang. Amchart mempertimbangkan hal ini sendiri saat merender, saya tidak perlu menginterpolasi data sebelum rendering. Saya hanya mengirim array data apa adanya, dan saya melihat grafik yang indah yang seragam dalam waktu.
Saya hanya menemukan satu kekurangan perpustakaan ini - perpustakaan itu tidak tahu bagaimana (yah, atau saya masih tidak mengerti bagaimana) untuk memperbarui grafik waktu nyata secara manusiawi. Anda dapat menambahkan data baru ke yang sudah ada, tetapi penggambaran ulang dilakukan setiap saat sepenuhnya dari seluruh array data, dan ini sangat memperlambat browser. Namun, ideologi membaca data dari Arduina untuk rendering on demand dari browser cacat karena tidak optimalnya, sehingga tidak ada gunanya memperjuangkan pembaruan cepat secara real time.
Solusi yang tepat adalah dengan mengatur server terpisah untuk menyimpan dan memvisualisasikan data, di mana dari Arduina data real-time akan turun sedikit dan disimpan dalam database, dan dari mana itu dapat dengan cepat dikirim ke pengguna di browser untuk visualisasi.
Sekarang bagan terlihat seperti ini (pada contoh hari ketika tidak ada orang di rumah ganti dan, karenanya, tidak ada konsumsi energi). Ketika data saat ini terjadi, skala secara otomatis diatur sehingga semuanya cocok, dan nilai level saat ini muncul pada sumbu vertikal:

Bagan ditampilkan pada halaman yang sama di mana kontrol berlangsung, langsung di bawah blok kontrol utama.
Saya tidak sengaja menyediakan satu set lengkap sumber proyek karena beberapa alasan:
- Itu tidak dapat dimulai karena berada di jaringan lain selain milik saya, karena saya tidak mencoba membuat proyek ini mudah dibawa-bawa, dan itu terikat erat dengan alamat dan topologi jaringan saya.
- Saya yakin bahwa ideologi umum dari proyek ini mengalami banyak masalah, karena ini adalah upaya pertama saya di bidang di mana saya tidak paham. Oleh karena itu, saya tidak mengusulkan kepada siapa pun seluruh proyek untuk pengulangan dalam bentuk ini. Saya hanya berbagi saat-saat di mana saya kurang percaya diri.
- Proyek ini telah dilakukan untuk waktu yang lama dan lama, dan saya tidak akan pernah mengingat semua detailnya dan tidak akan dapat menjelaskan sejumlah solusi. Volume sketsa sangat besar (menurut standar saya, sekitar 2 ribu baris), ada lebih dari selusin skrip Jawa penyajian yang berbeda, saya tidak membuat diagram skematik dari besi. Artinya, saya tidak bisa membantu penasehat pada sebagian besar masalah.
MajelisDari awal saya menetapkan sendiri tujuan - untuk membuat perangkat jadi, dan bukan hanya tata letak dengan tumpukan posting di atas meja:

Dan segera memutuskan bahwa saya ingin menempatkan perangkat di dalam panel listrik. Ada makanan, dan sebuah konter, dan secara umum, itu nyaman.
Untuk ini, diperlukan kasus dinrek. Awalnya saya berpikir untuk mengembangkannya dan mencetaknya pada printer 3D. Tapi saya tidak punya printer 3D sendiri, dan apa yang rekan-rekan saya kerjakan pada cetakan printer rakitan mereka tidak cocok sama sekali dengan saya dalam kualitas penampilan mereka. Saya menemukan
case yang sudah jadi di rail DIN (dari berbagai ukuran) untuk dijual, mereka terlihat bagus, mereka nyaman untuk digunakan (dilipat), dan ada juga
kartu blind yang sudah jadi untuk mereka.
Saya membeli kasing terbesar, sehingga tidak hanya Arduino dengan perisai Internet yang bisa muat di dalamnya, tetapi juga relay untuk mengalihkan beban:




Berikutnya adalah proses panjang dan menarik untuk menginstal semua babat dalam kasing. Di bawah bisnis ini, saya bahkan memperoleh besi solder yang indah dengan fungsi tidur (setrika yang saya miliki masih dari zaman Soviet):

Untuk pemasangan, saya membeli banyak jenis rak, sekrup, cincin, dan mur. Perakitan pemasangan pertama:


Untuk menghubungkan kabel ke kontak atas, perlu menggunakan pin bengkok, jika tidak, tidak cocok dengan kasing:

Mesin cuci isolasi harus dipotong di tempat:

Dan di beberapa tempat, itu akan menekuk lebih aneh, menaikkan sekrup di lengan, dan memotong lengan dengan rumit:


Untuk satu reloch, tidak ada poin pivot yang cukup, jadi hanya bergantung pada dua poin:

Perakitan rakitan dengan blok terminal:

Kemudian kerajinan itu mulai tumbuh secara bertahap menjadi kabel. Papan hanya digunakan untuk kabel listrik dan untuk menghubungkan ke blok terminal. Untuk koneksi sinyal, saya menggunakan kawat MS-16 (saya lebih suka), untuk daya tidak melewati tegangan (hingga 100 V), jadi MGTF:

Saya memasang LED di panel depan, menyolder resistor yang membatasi arus langsung ke kaki LED dan menutupnya dengan panas menyusut:

Akibatnya, kami mendapat isian berjanggut seperti itu:

Dan di sini ada syal dengan lingkaran mikro pengawas, terlindung di perut ciptaan saya, tepat di atas konverter level RS-485-TTL:


Seluruh struktur dapat dilipat, semuanya dapat dilepas, diputus dan diganti tanpa disolder, kecuali untuk syal dengan mata anjing, disolder ke pin konektor, mengenakan sejumlah pelabuhan IO Arduina.
Di dalam kotak:

Saya memotong bukaan untuk konektor Arduina di dinding plastik kasing. Pertama saya membuat lubang persis sesuai dengan ukuran konektor, tetapi perakitan ke dalam casing harus dimulai secara diagonal (jika tidak berfungsi) dan konektor tidak melalui, saya harus menyia-nyiakan sedikit:

Menghidupkan produk jadi di atas meja, semuanya langsung bekerja:


Di panel depan membawa:
- Empat LED merah - indikasi beban;
- Dua hijau - komunikasi dengan penghitung dan dengan server VPN;
- Dua yang kuning adalah cadangan;
- Satu kuning - indikasi reboot router;
- Satu merah adalah nutrisi;
- Dan tombol reset.
Untuk mendapatkan 5 volt dari 220, saya menggunakan catu daya dinerey dengan penyesuaian tingkat keluaran, daya disuplai langsung ke mikrokontroler, melewati konverter input dari 7-12 ke 5 volt. Ini nyaman karena beberapa alasan. Pertama, kekuatan konverter built-in di beberapa titik tidak cukup, arus ada terbatas. Kedua, masih perlu memasok relai dengan 5 volt. Ketiga, tanda hubung adalah faktor bentuk dinrek yang nyaman dalam hal pemasangan. Oleh karena itu, di sini:
Tes
Semuanya dihidupkan di atas meja, semuanya bekerja sebagaimana mestinya, saatnya untuk menginstal controller di perisai dan memeriksanya dalam mode pertempuran.
Tapi pertama-tama, saya menghubungkan segala sesuatu "pada ingus", secara harfiah mendorong semua babat ke perisai lain, arus rendah untuk menguji sensor suhu dalam kondisi nyata pada garis panjang yang diletakkan dalam satu saluran kabel dengan ~ kabel daya 220V:

Seperti yang Anda lihat di foto di atas, sampai sekarang saya mencoba mengendalikan reboot router dengan menggunakan soket Senseit "pintar". Namun, perangkat ini dengan biaya gila 5 ribu (untuk 2016) ternyata sangat buggy dan murung. Selama tahun penggunaan, ini berulang kali memaksa saya untuk tiba di pondok secara tidak sengaja, untuk secara manual menghilangkan keajaiban teknik dan pemikiran pemasaran ini dari sisi buruk dalam hal komunikasi GSM. Dengan transisi ke pengontrol Arduino saya, yang ternyata lebih dapat diandalkan daripada contoh, saya merasa lega untuk membuang sampah "profesional" ini ke dalam kotak yang indah di dalam kotak dan melupakannya.

Tes berhasil, tidak ada kegagalan, dan dimungkinkan untuk melanjutkan ke instalasi akhir di tempat biasa:

Ya, ini adalah perisai ABB TwinLine 800x300x225 IP55, senilai 25 ribu rubel. tanpa mengisi (dan mengisi sekitar 15 ribu lagi). Dan ya, itu dipasang di rumah ganti 6x2. Setiap orang memiliki kecoak sendiri. Ya, saya
mengumpulkan semua listrik sendiri . Dan dia membangun rumah ganti juga, ya. Tidak, saya bukan tukang listrik. Dan bukan pembangun.

Di kedalaman perisai, saya menemukan catu daya kecil yang tidak pernah terputus,
Powercom WOW 300 , di sana LED hijau menyala, dan di sebelah kiri dan atas - colokan daya inputnya:

Ini berlangsung selama ~ 40 menit masa pakai baterai perangkat Arduino, router dengan modem USB dan Wi-Fi, dan kamera pengintai IP Full HD.
Dan di sini Anda dapat melihat colokan listrik putih dari dua konsumen yang tidak terputus - unit catu daya Arduino dan perisai arus rendah, di mana router dan unit catu daya untuk kamera pengintai luar berada. Baris ini berjalan dengan terobosan melalui kontaktor, yang dikendalikan oleh Arduino, hanya untuk pengawas perangkat lunak yang sama yang me-restart router pada daya jika VPN jatuh (kamera restart pada waktu yang sama, meskipun tidak membutuhkannya). Garis atas pasangan bengkok dari sensor suhu terhubung ke controller:

Saya harus mengatakan bahwa saya tidak akan pernah mempercayai peralihan beban yang kuat ke relay Cina biru kecil, terlepas dari parameter relay ini, yang tampaknya memungkinkan ini dilakukan. Oleh karena itu, penggunaan kontaktor modular normal
Legrand cat No. 4 125 01 dengan kemungkinan kontrol manual segera ditetapkan. Yaitu, relay di dalam tubuh pengontrol mengontrol kontaktor, dan kontaktor sudah mengendalikan beban. Itu bisa diandalkan. Tetapi kekuatan router dan kamera dilakukan hanya melalui relay Cina biru kecil ini, arus ada kecil, jadi itu mungkin.
Pada peluncuran pertempuran pertama, saya sangat kecewa. Di atas meja, saya mengalami semuanya kecuali beban. Mengapa Kontaktor mengklik, dan itu jelas bahwa mereka akan mengalihkan beban. Tapi tidak, itu perlu pengalaman. Vektor listrik yang kuat memperkenalkan gangguan ke dalam sistem pada saat membuka kontak, yang menyebabkan pembekuan perisai Internet yang terjamin. Dan untuk mengeluarkannya dari bawah hanya dimungkinkan dengan melepas daya, reset sederhana tidak membantu. Dicari Google - ya, orang Cina ini punya masalah. Dan perpustakaan tidak menangani situasi ini. Yaitu, potongan besi buruk, dan perangkat lunaknya tidak terlalu bagus.
Saya sudah berpikir bahwa semuanya hilang. Saya bahkan memesan relay solid-state, tetapi mereka, sampah, tingginya lebih besar, dan mereka tidak akan cocok dengan desain saya. Tetapi kemudian saya berpikir bahwa masih mungkin untuk menekan gangguan. Googled lagi, menemukan kapasitor penekan kebisingan khusus (yang disebut kapasitor tipe X). Hubungkan saja mereka secara paralel dengan kontrol gulungan kontaktor, dan lihatlah! Hangup menghilang sepenuhnya. Selama setahun terakhir operasi, tidak ada satu pun kasus yang tercatat:



Tetapi dengan cara ini Anda bisa melihat ke dalam kotak:


Nah, tampilan akhir dari visor dengan plastron (tidak ada colokan yang disediakan dalam kit):

Untuk debugging dan flashing, kabel USB terhubung ke controller dan disimpan di dalam perisai di balik pintu tertutup (sementara tidak akan terhubung ke foto ini):


Sistem telah bekerja selama hampir setahun, selamat dari salju hingga 20 derajat tanpa masalah.
Secara umum, saya senang dengan hasilnya. Namun, untuk tugas yang kurang lebih fungsional, Arduino jelas lemah. Lebih dari sekali saya kehabisan memori dan harus memotong dan mengoptimalkan. Dan kecepatan kerja, terutama dengan kartu memori, tidak cocok untuk saya sama sekali. Oleh karena itu, implementasi kerajinan seperti itu di masa depan, jika ada, saya ingin mendasarkan pada sesuatu yang lebih kuat. Rekan kerja memberi saya Raspberry Pi, pilihan yang bagus, saya kira.
Seseorang mungkin berkata, "Berapa banyak kesulitan demi tugas primitif seperti itu," dan mungkin akan benar. Bagi saya, seluruh usaha ini adalah hobi, dengan sedikit pembenaran untuk maknanya. Karena itu, saya mencari hiburan dalam segala hal yang saya bisa :)