Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Pengontrol Pemanas Multi-Zona

Komponen dan persediaan

Arduino UNO
Gunakan Mega jika Anda perlu mengontrol lebih dari 5 zona (termasuk zona tambahan untuk sisa rumah Anda tanpa pemanas lantai)
× 1
Kunci 8 saluran papan relai 5Volt
Anda memerlukan papan dengan 4 relai untuk mengontrol 2 zona lantai (1 pompa, 1 CV, 2 Katup ), Diperlukan satu relai tambahan untuk setiap zona lantai tambahan
× 1
Honeywell MT8-230-NC Aktuator Termoelektrik Linier Kecil (230v AC )
Ini hanyalah salah satu dari banyak kemungkinan aktuator yang tersedia; Anda memerlukan 1 aktuator (katup) per lantai Grup unit
× 1

Tentang proyek ini

Saya membuat perangkat ini karena dapur saya cukup hangat atau dingin dengan satu termostat dalam hidup saya. Kontroler Pemanas Multi-Zona Komersial (seperti EvoHome) sangat mahal. Program ini menangkap kecerdasan sistem mahal ini, yang dihosting di papan Arduino Uno sederhana. Ini sepenuhnya menyelesaikan masalah saya.

Sorotan/Fitur:

  • Anda hanya perlu mengkonfigurasi penyematan dan jumlah zona
  • Arduino Uno sederhana dapat mengontrol hingga 5 zona Unit Lantai
  • Dengan Arduino Mega, jumlah Zona hampir tidak terbatas

Kontrol Program yang disediakan:

  • Pompa unit Lantai
  • Menggabungkan semua zona Anda hanya sebagai satu termostat ke Pemanas Pusat
  • Katup yang digunakan untuk membuka/menutup zona
  • Timer Watch Dog untuk memastikan pengoperasian yang solid

Memungkinkan Pemanasan individu per Zona:

  • Per zona, Termostat untuk merasakan permintaan pemanasan
  • Per zona a Relay untuk mengontrol satu atau lebih katup untuk membuka/menutup grup unit Lantai dari zona tersebut
  • Sebuah ruangan dengan beberapa kelompok unit lantai dapat dianggap sebagai satu Zona pemanas (Kawatkan katup sejajar dengan Relai Zona)
  • Ini tidak hanya lebih nyaman, tetapi juga menghemat energi serta ruangan tidak menjadi terlalu hangat lagi

Mengontrol Pompa Unit Lantai:

  • Pada dasarnya hanya menjalankan pompa saat dibutuhkan untuk pemanasan. Ini sudah menghemat 100-200 Euro listrik per tahun (dibandingkan dengan menjalankan pompa yang sama 24/7 (80 Watt adalah 2kW Jam sehari =0,50 Euro per hari)
  • Mengaktifkan pompa unit lantai setidaknya sekali setiap 36 jam, selama 8 menit jika tidak ada permintaan pemanasan (Musim Panas)
  • Mencegah menjalankan pompa tanpa membuka katup terlebih dahulu; Dengan mempertimbangkan katup ini membutuhkan 3-5 menit

Opsional Anda dapat mengontrol sisa rumah Anda (kamar tanpa pemanas lantai) juga:

  • Di sini Anda biasanya memiliki kenop termostat di radiator Anda; jadi hanya kamar yang dingin saja yang panas
  • Cukup tambahkan termostat di ruangan yang ingin Anda kontrol. Hubungkan termostat ini secara paralel ke input No_Zone

Catatan akhir:

Tidak semua zona perlu dikendalikan; hanya zona yang menjadi hangat atau tetap terlalu dingin (jika tidak, gunakan kenop manual yang dapat disesuaikan di unit lantai)

Saya secara eksplisit memutuskan untuk tidak menghubungkan perangkat ke internet:

  • Ini akan meningkatkan risiko malfungsi (harus kokoh)
  • Anda dapat menggunakan termostat pintar untuk mengontrol rumah Anda. Pengontrol ini tidak menawarkan tambahan apa pun untuk beradaptasi dari jarak jauh

Kode

  • ProjectCV.ino
  • Perangkat.h
ProjectCV.inoC/C++
/* * Pengontrol pemanas Unit Lantai untuk beberapa Ruangan/Zona v1.0 * * Hak Cipta:GNU General Public License versi 3 (GPL-3.0) oleh Eric Kreuwels, 2017 * Penghargaan:Peter Kreuwels untuk mendefinisikan semua kasus penggunaan yang perlu dipertimbangkan * * Meskipun pengaturan ini sudah berjalan selama lebih dari setahun penuh untuk lantai dasar saya, saya tidak bertanggung jawab atas kesalahan dalam kode * Ini dapat digunakan sebagai dasar yang baik untuk kebutuhan Anda sendiri, dan harus diuji sebelum menggunakan * * Sorotan/Fitur:* - Anda hanya perlu mengkonfigurasi penyematan dan jumlah zona * - Arduino Uno sederhana dapat mengontrol hingga 5 zona Unit Lantai * - Dengan Arduino Mega jumlah Zona hampir tidak terbatas * - Program yang disediakan mengontrol:* - Pompa unit lantai * - Menggabungkan semua zona Anda hanya sebagai satu termostat ke pemanas CV * - Katup untuk membuka/menutup zona * - Memungkinkan Pemanasan individual per Zona; * - Per zona Termostat untuk merasakan permintaan pemanasan * - Per zona a Relai untuk mengontrol satu atau lebih katup untuk membuka/menutup Grup unit lantai dari zona itu * - Ruangan dengan beberapa grup unit lantai dapat dianggap sebagai satu pemanas Zone (Kawatkan katup sejajar dengan Relay Zona) * - Ini tidak hanya lebih nyaman, tetapi juga menghemat energi serta ruangan tidak menjadi terlalu hangat lagi * - Mengontrol Pompa Unit Lantai * - Pada dasarnya hanya menjalankan pompa saat dibutuhkan untuk pemanasan. Ini sudah menghemat listrik 100-200 Euro per tahun, * dibandingkan dengan menjalankan pompa yang sama 24/7 (80 Watt adalah 2kW Jam sehari =0,50 Euro per hari) * - Mengaktifkan pompa unit lantai setidaknya sekali setiap 36 jam, selama 8 menit jika tidak ada permintaan pemanasan (Musim Panas) * - Mencegah Pompa berjalan tanpa membuka katup terlebih dahulu; Mengingat katup ini membutuhkan 3-5 menit * - Secara opsional Anda dapat mengontrol sisa rumah Anda (ruangan tanpa pemanas lantai) juga * - Di sini Anda biasanya akan memiliki kenop termostat pada radiator Anda; jadi hanya ruangan yang dingin yang akan memanas * - Cukup tambahkan termostat di ruangan yang ingin Anda kontrol. Hubungkan termostat ini secara paralel ke input No_Zone * - Catatan akhir:* - Tidak semua zona perlu dikontrol; hanya zona yang menjadi hangat atau tetap terlalu dingin dengan * kenop yang disesuaikan secara manual di unit lantai */#include  // untuk Watchdog// PERINGATAN:FAST_MODE adalah untuk tujuan pengujian/evaluasi/debug ( loop berjalan 50x lebih cepat)// Hati-hati menggunakan FAST_MODE dengan pompa unit lantai nyata karena dapat rusak dengan katup tertutup// Katup membutuhkan minimal 3 menit untuk membuka. Dalam FAST_MODE program tidak menunggu cukup lama sebelum memulai pompa// #define FAST_MODE // eksekusi 50 kali lebih cepat; pertimbangkan untuk memutuskan CV/Pompa!// Dalam operasi Normal untuk mengulang berjalan 10 kali per detik; jadi 10 hitungan/detik (600 mewakili ca 1 menit)#menentukan VALVE_TIME 3000L // 5 menit untuk membuka/menutup katup (di tempat yang aman; biasanya memakan waktu 3 hingga 5 menit)#ifdef FAST_MODE#menentukan PUMP_MAINTENANCE_TIME 108000L // Untuk evaluasi , mengaktifkan pemeliharaan pompa Unit Lantai sekali per 4 menit (cap waktu 3 jam)#lain#menentukan PUMP_MAINTENANCE_TIME 1300000L // Mengaktifkan pemeliharaan pompa Unit Lantai sekali per 36 jam. Diperlukan agar pompa tetap bekerja#endif#define PUMP_ACTIVATION_TIME 5000L // Mengaktifkan pompa selama kira-kira 8 menit (10 detik dalam mode uji)#mendefinisikan COOLDOWN_TIME 18000L // Saat pemanasan selesai, lanjutkan sirkulasi air selama 30 menit (40 detik dalam pengujian mode) // Ini memungkinkan pembuangan panas lebih lanjut ke lantai (biasanya membutuhkan waktu 15 hingga 30 menit)#include "./Devices.h" // katup, pompa, kelas termostat (gunakan konstanta yang ditentukan di atas)struct Zone { Nama string; katup katup; Termostat termostat;};///////////////////////////////////////////////////////////// ///////// BLOK KONFIGURASI // Konfigurasi/urutkan ulang pin Anda sesuka Anda (Ini kabel saya di Arduino Uno); // Catatan:pin 1 dan 2 masih bebas untuk menambahkan zona ekstra#define HEATER_PIN 4 // output ke Relay yang terhubung dengan input Thermostat dari sistem pemanas Anda#define FU_PUMP_PIN 5 // output ke Relay yang mengubah Pompa Unit Lantai#define LIVING_VALVE 7 // Zona 1:keluaran ke Relai yang mengontrol Katup#define KITCHEN_VALVE 6 // Zona 2:keluaran ke Relai yang mengontrol Katup#define DINING_VALVE 3 // Zona 3:output ke Relay yang mengontrol Katup#define LIVING_THERMO 8 // Zona 1; masukan kabel ke termostat di ruang tamu#define KITCHEN_THERMO 9 // Zona 2; masukan kabel ke termostat di dapur#define DINING_THERMO 11 // Zona 3; masukan kabel ke termostat di ruang makan#define NO_ZONE_THERMO 10 // Opsional:termostat di ruangan tanpa pemanas lantai#define HEATING_LED 12 // Menyala saat pemanasan, Bergantian selama pendinginan, Mati dalam mode siaga#menentukan INDICATION_LED 13 // Menghidupkan bergantian papan LED untuk menunjukkan papan berjalan; dapat dengan mudah dilepas untuk membebaskan pin IO tambahan!!// Konfigurasi Zona/ruang Unit Lantai. Setiap zona/ruangan memiliki nama, katup, dan termostat:#define NR_ZONES 3Zone Zones[NR_ZONES] ={ {"Ruang Tamu", Katup(LIVING_VALVE, "Katup Hidup"), Termostat(LIVING_THERMO, "Termostat Hidup")}, { "Area Dapur", Katup(KITCHEN_VALVE,"Katup Dapur"), Termostat(KITCHEN_THERMO,"Termostat Dapur")}, {"Ruang Makan", Katup(DINING_VALVE, "Katup Makan"), Termostat(DINING_THERMO, "Termostat Makan" )}};// AKHIR BLOK KONFIGURASI /////////////////////////////////////////////////// /////////// Beberapa perangkat tetap:LED iLED(INDICATION_LED, "LED Indikator"); // dapat dilepas jika Anda kehabisan IO'sLED hLED(HEATING_LED, "Heating LED");Manipulator CV(HEATER_PIN, "CV Heater");Pompa FUPump(FU_PUMP_PIN, "Floor Unit Pump");Termostat ZonelessThermo(NO_ZONE_THERMO , "Termostat Tanpa Zona"); // Untuk sisa rumah, tidak ada hubungannya dengan unit lantai zonevoid printConfiguration() { Serial.println("------ Konfigurasi Papan:---------"); iLED.Cetak(); hLED.Cetak(); CV.Cetak(); FUPump.Print(); ZonelessThermo.Print(); for(int i=0; i 0) { cooldownCount--; } mengembalikan checkCoolDownNeeded(); } bool checkCoolDownNeeded() { kembali (jumlah cooldown> 0); } void Print() { switch(_State) { case idle:Serial.print("idle"); merusak; kasus pada:Serial.print("on"); merusak; cooldown kasus:Serial.print("cooldown"); merusak; } }};// Status global machineState CVState;void setup() { // initializations Serial.begin(115200); printTimeStamp(); Serial.print(":");#ifdef FAST_MODE Serial.println("CV Zone Controller dimulai pada TestMode!\n" " - Waktu papan berjalan kira-kira 50 kali lebih cepat\n" " - Siklus perawatan pompa berjalan 3 jam, bukan sekali per 36 jam");#else Serial.println("Pengontrol Zona CV dimulai. Stempel waktu (dd:hh:mm:ss)");#endif Serial.println(" - Format stempel waktu (dd:hh:mm:ss)"); printKonfigurasi(); wdt_enable(WDTO_1S); // Watchdog:reset board setelah satu detik, jika tidak ada "pat the dog" yang diterima}void loop() {#ifdef FAST_MODE delay(2); // 50 kali lebih cepat sehingga menit menjadi kira-kira detik untuk tujuan debugging; jadi setiap hitungan cooldown atau idle adalah 0,002 detik#else delay(100); // Operasi normal:loop kira-kira 10 kali per detik; jadi setiap hitungan untuk cooldown atau idle adalah 0,1 detik#endif // Gunakan LED Indikasi untuk menunjukkan papan hidup iLED.Alternate(); // sekali per loop() pompa dan katup perlu memperbarui administrasi FUPump.Update(); for (int i=0; i tetap dalam kondisi ini if ​​(FloorPumpingAllowed()) { FUPump.On(); } else { FUPump.Off(); } } else if ( CVState.checkCoolDownNeeded() ) { // Lanjutkan dalam kondisi cooldown untuk menjaga pompa tetap berjalan selama beberapa saat CVState(State::cooldown); } else { // lewati cooldown untuk unit lantai, kembali ke CVState idle(State::idle); }}void coolDownProcessing() { hLED.Alternate(); if (HeatingRequested()) { // mengembalikan nilai true ketika salah satu termostat ditutup CVState(State::on); } else { if ( CVState.whileCoolDownNeeded() ) { if (FloorPumpingAllowed()) { FUPump.On(); } else { FUPump.Off(); } } else { CVState(State::idle); } }}void idleProcessing() { if (HeatingRequested()) { // mengembalikan nilai true ketika salah satu termostat ditutup CVState(State::on); } else { // Selama periode idle, pemeriksaan ini akan mengaktifkan Pompa Unit Lantai selama 8 menit per 36 jam agar tetap beroperasi if ( FUPump.doMaintenanceRun()) { if (FUPump.IsOff()) { if ( allValvesOpen() ==false ) { // mulai membuka hanya sekali printTimeStamp(); Serial.println(":Mulai siklus harian untuk Pompa Unit Lantai; katup terbuka:"); semuaValvesOn(); } if (FloorPumpingAllowed()) { // ini membutuhkan waktu sekitar 5 menit setelah mengaktifkan katup (6 detik dalam mode uji) printTimeStamp(); Serial.println(":Mulai siklus harian untuk Pompa Unit Lantai; mulai pompa "); FUPump.On(); } } } else if (FUPump.IsOn()) { // tidak diperlukan Pemeliharaan. Jadi hentikan pompa jika masih menjalankan printTimeStamp(); Serial.println(":Hentikan siklus harian untuk Pompa Unit Lantai; hentikan pompa dan tutup katup"); FUPump.Off(); semuaValvesOff(); } }}/////////////////////////////////////////////////////////////// /////////////////////// Metode Helper yang digunakan oleh State handler/////////////////// /////////////////////void allValvesOff() { for (int i=0; i 
Devices.hC/C++
// Kelas pembantu untuk perangkat IOextern void printTimeStamp(); // didefinisikan dalam file ino utama// IODevice:kelas dasar untuk semua perangkat IO; membutuhkan specializationclass IODevice { //vars protected:bool _IsOn; int _Pin; String _Nama; //konstruktor publik:IODevice(int pin, nama String) { _IsOn =false; _Pin =pin; _Nama=nama; } //metode bool virtual IsOn() =0; // abstract virtual bool IsOff() { // default untuk semua return !IsOn(); } void DebugPrint() { printTimeStamp(); Serial.print(":"); Mencetak(); } void Cetak() { Serial.print(_Name); Serial.print(" pada pin("); Serial.print(_Pin); if (_IsOn) Serial.println() =On"); else Serial.println(") =Mati"); }};// Thermostat:membaca input digital menambahkan beberapa kelas surpression dender Thermostat :public IODevice { //vars private:int _Counter; // digunakan untuk mencegah pembacaan intermiten switching (dender) //constructor public:Thermostat(int pin, String name) :IODevice(pin, name) { _Counter =0; pinMode(_Pin, INPUT_PULLUP); } //methods virtual bool IsOn() { if (digitalRead(_Pin) ==HIGH &&_IsOn ==true) // buka kontak saat aktif { if( _Counter++> 5) // hanya bertindak setelah 5 kali pembacaan yang sama { _IsOn =salah; DebugPrint(); _Penghitung =0; } } else if (digitalRead(_Pin) ==LOW &&_IsOn ==false) // menutup kontak saat off { if( _Counter++> 5) // hanya bertindak setelah 5 kali pembacaan yang sama { _IsOn =true; DebugPrint(); _Penghitung =0; } } else { _Penghitung =0; } kembalikan _IsOn; }};// Manipulator:perangkat kerja paling dasar pada kelas output digital Manipulator :public IODevice{ //vars private://constructor public:Manipulator(int pin, String name) :IODevice(pin, name) { pinMode( _Pin, OUTPUT); digitalWrite(_Pin, TINGGI); } //methods void On() { if (_IsOn ==false) { _IsOn =true; digitalWrite(_Pin, RENDAH); onSwitch(); } } void Off() { if (_IsOn ==true) { _IsOn =false; digitalWrite(_Pin, TINGGI); onSwitch(); } } virtual void onSwitch() { // pemicu untuk klausa anak; ubah status aktif/nonaktif DebugPrint(); } virtual bool IsOn() { kembali _IsOn; }};// Valve:mengontrol katup termostatik pada output digital. // Katup-katup ini bereaksi lambat (3-5 menit) sehingga kelas ini menambahkan kesadaran transisi ini// loop() harus memanggil Update() untuk melacak apakah katup terbuka penuh atau tertutupkelas Valve :public Manipulator{ private:long transitionCount; //constructor public:Valve(int pin, String name) :Manipulator(pin, name) { transitionCount =0; } bool ValveIsOpen() { kembali (IsOn() &&(transitionCount>=VALVE_TIME)); // setidaknya 5 menit dalam keadaan aktif } // Jalankan sekali per lintasan dalam loop sketsa() !!! void Update() { if (IsOn()) { if (transitionCount  0) transitionCount--; } }};// Pompa:pompa perlu diaktifkan beberapa kali seminggu agar tetap bekerja. // loop() harus memanggil Update() untuk melacak kapan aktivasi pemeliharaan diperlukanclass Pump :public Manipulator{ // valves bereaksi lambat (3-5 menit) jadi class ini menambahkan kesadaran transisi ini private:long counter; bool doMaintenance; //constructor public:Pump(int pin, String name) :Manipulator(pin, name) { counter =0; doMaintenance =salah; } bool doMaintenanceRun() { kembalikan doMaintenance; } virtual void onSwitch() { // mengubah status on/off Manipulator::onSwitch(); penghitung =0; } // jalankan metode ini setiap pass in loop() void Update() { if (IsOn()) { if (counter  250) #else if (counter++> 5) #endif { / / matikan penghitung LED=0; jika (IsOn()) Mati(); lain Aktif(); } }};

Skema

Perincian kabel periferal (Pompa, Katup, Termostat, LED) Contoh pengkabelan beberapa pengontrol 'berjenjang'. Satu pengontrol per Unit Lantai Beberapa pencatatan nyata dari Serial Monitor untuk memahami fungsinya. Stempel waktu menunjukkan mis. penundaan 5 menit antara membuka katup dan benar-benar memulai pompa unit lantai. logexample_fTczkAa0tf.txtInspirasional

Proses manufaktur

  1. Pengontrol Daya PWM
  2. Sistem Pemanas Tenaga Surya
  3. Memantau Boiler Pemanas Sentral Saya
  4. Memelihara Scrubber Lantai
  5. Pengontrol DMX yang Dioperasikan Web
  6. Perangkat Otomatisasi Tugas Video Game
  7. Pengontrol Game Arduino
  8. Unopad - Pengontrol MIDI Arduino dengan Ableton
  9. Pengontrol Tampilan Fluorescent Vakum
  10. Hubungkan Pemanas Pusat Anda ke Arduino