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

Detektor Kebocoran Air dan Kontrol Katup

Komponen dan persediaan

Penutup aluminium
× 1
Arduino UNO
× 1
Arduino Ethernet Shield 2
× 1
Suplai daya
× 1
Rumah AC
× 1
Kit LED dengan resistor
× 1
Relay ( 1 dual 5v dan 1 dual 12v )
× 1
Katup bermotor
× 1
konektor JST
× 1
Sensor air
× 1

Tentang proyek ini

Ikhtisar

Saat mengobrol dengan seorang teman, saya menyadari kebocoran air adalah masalah besar. Teman saya harus mengganti semua perabotan di ruang bawah tanahnya, hanya karena ada pipa yang putus saat dia sedang bekerja.

Proyek ini mirip dengan yang saya terbitkan untuk kontes Microsoft IoT tetapi yang ini didasarkan pada Arduino, bukan pada Raspberry. Sudut pandang saya adalah sebagai berikut:daripada memusatkan banyak tanggung jawab pada platform besar (seperti RasPi, DragonBoard, atau PC), saya lebih suka mendelegasikan tanggung jawab sederhana untuk perangkat sederhana (seperti Arduino dan lainnya). Mereka akan melakukan apa yang seharusnya mereka lakukan dan, sebagai opsi, mereka akan terhubung melalui jaringan ke perangkat lain (sederhana atau kompleks) untuk menawarkan layanan lanjutan. Jika terjadi kegagalan jaringan, mereka masih terus melakukan apa yang seharusnya mereka lakukan.

Pada dasarnya, ini memonitor kebocoran air dan memicu tindakan seperti menutup pintu masuk air utama, tergantung pada kesalahan yang terdeteksi.

Itu juga menerbitkan pesan ke Pialang MQTT. Idenya adalah bahwa perangkat harus mengelola air secara lokal tetapi juga terlibat, bersama dengan perangkat lain, dalam sistem yang lebih besar yang mengelola Otomatisasi Rumah.

Berikut tampilannya:

Pintu masuk air utama terletak di bagian bawah. Perangkat pertama dipasang oleh layanan pasokan air kota untuk mengontrol tekanan air. Saya memasang bagian di atas gambar. Katup bermotor (berwarna biru) dipasang secara paralel dengan katup manual. Dalam gambar ini, katup manual dibuka dan oleh karena itu katup bermotor dilewati. Ini berguna jika terjadi pemadaman listrik. Dalam mode normal, katup manual harus dimatikan.

Ada motor DC (12v) di dalam katup dan berputar searah jarum jam atau berlawanan arah jarum jam tergantung pada polaritasnya. Ada loop umpan balik yang menunjukkan apakah katup hidup atau mati secara efektif. Untuk menyalakannya, cukup berikan tegangan positif ke sambungan kiri atas.

Ini pengontrolnya:

Dari kiri ke kanan:steker AC, tombol reset, beberapa LED untuk menampilkan status, konektor (ke sensor, ke motor), Ethernet, dan antarmuka USB.

  • LED1 :Steady Red =air terdeteksi secara lokal, Berkedip Merah =air terdeteksi dari jarak jauh, Off =tidak ada kebocoran air
  • LED 2 :Stabil Kuning =tidak dapat mengontrol katup bermotor, Berkedip Kuning =tidak dapat mencapai broker MQTT, Mati =baik-baik saja
  • LED3 :Stabil Biru =semua baik, Berkedip Biru=katup bermotor ditutup Mati =sistem mati atau tidak bertenaga

Ini adalah sensor yang terletak di tempat yang menurut saya air bisa bocor:

Inilah yang ada di bawah tenda:

PERINGATAN!

Catu daya AC/DC yang saya gunakan memiliki dua keluaran:yang pertama adalah 12V DC dan digunakan untuk memberi makan katup bermotor (dikontrol oleh dua relai yang mengontrol putaran motor) dan yang kedua adalah PERSIS 5V DC, untuk memberi makan Arduino. Itu sebabnya saya memberi makan langsung di sirkuit 5V, bukan Vin yang membutuhkan setidaknya 6V DC. Setelah AC/DC terhubung, Anda seharusnya TIDAK PERNAH (saya katakan TIDAK PERNAH) mencolokkan baik jack Arduino DC maupun kabel USB Arduino. Jika Anda masih ingin men-debug melalui USB, siapkan kabel buatan sendiri TANPA kabel listrik, simpan jalur data saja. Omong-omong, hubungan antara rumah AC dan catu daya AC/DC adalah 110V. Jangan sentuh, selamanya!

Kode

  • Deteksi kebocoran air dan kontrol katup bermotor
  • Perpustakaan MQTT
Deteksi kebocoran air dan kontrol katup bermotorArduino
#include #include #include #include #include #include #include /* Berikut adalah cara kerja HWAda tiga subsistem:- kotak utama:- Arduino Uno dengan dan Ethernet shield - LED merah:stabil ketika air terdeteksi berkedip lokal ketika air terdeteksi dari jarak jauh, mati jika tidak - LED kuning :stabil saat katup rusak, berkedip saat broker MQTT tidak terjangkau (karena alasan apa pun), mati jika tidak - LED biru:stabil saat katup terbuka dan sistem memantau kebocoran, berkedip saat katup dimatikan apakah sistem mati - tombol tekan:sekali ditekan, swa-uji dipicu - relai ganda untuk mengontrol katup bermotor jarak jauh - relai ganda lain untuk merasakan sakelar batas buka/tutup yang dipasang pada katup jarak jauh- satu set air detektor (semua paralel) (semua 3 konektor pada panel depan terhubung secara paralel)Katup bermotor memiliki koneksi berikut:- Kuning dan B lue :DC untuk menyalakan motor- Hitam :input limit switch (akan diatur ke GND di sirkuit kami)- Merah =akan berubah menjadi GND ketika katup mencapai posisi tertutup penuh (catatan:karena desain internal limit switch , tidak ada jaminan kontinuitas akan tetap ada setelah katup dimatikan)- Hijau =akan berubah menjadi GND ketika katup mencapai posisi terbuka penuh (catatan:karena desain internal sakelar batas, tidak ada jaminan kontinuitas itu akan tetap setelah katup dimatikan)*/// Networkbyte mac[] ={ 0xDE, 0xAD, 0xBE, 0xCF, 0xFC, 0xEE }; // alamat MAC ArduinoIPaddress ip(192, 168, 12, 215); // alamat IP IPA server alamat Arduino (192, 168, 12, 130); // alamat broker MQTTEthernetClient ethClient;// MQTT PubSubClient client(ethClient); #define mqttClientPrefix "GLX" // Awalan untuk menggunakan publikasi/langganan MQTT #define mqttClientLocation "BASEMENT" // Bagian kedua dari pengidentifikasi klien#define mqttClientUID "001" // Bagian terakhir dari pengidentifikasi klien#define mqttClientStatus"Topic" // Topik yang akan digunakan untuk mempublikasikan status perangkat #define mqttClientFaultTopic "Fault" // Topik yang akan digunakan untuk mempublikasikan/berlangganan Faultsconst int mqttInterval =20; // menentukan seberapa sering sistem akan melapor ke broker MQTT (yaitu setiap mqttInterval * mainLoopDelay ms )int mqttIntervalCnt =0; // variabel lokal yang digunakan untuk menghitung mundur isConnectedToBroker =-1; // 1 saat terhubung, -1 =tidak diketahui, 0 =tidak dapat terhubung// Pin-outconst int SystemLedPin =A0; // LED const int FaultLedPin =A1; // LED const int AlarmLedPin =A2; // led merah const int WaterDetectorPin =2; // pergi ke LOW ketika air terdeteksi, sebaliknya ditarik ke VCCconst int ToggleButtonPin =3; // pergi ke LOW ketika seseorang menekan tombol dan kemudian pergi ke HIGH ketika tombol dilepaskan, jika tidak pull-down ke GNDconst int SdCardPin =4; // Kartu SD pada pelindung ethernet, tidak digunakanconst int ValveClosedPin =5; // menuju LOW ketika motor mencapai batas sakelar tertutup, jika tidak, pull-up ke HIGHconst int ValveOpenedPin =6; // menuju LOW ketika motor mencapai batas sakelar terbuka, jika tidak, tarik ke HIGHconst int ValveControl1 =8; // untuk mengontrol relai pertama yang mengontrol catu daya katup bermotorconst int ValveControl2 =7; // untuk mengontrol relai kedua yang mengontrol catu daya katup bermotor // Catatan jangan gunakan D10, D11, D12 dan D13 karena pin tersebut dicadangkan untuk pelindung Ethernet// WaterLeakage (lokal) int isWaterDetected =0; // status sesuai pembacaan terakhir yang baik// WaterLeakage (remote)int isWaterDetectedRemotely =0; // status sesuai pesan yang diterima dari perangkat pemantauan lain// Katup bermotor isValveClosed =-1; // status katup bermotor (-1 =tidak diketahui, 0 =terbuka, 1 =tertutup))const int valveTimeOut =15; // dalam detik, waktu maksimum yang diizinkan untuk membuka atau menutup valveint isConnectedToValve =-1; // 0 ketika sistem tidak dapat mengontrol katup bermotor, 1 =terhubung, -1 =tidak diketahui// Manual RESET buttonvolatile boolean isResetRequested =0; // yang ini akan berubah ketika tombol memicu interupsi// Logicconst int mainLoopDelay =500; // penundaan tetap dalam loop utama, di msvoid(* resetFunc) (void) =0;// Inisialisasi void setup(){ wdt_disable(); //selalu baik untuk menonaktifkannya, jika dibiarkan 'on' atau Anda memerlukan init time Serial.begin(9600); Serial.println(F("Mulai setup")); // HW setup pinMode (SystemLedPin, OUTPUT); pinMode (FaultLedPin, OUTPUT); pinMode (AlarmLedPin, OUTPUT); pinMode (WaterDetectorPin, INPUT); pinMode (ToggleButtonPin, INPUT); pinMode (ValveOpenedPin, INPUT); // Relai 12V DC dalam keadaan idle secara default. Pin terhubung ke NO sisi relay 1 tetapi ada pull-up. Pin karena itu TINGGI secara default. pinMode (ValveClosedPin, INPUT); // Relai 12V DC dalam keadaan idle secara default. Pin terhubung ke NO sisi relay 2 tetapi ada pull-up. Pin karena itu TINGGI secara default. pinMode (ValveControl1, OUTPUT); digitalWrite(ValveControl1, TINGGI); // Relai 5V DC 1 dalam keadaan idle secara default, yaitu motor terhubung ke mode pin GND (ValveControl2, OUTPUT); digitalWrite(ValveControl2, TINGGI); // 5V DC relay 2 idle secara default, yaitu motor terhubung ke GND pinMode(SdCardPin, OUTPUT); digitalWrite(SdCardPin, TINGGI); // untuk menonaktifkan kartu SD karena kami tidak menggunakannya // Tes mandiri testLeds(); // Jaringan dan setup MQTT client.setServer(server, 1883); client.setCallback(MQTTBrokerCallback); Ethernet.begin(mac, ip); Serial.print(F("IP saat ini adalah :")); Serial.print(Ethernet.localIP()); Serial.print(F(" - IP broker MQTT adalah :")); Serial.println(server); // Awalnya, kami tidak tahu status katup dan sakelar batas tidak begitu andal. // Mari kita buka katup bermotor dan tunggu sampai selesai. Kasus terburuk, jika sudah dibuka, itu hanya akan menekan sakelar batas sebentar if (openValve() ==0) { Serial.println(F("Valve terbuka dan sistem sedang memantau")); // Ada perangkat pemantauan lain di rumah, mari kita dengarkan kesalahan yang bisa mereka laporkan ke broker MQTT subscribeToRemoteWaterSensors(); } else { Serial.println(F("Tidak dapat membuka katup, sistem rusak. Silakan gunakan bypass pipa")); }; aktifkanInterruptOnResetButton(); penundaan (1500); // izinkan perangkat keras untuk mengurutkan sendiri Serial.println(F("End of setup")); }// Main loopvoid loop(){ // LEDs configureLedsWithInitialStates(); // Bereaksi untuk mereset permintaan if (isResetRequested ==1) { Serial.println(F("Seseorang menekan tombol untuk mereset perangkat ini")); publishStatus(); wdt_enable(WDTO_1S); //aktifkan pengawas, akan menyala dalam penundaan 1 detik(5000); Serial.println(F("Pesan ini tidak akan pernah muncul")); } // Mari kita periksa sekarang apakah kebocoran air telah terdeteksi readLocalWaterSensor(); if (isWaterDetected ==1 || isWaterDetectedRemotely ==1) { if (isValveClosed ==0){ closeValve();}; } // Publikasikan ke broker MQTT if (mqttIntervalCnt ==0) { if (isWaterDetected ==1){ publishFault();} publishStatus(); mqttIntervalCnt =mqttInterval; } else { if (isConnectedToValve ==0) { Serial.println(F("Sistem rusak - tidak dapat mengontrol katup bermotor. Tidak ada pemantauan")); } else { Serial.print(F(".")); } mqttIntervalCnt =mqttIntervalCnt - 1; } // Istirahat sejenak (mainLoopDelay / 2 ); klien.loop(); // LEDs configureLedsWithFinalStates(); penundaan(mainLoopDelay/2); }//// Manajemen sensor air lokal//void readLocalWaterSensor(){ isWaterDetected =!getDebouncedValue(WaterDetectorPin, 100, 10); Serial.print(isWaterDetected); }//// Atur ulang manajemen tombol//void enableInterruptOnResetButton(){ isResetRequested =0; attachInterrupt(1, onResetRequested, CHANGE);}void onResetRequested(){ detachInterrupt(1); isResetRequested =1; }// Kelola urutan pembukaan katupint openValve(){ Serial.print(F("Pembukaan katup...")); // pertama, pastikan katup telah ditutup dengan memaksa motor untuk menekan sebentar sakelar batas "tertutup" lagi (karena sakelar batas itu tidak begitu andal...) setupRelays(1); if (waitForEndOfCycle(ValveClosedPin) ==0) { // sekarang, coba buka valve setupRelays(2); if (waitForEndOfCycle(ValveOpenedPin) ==0) { isConnectedToValve =1; isValveClosed =0; setupRelay (0); // power relay OFF Serial.println(F("")); kembali 0; } } setupRelays(0); // relai daya OFF isConnectedToValve =0; return -1;}// Kelola urutan penutupan katup di closeValve(){ Serial.print(F("Menutup katup...")); // pertama, pastikan katup terbuka dengan memaksa motor untuk menekan sebentar sakelar batas "buka" lagi (karena sakelar batas itu tidak begitu andal...) setupRelays(2); if ( waitForEndOfCycle(ValveOpenedPin) ==0) { // sekarang, coba tutup valve setupRelays(1); if (waitForEndOfCycle(ValveClosedPin) ==0) { isConnectedToValve =1; isValveClosed =1; setupRelay (0); // power relay OFF Serial.println(F("Valve telah dimatikan. Harap periksa dengan cermat semua ruangan dan detektor pembersihan")); kembali 0; } } setupRelays(0); // relai daya OFF isConnectedToValve =0; return -1;}// Atur relai untuk memberi makan motor dengan polaritas yang tepatvoid setupRelay(int scenario){ switch (skenario) { kasus 0:// semua OFF, tidak ada daya yang dikirim katup bermotor digitalWrite(ValveControl1, HIGH ); digitalWrite(ValveControl2, TINGGI); merusak; kasus 1:// siklus penutupan digitalWrite(ValveControl1, HIGH); digitalWrite(ValveControl2, RENDAH); merusak; case 2:// siklus pembukaan digitalWrite(ValveControl1, LOW); digitalWrite(ValveControl2, TINGGI); merusak; default:Serial.print(F("Skenario relay tak terduga:")); Serial.println(skenario); digitalWrite(ValveControl1, TINGGI); digitalWrite(ValveControl2, TINGGI); merusak; }}// Tunggu sampai sakelar batas ditekan oleh motor katup bermotor int waitForEndOfCycle(int limitSwitchPin){ int cnt =valveTimeOut; while (cnt> 0) { if (getDebouncedValue(limitSwitchPin, 10, 10) ==LOW) { return 0; } cnt =cnt - 1; Serial.print(F(".")); penundaan (1000); }; Serial.println(F(" - batas waktu tercapai saat menutup katup. Periksa apakah katup menyala dengan baik dan kabel terhubung.")); return -1;}// Rutin ini membantu menghindari alarm palsusint getDebouncedValue(int inputPin, int intervalInMs, int requiredConfirmations){ int konfirmasi =1; int currentValue =digitalRead(inputPin); while (konfirmasi <=diperlukanKonfirmasi) { delay(intervalInMs); if (currentValue ==digitalRead(inputPin)) { konfirmasi =konfirmasi + 1; } else { konfirmasi =1; currentValue =digitalRead(inputPin); } } mengembalikan currentValue;}//// manajemen LED//void configureLedsWithInitialStates(){ clearLeds(); // Evaluasi ulang jika (isWaterDetectedRemotely ==1 || isWaterDetected ==1) { digitalWrite(AlarmLedPin, HIGH);}; if (isConnectedToValve ==0 || isConnectedToBroker ==0) { digitalWrite(FaultLedPin, HIGH);}; digitalWrite(SystemLedPin, HIGH);}kosongkan configureLedsWithFinalStates(){ if (isWaterDetectedRemotely ==1) { digitalWrite(AlarmLedPin, LOW);}; if (isConnectedToBroker ==0) { digitalWrite(FaultLedPin, RENDAH);}; if (isValveClosed ==1) { digitalWrite(SystemLedPin, RENDAH);}; }void clearLeds(){ digitalWrite(AlarmLedPin, RENDAH); digitalWrite(FaultLedPin, RENDAH); digitalWrite(SystemLedPin, LOW);}void testLeds(){ clearLeds(); digitalWrite(AlarmLedPin, TINGGI); penundaan (500); digitalWrite(FaultLedPin, TINGGI); penundaan (500); digitalWrite(SystemLedPin, TINGGI); penundaan (500); clearLeds();}//// Fungsi terkait MQTT//// Menangani pesan MQTT masukvoid MQTTBrokerCallback(char* subscribedTopic, byte* payload, unsigned int length){ Serial.print(F("Pesan baru diterima dari broker MQTT. Topik =")); Serial.print(BerlanggananTopik); String payloadAsString =(char*)payload; String realPayload =payloadAsString.substring(0,length); // jika tidak kita mendapatkan sampah karena buffer dibagi antara In dan Out Serial.print(F(", content=")); Serial.print(realPayload); if (realPayload.indexOf("WaterDetected")> 0 &&realPayload.indexOf(mqttClientLocation) ==-1 ) // bagian kedua dari tes diperlukan untuk menghindari kesalahan yang dipicu sendiri { isWaterDetectedRemotely =1; } // untuk (int i=0;i 

Skema


Proses manufaktur

  1. Katup untuk Mematikan dan Kontrol yang Sulit
  2. Sensor Pi Raspberry dan Kontrol Aktuator
  3. Kontrol Pengisian Kolam
  4. Debugging Inti Ganda Portenta H7
  5. Kontrol Jarak Jauh Universal menggunakan Arduino, 1Sheeld, dan Android
  6. Animasi dan Permainan LCD
  7. Kontrol Penerima Koin dengan Arduino
  8. Pusat Kontrol Arduino
  9. Detektor Frekuensi Audio
  10. Arduino dengan Bluetooth untuk Mengontrol LED!