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

Kontrol Pengisian Kolam

Sistem untuk memantau ketinggian air, suhu, pH, ORP, tekanan filter, penggunaan listrik, dan pengoperasian pompa. Isi ulang kolam bila perlu.

Cerita

Ide

Selama musim panas tahun 2015, saya dan putra-putra saya membangun kembali seluruh sistem kolam renang kami. Ini dimulai dengan masalah dengan saluran air dan katup yang kami warisi ketika kami mendapatkan rumah, masalah filter dan perusahaan kolam renang yang pada dasarnya tidak kompeten yang merupakan peninggalan sejak kami mendapatkan rumah. Setelah mulai terlihat seperti ini, saya memutuskan sudah waktunya untuk melakukan sesuatu:

Laguna pribadi kita sendiri

Memulai

Prioritas pertama adalah membersihkan kolam dan kemudian mencari cara untuk mempertahankannya. Saya selalu menyukai otomatisasi dan saya pikir ini adalah tempat yang sempurna untuk mencobanya. Tak lama, kolam itu tampak seperti ini lagi:

Kembali ke normal

Tapi masalahnya masih ada bahwa sistem secara keseluruhan tidak memiliki kemampuan dan kecerdasan, sesuatu yang ingin saya ubah. Jadi hal pertama yang pertama, kami perlu mengganti filter, pompa, dan banyak katup. Saya menghabiskan banyak waktu di situs web bernama Trouble Free Pool dan itu adalah penyelamat bagi DIYer.

Tenaga kerja saya

Kami mengalami beberapa kemunduran, salah satunya adalah ketika mereka memasang pagar, mereka menuangkan beton di sekitar garis mulai dari sistem filter ke kolam.

Tak perlu dikatakan lagi, semua beton dan garis kolam itu harus diganti agar proyek dapat bergerak maju. Hampir semuanya harus pergi.

Awalnya saya telah memutuskan untuk memasukkan beberapa otomatisasi ke dalam sistem kumpulan baru. Saya memilih sistem pengelolaan yang disebut Autopilot. (Keluarga saya mengatakan saya memilihnya karena saya seorang pilot dan menyukai namanya! ) Sistem ini memungkinkan saya untuk mengubah kolam menjadi kolam air asin dan menangani beberapa pengelolaan, terutama menjalankan generator air asin bila diperlukan dan memompa asam untuk mengelola pH. Tidak ada otomatisasi lain di luar hal-hal itu.

Akhirnya kami menemukan semuanya. Kami juga mendapatkan kembali dapur kami yang akhirnya menjadi bengkel saya untuk proyek tersebut.

Semua Selesai:

Otomasi – Awal

Sekarang setelah pabrik fisik dipasang dan beroperasi, saya pikir akan menyenangkan untuk dapat mengisi kolam tanpa harus mengeluarkan selang setiap saat. Saya pikir dengan Raspberry Pi dan katup sprinkler normal, saya akan berbisnis! Saya membeli Pi lain (saya menggunakannya di semua tempat untuk berbagai proyek) dan mengatur apa yang saya inginkan.

Raspberry Pi3

Awalnya saya pikir saya harus bisa melakukan dua hal:

Saya mulai melakukan penelitian dan menemukan sebuah perusahaan yang memproduksi pita pengukur cair yang mengubah hambatan saat ketinggian air (atau cairan lainnya) naik atau turun. Milone juga akan dengan senang hati membuatkan unit berukuran khusus untuk saya karena tidak ada satu pun ukurannya yang sesuai dengan tempat yang saya inginkan.

eTape dari Milone

PERBARUI :Sayangnya untuk beberapa alasan Milone eTape saya terkena air di dalam jaket yang sebenarnya dan gagal. Setelah mendiskusikan masalah ini dengan Milone, saya memutuskan bahwa biaya untuk menggantinya dan berpotensi mengalami masalah yang sama, tidak sebanding dengan biaya penggantian. Lebih buruk lagi, saya membutuhkan ukuran khusus yang harus mereka buat khusus untuk saya.

Air di selubung bagian dalam menyebabkan kegagalan eTape….

Jadi saya membutuhkan cara lain untuk mengukur ketinggian kolam saya dan memutuskan untuk menggunakan salah satu dari ini:

Saklar Apung Sensor Ketinggian Air Tangki Stainless Steel Elecall

Karena perbedaan antara ketinggian air rendah dan ketinggian air normal saya sekitar tiga inci, ini bekerja dengan sempurna untuk saya. Saya hanya perlu mencari cara untuk memasangnya dan membuatnya bekerja dengan benar.

Karena saya mengenal beberapa orang lain yang menggunakan eTape dengan hasil yang bagus, saya akan meninggalkan segala sesuatu tentang eTape dalam proyek saya dan menambahkannya seperti yang saya lakukan pada setup float ganda. Dengan cara ini orang dapat melihat beberapa opsi berbeda.

Karena akan ditempatkan di seberang halaman dari tempat Pi saya akan berada, itu akan diperlukan untuk menghubungkannya ke perangkatnya sendiri untuk pelaporan. Karena saya tidak memerlukan Pi untuk ini, saya memilih klon nirkabel Arduino berdaya rendah yang dioperasikan dengan baterai yang akan mengirimkan informasi kembali ke sistem yang sudah ada yang sudah saya miliki di sekitar rumah.

Unit ini saya beli dari Low Power Labs. Saya akhirnya menggunakan empat di antaranya dalam proyek saya:satu untuk ketinggian air, satu untuk suhu air, dan dua di sistem utama untuk memantau kombinasi suhu kandang internal, tekanan filter, dan penggunaan air.

Moteino R5-USB dengan Flash dan transceiver RFM69HW 433Mhz

Klon Arduino ini menggunakan daya yang sangat rendah – hanya ~7uA dalam mode deep sleep yang berarti mereka akan bertahan sangat lama dengan dua baterai AA. Sensor suhu air saya mengapung di sekitar kolam dan sensor level saya tidak berada di dekat sumber listrik, jadi saya harus menggunakan peralatan nirkabel bertenaga baterai.

Awalnya, saya tidak berniat melakukan apa pun selain menambahkan air ke kolam secara otomatis, tetapi karena hal ini sering terjadi, proyek berkembang dengan pikirannya sendiri. Akhirnya saya akan dapat melakukan hal berikut:

Mengisi Kolam

Terlepas dari apa yang memicu perutean pengisian kolam (secara manual atau otomatis), saya harus memiliki cara untuk memasukkan air ke dalam kolam. Karena kami diharuskan memiliki pemutus vakum antara irigasi dan pasokan air kota kami, saya memilih untuk mengikatnya ke sistem sprinkler yang ada untuk mendapatkan air untuk kolam. Saya pada dasarnya membuat "zona" lain untuk sistem sprinkler saya, lengkap dengan katup.

Ini menimbulkan masalah karena jika alat penyiram saya menyala dan saya memutuskan untuk mengisi kolam, saya akan merampok zona rumput mana pun yang airnya mengalir dan itu tidak akan menyirami halaman dengan benar. Jadi saya harus memikirkan cara untuk menentukan apakah alat penyiram sedang berjalan. Awalnya saya menggunakan zona waktu "pemadaman" - yaitu, jika saya tahu alat penyiram saya bekerja dari jam 3 pagi sampai jam 6 pagi, jangan isi kolam selama waktu itu. Tapi itu sepertinya agak non-teknis. Dalam meneliti sistem sprinkler Rachio saya, saya mengetahui bahwa mereka memiliki API bawaan yang memungkinkan saya untuk menanyakan status sistem sprinkler secara terprogram. Dalam kasus saya, saya hanya punya pertanyaan sederhana:Apakah Anda berlari?

Dalam kasus saya, saya hanya menggunakan perintah curl sederhana untuk mendapatkan apa yang saya butuhkan:

rachio_url ='curl -s -X GET -H "Content-Type:application/json" -H "Authorization:Bearer xxxx-xxxxx-xx-xxxx-xxxxx-xxx" https:/ /api.rach.io/1/public/device/00xx00x-00xxx000-xxx0x000-00x0x0x0/current_schedule' 

Ini dipanggil oleh fungsi get_sprinkler_status saya seperti:

output =subprocess.check_output(pooldb.rachio_url, shell=True)if output =="{}":sprinklers_on ="Tidak" 

Aplikasi utama saya berjalan setiap 60 detik, jadi jika sprinkler saya berjalan, saya tidak melakukan apa-apa selama 60 detik dan memeriksa lagi. Akhirnya alat penyiram akan berhenti berjalan dan kolam akan mulai terisi secara otomatis.

Untuk benar-benar mengisi kolam, saya menggunakan katup penyiram AC 24V normal yang saya ambil di Home Depot. Saya memasang ini dengan katup satu arah langsung ke pipa kolam saya ke kolam saya. Katup satu arah mencegah tekanan dari pompa mendorong air ke katup penyiram saat pompa sedang beroperasi.

Saluran air dengan katup satu arah

Karena panel listrik kolam saya adalah 240V dan saya tidak memiliki netral di panel, saya harus mendapatkan trafo 240VAC ke 24VAC. Cukup sederhana. Namun, saya tidak ingin menjalankan trafo 24×7 tanpa alasan, jadi saya menggunakan relay untuk 1) menyalakan trafo dan kemudian 2) mengambil output 24VAC dari trafo dan menghubungkannya ke katup sprinkler.

Pengaturan relai

Saya menggunakan relai keadaan padat Sainsmart (sangat murah) dalam mode terisolasi secara optik di mana saya memiliki input daya terpisah yang memberi daya pada relai sebagai lawan menggunakan VCC 5v atau 3.3v dari Pi. Ini seharusnya membantu dengan gangguan dari relai.

Katup Penyiram dan Pengukur Air Cerdas

Saya juga menambahkan pengukur pintar yang dapat saya baca secara langsung untuk menunjukkan kepada saya bahwa air mengalir dan berapa banyak air dari waktu ke waktu yang telah saya gunakan. Informasi ini disimpan dalam database MySQL dan disimpan secara historis:

Layar dari sistem EmonCMS saya untuk meteran air rumah saya

Kekuatan, Kekuatan, Kekuatan

Sekarang adalah hal berikutnya yang perlu saya pikirkan. Saat pompa saya bekerja, jika saya mencoba mengisi kolam, saya akan melawan tekanan pompa. Saya menentukan dengan mengukur aliran air bahwa saya kehilangan sekitar 50% dari aliran pengisian saya saat pompa sedang berjalan, jadi saya pikir akan lebih baik untuk tidak mengisi saat pompa sedang berjalan sama sekali. Jadi saya membutuhkan cara untuk memantau daya dari pompa saya dan mencari tahu apakah pompa itu berfungsi atau tidak.

Dalam hal ini, saya memiliki cara yang sangat mudah untuk melakukannya. Setiap sirkuit di rumah saya dipantau oleh sistem pemantauan listrik. Sistem ini disebut GEM dan dijual oleh Brultech.


Pompa Kolam Renang saya adalah konsumen listrik teratas di rumah saya

Dengan sistem ini saya dapat memantau semua penggunaan listrik di rumah saya dan sebagai bagian dari pemantauan proses, saya menyimpan data ini dalam database MySQL. Jadi sekali per menit, saya hanya menanyakan database MySQL saya dan mencari tahu berapa watt yang saat ini digunakan oleh panel kolam saya.

 if pool_pump_running_watts> pooldb.max_wattage:pool_fill_control.led_control(PUMP_RUN_LED, "ON") pool_pump_running ="Ya" logger.debug('PUMP_RUN_LED harus AKTIF. Ini adalah LED KUNING') jika DEBUG :print("PUMP_RUN_LED harus ON. Ini adalah LED KUNING")else:pool_fill_control.led_control(PUMP_RUN_LED, "OFF") pool_pump_running ="Tidak" logger.debug('PUMP_RUN_LED harus OFF. Ini adalah LED KUNING') if DEBUG:print("PUMP_RUN_LED seharusnya OFF. Ini adalah LED KUNING")

Saya memiliki berbagai tombol, sakelar, dan LED pada unit fisik yang memungkinkan saya untuk melihat apakah alat penyiram sedang berjalan, pompa sedang berjalan, kolam sedang diisi, atau jika ada kesalahan sistem semacam itu . Di atas, Anda dapat melihat di mana saya mengaktifkan dan menonaktifkan LED yang menjalankan pompa saat diperlukan.

Selain LED sistem, saya memiliki tombol ON/OFF sistem (kiri atas) yang memungkinkan saya menggunakan sistem MightyHat untuk mem-boot ulang atau mematikan Pi saya secara cerdas tanpa harus masuk ke Pi untuk melakukannya dari CLI. Saya juga memiliki sakelar sesaat (kedua di sebelah kiri) yang memungkinkan saya untuk mengisi kolam secara manual saat saya mau, dan akhirnya di sisi kiri saya memiliki sakelar DPDT yang secara fisik memutus daya dari sistem saya ke katup penyiram dan memicu GPIO acara untuk memberi tahu sistem bahwa kami telah menonaktifkan pengisian kumpulan secara manual. Tidak ada yang berfungsi saat sakelar ini dipicu dan jika ada sesuatu yang gagal secara terprogram, tidak ada daya yang dapat mengalirkannya dari transformator ke katup penyiram.

Pengontrol Kolam – Eksternal

Mengelola Pompa

Seiring waktu saya menambahkan bagian lain ke sistem kontrol kumpulan saya. Kemampuan untuk mengelola pompa kecepatan variabel Pentair saya. Masukkan Russell Goldin (tageyoureit) dan project software pengontrol kumpulannya. Perangkat lunak Russell memungkinkan saya untuk berkomunikasi langsung dengan pompa kolam saya melalui antarmuka RS485. Setelah terhubung, saya dapat menanyakan pompa secara langsung untuk informasi sistem seperti RPM, GPM, dan Watt yang digunakan:

def get_pump_data(key):verbose_debug("get_pump_data() Started") verbose_debug("get_pump_data() dipanggil dengan '{}' ".format(key)) log("INFO", " get_pump_data() dipanggil dengan '{}' ".format(key)) jika pump_control_active:global json try:req =urllib2.Request(pooldb.PUMP_DATA_URL) opener =urllib2.build_opener() f =opener.open(req) data =json.load(f) pump_data =data["pump"]["1"][key] verbose_debug("get_pump_data() mengembalikan {}".format(pump_data)) log("INFO", "get_pump_data() dikembalikan { }".format(pump_data)) verbose_debug("get_pump_data() - Completed") log("INFO", "get_pump_data() - Completed") if key =="gpm":pump_gpm =pump_data update_database("pump_status", " pump_gpm", pump_gpm) log("INFO", "GPM saat ini:{}".format(pump_gpm)) log("DEBUG", "get_pump_gpm() Completed") debug("GPM saat ini:{}".format(pump_gpm )) verbose_debug("get_pump_gpm() Selesai") kunci elif =="rpm":pump_rpm =pump_data update_database("pump_status", "pump_rpm", pump_rpm) log("INFO", "RPM saat ini:{}".format(pump_rpm)) log("DEBUG", "get_pump_rpm() Completed") debug("Current RPM:{}".format(pump_rpm)) verbose_debug("get_pump_rpm() Completed") else:pump_watts =pump_data update_database("pump_status", "pump_watts", pump_watts) log("INFO", "WATTS Saat Ini:{}".format(pump_watts)) log("DEBUG", "get_pump_watts() Selesai") debug("WATTS Saat Ini :{}".format(pump_watts)) verbose_debug("get_pump_watts() Completed") mengembalikan pump_data kecuali Pengecualian sebagai kesalahan:pump_data =0 debug("EXCEPTION:get_pump_data()") log("WARN", "EXCEPTION:get_pump_data( )") log("WARN", error) debug(type(error)) debug(error) verbose_debug("get_pump_data() - Selesai dengan PENGECUALIAN") log("DEBUG", "get_pump_data() - Selesai dengan PENGECUALIAN") kembalikan pump_data else:pump_data =0 kembalikan pump_data 

Sekarang saya dapat menanyakan pompa dan mengontrol pompa saya dengan menambahkan kemampuan lain yang tidak saya miliki sebelumnya. Dengan mengubah antarmuka web saya, saya menambahkan kemampuan untuk memulai atau menghentikan pompa saya serta menjalankan salah satu dari empat program pompa berbeda yang telah saya konfigurasikan di pompa saya:

Panel kontrol pompa

Tentu saja, kita dapat melihat RPM, GPM, dan Watt secara real time:

Pengukur Pompa pada antarmuka web

Memantau Tekanan Filter

Satu hal yang juga ingin saya lakukan adalah memantau tekanan filter sehingga saya tahu kapan harus membilas filter kembali. Saya membeli sensor tekanan 100 PSI dari ebay dan mengikatnya ke filter saya di sebelah pengukur tekanan analog yang sudah ada di filter.

Saya membeli unit pengirim murah dari ebay (lihat tautan di atas) dan mengikatnya ke filer saya seperti ini:

100 PSI Sender unitPressure Sending unitSending Unit Wiring..

Saya kemudian mengikat ini menjadi Moteino-R5 dan saya membaca tekanan sekali per menit dan kemudian mengeluarkan informasi itu ke database MySQL saya dan kemudian menggunakan informasi itu untuk dorong keluaran pengukur di situs web saya.

// Dapatkan Tekanan Filter kami void get_filter_pressure() { sensorVoltage =analogRead(PSI_SENSOR_PIN); // Mari kita baca tegangan sensor tekanan PSI =((sensorVoltage-146)/204)*25; // Beberapa kalibrasi untuk mengubah tegangan ke PSI dan nolkan pool_sensors.PSI =PSI; } 

Filter Kolam Renang PSI Gauge

Perangkat Keras dan Perangkat Lunak Tambahan

Sistem utama ditulis seluruhnya dengan Python, tetapi saya menggunakan perangkat lunak dan perangkat keras lain untuk membuat sistem saya berfungsi.

Di Raspberry Pi, saya menggunakan Low Power Labs MightyHat yang menyediakan cadangan daya UPS ke Pi, layar status LCD, dan kontrol daya cerdas untuk Pi. Saya dapat menjalankan Pi selama sekitar dua jam atau lebih pada baterai kecil yang saya pasang ke sistem dan jika daya tidak kembali pada waktunya, maka MightyHat akan secara otomatis mematikan Pi untuk mencegahnya mogok karena tiba-tiba listrik mati.

Tampilan close-up MightyHat di Pi3 yang menunjukkan Peringatan Pengisian yang Berlebihan

The MightyHat adalah tiruan Arduino jadi saya menggunakan Arduino IDE untuk memprogramnya agar sesuai dengan kebutuhan proyek saya.

Untuk penginderaan, saya menggunakan berbagai sensor dan metode untuk memasukkan informasi ke dalam format yang dapat digunakan. Untuk hampir semua data sensor, saya menggunakan platform EmonCMS gratis OpenEnergyMonitor.org. Platform ini memungkinkan saya untuk mengumpulkan semua data sensor saya dari mana saja di rumah saya. Ini menyimpan informasi ini dalam database MySQL di mana saya kemudian dapat mengambilnya untuk digunakan dalam sistem kontrol kumpulan saya.

Beberapa pelacakan sensor untuk kolam sayaInformasi pelacakan tambahan

Untuk tingkat kolam yang sebenarnya, saya menggunakan pita pengukur cairan resistif eTape (http://www.milonetech.com):

eTape dan MoteinoMengejek semuanya

Salah satu papan pengontrol IO saya

Papan Pengontrol IO, Pengontrol LED, Antarmuka Daya, Papan Pengontrol IO – Belakang

Papan sensor pH dan ORP USB

Papan antarmuka sensor pH dan ORP Atlas Scientific

Untuk mendapatkan pembacaan pH dan ORP yang akurat, saya menggunakan sensor pH dan ORP Atlas Scientific serta papan antarmukanya. Saya memasangnya di sel aliran yang juga memantau apakah pompa sedang berjalan. Saya mengikat sel aliran ke dalam saluran menggunakan sambungan cepat John Guest 3/8″ standar, satu di sisi tekanan filter dan satu lagi di sisi hisap pompa untuk menjaga air mengalir melalui sel aliran.

Flow Cell (paling kiri)Flow Cell w/SensorsJohn Guest 3/8″ Threaded Quick ConnectsReturn (suction) LineOutput (Pressure) Line – dipasang SEBELUM Acid Injector

Membaca pH kami:

def get_ph_reading():log("DEBUG", "get_ph_reading() Memulai") pool_pump_running =read_pool_sensor_status_values("pool_sensor_status", "led_status", "pump_run_led" ) jika pool_pump_running" =="Benar :if pooldb.temp_probe =="Ya":pool_temp =float(read_pool_sensor_status_values("pool_sensor_status", "system_status", "pool_current_temp" )) ph_value =float(get_ph.get_current_ph_with_temp(pool_temp)) else:ph_value =float(get_ph_ph. ()) debug("PH saat ini adalah:{}".format(ph_value)) influx_data.write_data("pH", ph_value) influx_data.write_data("pool_temp", pool_temp) if pooldb.emoncms_server1 =="Ya":res =request.get("http://" + pooldb.server1 + "/" + pooldb.emoncmspath1 + "/input/post?&node=" + str( pooldb.ph_node) + "&csv=" + ph_value + "&apikey =" + pooldb.apikey1) log("DEBUG", "Sent current pH Value of {} to Emoncms Server 1".format(ph_value)) debug("Sent current pH Value of {} to Emoncms Server 1".format( ph_value)) jika pooldb.emoncms_server2 =="Ya":res =request.get("https://" + pooldb.server2 + "/" + pooldb.emoncmspath2 + "/input/post?&node=" + str( pooldb.ph_node) + "&csv =" + ph_value + "&apikey=" + pooldb.apikey2) log("DEBUG", "Sent current pH Value of {} to Emoncms Server 2".format( ph_value)) debug("Sent current pH Value of {} to Emoncms Server 2".format( ph_value)) update_pool_sensor_status_values("pool_sensor_status", "pool_chemicals", "pool_current_ph", ph_value) log("DEBUG", "get_ph_reading() Selesai") else:log("INFO", "Pool Pool TIDAK berjalan, tidak bisa mendapatkan pembacaan pH yang akurat!") debug("Pompa kolam TIDAK berjalan, tidak bisa mendapatkan pembacaan pH yang akurat!") log("DEBUG", "get_ph_reading() Selesai")

Kode ini memanggil modul “get_ph.py” yang terlihat seperti ini:

#!/usr/bin/python## Untuk digunakan dengan pool_control_master.py__author__ ='Richard J. Sears'VERSION ="V3.4 (2018-03-16)"# [dilindungi email ]# Ini hanya untuk digunakan dengan papan pH Atlas Scientific.import serialimport sysimport timefrom serial import SerialExceptionusbport ='/dev/PH'try:ser =serial.Serial(usbport, 38400, timeout=0)kecuali serial.SerialException as e:print "Error, ", e sys.exit(0)def read_line():lsl =len('\r') line_buffer =[] while True:next_char =ser.read(1) if next_char =='':break line_buffer.append(next_char) if (len(line_buffer)>=lsl dan line_buffer[-lsl:] ==list('\r')):break return ''.join(line_buffer)def read_lines():lines =[ ] try:while True:line =read_line() jika bukan line:break ser.flush_input() lines.append(line) mengembalikan baris kecuali SerialException sebagai e:print "Error, ", e return Nonedef send_cmd(cmd):"" " Kirim perintah ke Sensor Atlas. Sebelum mengirim, tambahkan Carriage Return di akhir perintah. :param cmd::return:""" buf =cmd + "\r" # tambahkan carriage return try:ser.write(buf) return True kecuali SerialException as e:print "Error, ", e return Nonedef get_current_ph_with_temp(current_temp):# send_cmd("RESPONSE,0") send_cmd ("C,0") send_cmd("T,%d" % current_temp) send_cmd("R") time.sleep(1.3) lines =read_line() mengembalikan linesdef get_current_ph_no_temp():# send_cmd("RESPONSE,0") send_cmd("C,0") send_cmd("R") time.sleep(1.3) lines =read_line() return linesdef main():# send_cmd("RESPONSE,0") send_cmd("C,0") send_cmd( "R") time.sleep(1.3) lines =read_lines() print("Tidak Ada Kalibrasi Suhu yang Dilakukan:") untuk i in range(len(baris)):print lines[i]if __name__ =='__main__':main ()

ORP dilakukan dengan cara yang sama.

Sel aliran ini juga memiliki indikator aliran yang terpasang. Jika air mengalir melalui sel, cincin naik dan menutup sakelar magnet. Pengkabelan untuk sakelar terhubung ke pin GPIO di pi. Ini kode saya untuk membaca sakelar itu:

def pool_pump_running_chemical():pool_pump_running_chemical =GPIO.input(pool_pump_running_pin) jika pool_pump_running_chemical ==Salah:debug("Pompa Kolam Berjalan melalui Ruang Sensor Kimia:TRUE - POMPA BERJALAN") else:debug( "Pompa Kolam Berjalan melalui Ruang Sensor Kimia:SALAH - POMPA MATI")

Sensor Ketinggian Air – Membuatnya berfungsi

Seperti yang saya tunjukkan di atas, sensor ketinggian air menggunakan MoteinoUBS bertenaga baterai dari LowPowerLab. Ini adalah mikrokontroler yang sempurna untuk aplikasi ini. Pada dasarnya, saya membangunkan Moteino setiap enam puluh detik, mengambil pembacaan perlawanan dari eTape, menyalakan pemancar saya dan mengirimkan informasi ini ke sistem EmonCMS saya untuk digunakan oleh skrip kumpulan saya. Lalu saya matikan semuanya lagi:

{ digitalWrite(ETAPE_POWER, HIGH); // Nyalakan daya ke eTape pool.resistance =analogRead(ETAPE); // baca resistansi etape digitalWrite(ETAPE_POWER, LOW); // Matikan daya ke eTape take_battery_reading(); // Ambil Baterai Membaca power_spi_enable(); rf12_sleep(RF12_WAKEUP); rf12_sendNow(0, &kumpulan, ukuran kumpulan); rf12_sendTunggu(2); rf12_sleep(RF12_SLEEP); power_spi_disable(); if (debug){ flash_led(50); } // Itu dia - tunggu sampai waktu berikutnya :) sleep_until_next_reading(); } 

Saya juga melacak voltase baterai saya sehingga saya tahu kapan waktunya untuk mengganti baterai saya. Script memiliki beberapa mekanisme untuk memastikan baterainya bagus. Pertama, saya secara aktif melacak tegangan baterai itu sendiri, dan kedua saya melacak seberapa sering sensor melaporkan kembali kepada saya dan delta waktu laporan tersebut. Untuk banyak bacaan yang terlewat dan saya tahu 'ada sesuatu' yang salah dengan sensor itu dan saya akan mendapatkan pemberitahuan Pushbullet untuk melihat apa yang salah. Selain itu, dengan hilangnya sensor, sistem pengisian kolam saya menjadi siaga dan akan menolak untuk mengisi kolam karena tidak tahu kapan harus berhenti.

Saya menggunakan baterai lithium 2 x AA dan sejauh ini baterai tersebut telah berjalan selama lebih dari setahun tanpa diganti.

Untuk menjaga level kolam MoteinoUSB aman, saya memerlukan semacam penutup kedap air. Saya memilih kotak tahan cuaca Adafruit dengan penutup bening.

Casing tahan cuaca Adafruit

Selanjutnya, saya menggunakan cable gland Adafruit PG-9 dan dengan sangat hati-hati mengebor sisi kotak dan memasang cable gland.

Adafruit PG-9 Cable Gland

Menggunakan kabel daya DC tahan air Adafruit, saya menghubungkan eTape ke MoteinoUSB dan enklosur.

Adafruit Kabel Daya DC Tahan Air Penutup sensor ketinggian air yang lengkap

Untuk sedikit kekeringan, saya membeli pengering untuk dimasukkan ke dalam wadah untuk menyerap dan kelembapan yang mungkin masuk ke dalam wadah. Satu hal yang harus diperhatikan yang saya pelajari dengan cara yang sulit (untungnya sensornya tidak mahal) adalah TIDAK mengencangkan bagian atas atau kelenjar kabel terlalu kencang. Ini membutuhkan sedikit trial and error. Pada akhirnya, setelah saya 'berpikir' saya benar, saya benar-benar mengisi wastafel saya dan meletakkan kandang di bawah air dan menahannya dengan panci berisi air yang diletakkan di atasnya. Saya tetap seperti ini selama beberapa jam untuk memeriksa apakah saya sudah benar.

Sekarang saya perlu mencari cara dan tempat untuk memasang sensor ketinggian air saya. Di kolam saya, kami memiliki baskom semen kecil yang digunakan untuk menampung pelampung yang secara manual menambahkan air ke kolam. Ini sudah lama berkarat dan tidak bisa diperbaiki tanpa merobek selungkup semen. Inilah yang awalnya memulai proyek saya!

Wastafel semen

Wadah semen terhubung ke kolam dengan garis kecil 3/4″ yang memungkinkan saya untuk melihat ketinggian air tetapi anak-anak yang bermain-main di kolam tidak akan mempengaruhi ketinggian air. air di baskom. Ini adalah tempat yang sempurna untuk memasang sensor eTape. Untuk melakukan pemasangan yang sebenarnya, saya mengambil sepotong pipa PVC, memotongnya menjadi dua dan kemudian mengampelasnya sehingga membentuk lingkaran yang sama dengan baskom semen. Saya kemudian mengecat bagian ini di tempat langsung ke sisi baskom. Setelah selesai, saya menggunakan beberapa sekrup drywall dan memasang eTape ke pipa PVC.

Sensor eTape dipasang ke pipa PVCSelesai Pemasangan Sensor eTape

PEMBARUAN:Metode Baru untuk membaca ketinggian air!

Jika Anda membaca di atas, saya memiliki beberapa masalah dengan instalasi eTape saya yang menyebabkan eTape saya berhenti bekerja dan memberikan pembacaan yang salah sehingga tidak dapat digunakan. Saya berbicara dengan Chris di Mileone dan kami tidak dapat menemukan alasan rekaman itu gagal. Pada akhirnya, saya tidak perlu membayar $80 lagi untuk mendapatkan kaset lain dan hal yang sama terjadi lagi, jadi saya mengganti metode pembacaan ketinggian air saya.

Karena saya benar-benar hanya memiliki perbedaan 3″ antara level rendah dan penuh, saya meneliti berbagai sensor level dan memilih yang ini:

Elecall Tangki Stainless Steel Water Level Sensor Float Switch

Jadi saya harus mencari cara untuk memasang sensor baru. Saya memutuskan bahwa saya akan menggunakan sone 1/4″ plexiglas untuk membuatnya bekerja. Saya mengukur lebar yang saya butuhkan dan memasang pelampung dengan sekrup set tambahan sehingga saya bisa melakukan penyesuaian yang baik. Saya juga menempelkan level kecil padanya sehingga ketika saya memasangnya akan menjadi level:

Untuk memasangnya, saya hanya menggunakan beberapa epoksi dan meratakannya menggunakan “level bawaan:

Untuk membaca level pool, saya perlu mengetahui posisi kedua float. Jadi saya memprogram kode saya untuk membaca posisi kedua pelampung dan kemudian mengirim 0, 1 atau 2 tergantung pada ketinggian air.

Jika pelampung atas terbuka dan pelampung bawah terbuka (keduanya mengapung ke bawah) maka kita rendah dan mengirimkan "0". Jika pelampung bawah tertutup (atas) dan pelampung atas terbuka (bawah) maka kami berada di tengah jalan dan kami mengirim "1". Jika kedua pelampung ditutup (atas) kolam penuh dan kita tidak membutuhkan air. Berikut tampilan kodenya:

UPPER_Float =digitalRead(17);LOWER_Float =digitalRead(3); if (UPPER_Float ==RENDAH) { UPPER_Float_Position ="Tutup"; } else { UPPER_Float_Position ="Buka"; } if (LOWER_Float ==LOW) { LOWER_Float_Position ="Tutup"; } else { LOWER_Float_Position ="Buka"; } if ((UPPER_Float ==RENDAH) &&(LOWER_Float ==RENDAH)) { pool_level.level =2; // Both closed =Pool is FULL } else if ((UPPER_Float ==HIGH) &&(LOWER_Float ==LOW)) { pool_level.level =1; // Lower closed, Upper open =Pool MIDWAY } else { pool_level.level =0; // Both floats open =Pool LOW add water }

So the value of 0, 1 or 2 is transmitted to EmonCMS and written to my database. Each minute we query that database to see if we need to add water:

get_pool_level_value =read_emoncms_database("data", pooldb.pool_level_table)

and if it is low, we add water:

if get_pool_level_value ==0:get_pool_level ="LOW" pool_fill_valve("OPEN")

And this is the new way we are reading our pool level and managing filling our pool.

Pool Temperature Sensor – Making it work

Following in the footsteps of my eTape sensor, I build the same configuration for my pool temperature sensor. This time however, I added a temp probe inside the enclosure so I could monitor the temperature in the enclosure. It would also let me know what the temperature was just above the surface of the water in the pool. The second temperature sensor was fed through the PG-9 cable gland and into the pool water. I then just tossed the enclosure into the pool and thought I was done. However, my kids had other ideas. They thought it was fun to grab the temperature sensor hanging down from the enclosure and spin it around like a top and throw it at each other. Needless to say the first one didn’t last long.

So I went down to my local pool store and purchased a chlorine floater and installed the enclosure and temp probe into it. We have not had a problem since doing so. Even if they throw it, it won’t bother it at all. Most people leave it alone since they think it is chlorine even though we have a saltwater pool.

Pool temp sensor floaterPool temp sensor floater

Keeping track of our Acid Level

Part of the pool automation system that is not handled by my project is the dispensing of muriatic acid to keep our pH under control. While the Pool Auto Pilot system handles that, we still need to be able to see if we need acid added to the tank. For this I used a $9.00 DFRobot Liquid Level Sensor:

XKC-Y25-T12V Liquid Level Sensor

This particular sensor is weatherproof and works by sensing when there is no longer liquid behind whatever you have it attached to and then sending a signal to the GPIO that you can read. Once you can read it, you can then do your alerting, etc.

I simply connected this to my Pi (it utilizes the 5v rail and one GPIO pin) and then added in a little bit of code to read the state of the sensor:

def acid_level():acid_level_ok =GPIO.input(acid_level_sensor_pin) if acid_level_ok ==True:

I then epoxied the sensor to our acid tank at the level where I wanted to be notified and hooked it all up:

This tank has a pretty thick wall and this sensor worked great. I tested it before affixing it just to make sure.

Web Interface

V3.5.0 Web Interface

Once I had all of this pretty much working like I wanted it, I decided that I needed to have a nice interface so we could track all of the data, manually add water to the pool without having to go to the pool room, stop an automatic fill that may be in progress and check the status of the batteries in our temperature sensor and our level sensor.

The main capabilities of the web interface as of right now are:

I am very thankful to Russell Goldin ([email protected]) for his amazing work on the Pentair RS-485 control software needed for my system to be able to talk to and control my pump. You can check out his github HERE.

With Russ’s software I am able to directly control my Pentair pump without having to spend several thousand dollars on their proprietary hardware!

I spent a lot of time programming everything in python but I did not have an experience building a web interface so I asked around and eventually decided on Flask as the web framework that I would use to build the web interface.

Learning Flask was not as hard as I had thought it was going to be and it integrates very well with the python code that I had already written to control the pool. Flask is a mix of python-like code and html like templates and did everything that I needed it to do:

Upper Control PanelSystem GaugesLower Panel

The control part of the interface is very easy. If I want to start a manual fill, I simply click on the “Manual Fill” button and as long as there is not a system problem, we are not running the sprinklers and we are not already “automatically” filling the pool, the system starts a manual fill of the pool. The “Pool Filling” led will turn blue, than “Manual Fill” button will toggle on and the “Fill Timer” will start a countup. Click the “Manual Fill” button again and the system stops filling and reverts back to normal.

If we are filling the pool automatically and I want to stop that process, I simply click the “Pool Filling” button (led reverts to button to show that you can push it to stop the automatic fill) and the system stops filling and sends me notifications based on the configuration of the system (debug, logging, email, pushbullet, sms).

Flask has the ability to process things prior to showing you the html output:

{% if system_error_led =="True" %}  {% elif system_run_led =="True" %}  {% else %}  {% endif %}

In this example, if there is a system error I show a red led, otherwise if the system is running I show a green led and if I am not running and there is no error, then I show a grey led. This statement is processed before the html is rendered and is a very powerful way to interact with a python driven system.

Historical Graphing

As I continue to extend the system and learn more about what I can do, I wanted to start to watch historical trends in my pool system along with a lot of other home automation stuff I have been playing around with lately. After looking around I choose Grafana and InfluxDB.

Basically I already had my data being recorded utilizing EmonCMS so I just needed to have a quick way to get it into InfluxDB so Grafana could do it’s magic. Basically within the mail pool program whenever I get a pH, ORP or temp reading, I write it to the influxdb:

def get_ph_reading():log("DEBUG", "get_ph_reading() Started") pool_pump_running =read_pool_sensor_status_values("pool_sensor_status", "led_status", "pump_run_led" ) if pool_pump_running =="True":if pooldb.temp_probe =="Yes":pool_temp =float(read_pool_sensor_status_values("pool_sensor_status", "system_status", "pool_current_temp" )) ph_value =float(get_ph.get_current_ph_with_temp(pool_temp)) else:ph_value =float(get_ph.get_current_ph_no_temp()) debug("Current pH is:{}".format(ph_value)) influx_data.write_data("pH", ph_value) influx_data.write_data("pool_temp", pool_temp) if pooldb.emoncms_server1 =="Yes":res =requests.get("http://" + pooldb.server1 + "/" + pooldb.emoncmspath1 + "/input/post?&node=" + str( pooldb.ph_node) + "&csv=" + ph_value + "&apikey=" + pooldb.apikey1) log("DEBUG", "Sent current pH Value of {} to Emoncms Server 1".format(ph_value)) debug("Sent current pH Value of {} to Emoncms Server 1".format(ph_value)) if pooldb.emoncms_server2 =="Yes":res =requests.get("https://" + pooldb.server2 + "/" + pooldb.emoncmspath2 + "/input/post?&node=" + str( pooldb.ph_node) + "&csv=" + ph_value + "&apikey=" + pooldb.apikey2) log("DEBUG", "Sent current pH Value of {} to Emoncms Server 2".format( ph_value)) debug("Sent current pH Value of {} to Emoncms Server 2".format( ph_value)) update_pool_sensor_status_values("pool_sensor_status", "pool_chemicals", "pool_current_ph", ph_value) log("DEBUG", "get_ph_reading() Completed") else:log("INFO", "Pool Pump is NOT running, cannot get accurate pH reading!") debug("Pool pump is NOT running, cannot get accurate pH reading!") log("DEBUG", "get_ph_reading() Completed") 

and from influx_data.py:

import syssys.path.append('../')from influxdb import InfluxDBClientimport pooldbdef write_data(measurement, value):client =InfluxDBClient(pooldb.influx_host, pooldb.influx_port, pooldb.influx_user, pooldb.influx_password, pooldb.influx_dbname) json_body =[ { "measurement":measurement, "fields":{ "value":value } } ] client.write_points(json_body)

From there it is a simple matter of setting up Grafana to look at the InfluxDB and make the graphs:

Notifications

My system relies heavily on notifications. Currently the system can provide notifications via logging to a log file, debug messages to stdout allowing for the running of the main program from the command line with valuable, immediate feedback, pushbullet, email and SMS via Twillio. Because of all they types of notifications as well as areas where there can be notifications, I created a system which allows me to fine tune my notifications very easily via my web interface.

By setting up the code in this manner, I can very easily and quickly adjust my notification settings as well as different categories that I want to have those notifications applied to at that time. In future versions of the code, I am going to create an entire “Notifications” panel that allows me the ability to set specific notification types by category. For example I might want an SMS message about filling events, but email notifications about system errors and pushbullet notifications about my pump. In this manner I am able to tweak all of my notification settings to be exactly how I want then to notify me…both the how and the when!

Current Notification Settings Panel
root scruffy:www # ./pool_control_master.pyStarted is_database_online()MightyHat Serial setup completedSystem Reset Status =No Reset RequestedStarted get_pool_temp()get_pool_temp returned 67.30Fpool_temp in C is 19.61Started is_pool_pump_running()pool_pump_running_watts returned 563 watts in use by pump.PUMP_RUN_LED should be ON. This is the YELLOW LEDCurrent unix datetime stamp is:1521835161Pool LEVEL sensor last updated at:1521835044Pool LEVEL sensor battery voltage is:3.2Pool LEVEL sensor battery percentage is 100Pool TEMP sensor last updated at:1521835131Pool TEMP sensor battery voltage is:3.2Pool TEMP sensor battery percentage is 100Pool FILTER PSI is:21Time dfference between last pool LEVEL sensor reading is:117 seconds.Time dfference between last pool TEMP sensor reading is:30 seconds.Everything appears to be OK with the pool sensors!pool_sensors:Pool Resistance is:724pool_sensors:Pool Level Percentage is:85pooldb:Static critical pool level resistance set at (740).pooldb:Static normal pool level resistance set at (710).Our Pool Level is MIDWAY.Total Gallons:22462Acid Level OKTotal Current Power Utilization:2039 wattsTotal Current Power Import:415 wattsTotal Current Solar Production:1624 wattsCurrent GPM:15Current RPM:2225Starting get_ph_reading().Current pH is:7.043Sent Emoncms Server 1 current PH Value:7.043Sent Emoncms Server 2 current PH Value:7.043Completed get_ph_reading()Starting get_orp_reading().Sent Emoncms Server 1 current ORP Value:669.8Sent Emoncms Server 2 current ORP Value:669.8Completed get_orp_reading()

Running from the cli

Alexa Skill and Interface

One of the last things I wanted to tackle was to integrate my pool control system with Alexa. We have Echo Dots and Echo Shows and I wanted to use the visual Echo Show when I could. So I spent a bunch of time learning how to do Alexa skills and then I used the Python microframework Flask-Ask to program the interconnection between my pool control system and the Alexa Skill.

It was a very interesting learning curve, but now I can query Alexa and get all of our pool stats and we can fill (or stop filling) our pool via voice commands:

Alexa Show Interface with pool, electrical and solar stats

Conclusion

I am running V3.5.0 of my code now which seriously changes the way I am checking sensors, and handling error checking. I have also started breaking out my code into separate python functions instead of a monolithic block of 4,000+ lines of code. I will put it up and include all of the Flask programming as well.

This project has taught me a lot about programming, the Pi and Arduinos.

Pool Control System – InternalPool Control System – External

To view all of the code, please visit my Github site HERE! Thank you for reading about my project.

Source: Pool Fill Control


Proses manufaktur

  1. Sirkuit Kontrol
  2. Penyemprot Rumput
  3. Kolam Renang
  4. Pencuci Piring
  5. Meja Biliar
  6. Pistol Air
  7. Fill Dam
  8. Toilet
  9. Pil KB
  10. Hidran Kebakaran