Isi kandungan:

Pam Mesin Kopi Pintar Dikendalikan oleh Raspberry Pi & Sensor Ultrasonik HC-SR04 dan Cloud4RPi: 6 Langkah
Pam Mesin Kopi Pintar Dikendalikan oleh Raspberry Pi & Sensor Ultrasonik HC-SR04 dan Cloud4RPi: 6 Langkah

Video: Pam Mesin Kopi Pintar Dikendalikan oleh Raspberry Pi & Sensor Ultrasonik HC-SR04 dan Cloud4RPi: 6 Langkah

Video: Pam Mesin Kopi Pintar Dikendalikan oleh Raspberry Pi & Sensor Ultrasonik HC-SR04 dan Cloud4RPi: 6 Langkah
Video: Sinyal otak dan pikiran kita bisa mengendalikan benda dari jauh - CLICK|BBC News Indonesia 2024, Jun
Anonim
Pam Mesin Kopi Pintar Dikendalikan oleh Raspberry Pi & Sensor Ultrasonik HC-SR04 dan Cloud4RPi
Pam Mesin Kopi Pintar Dikendalikan oleh Raspberry Pi & Sensor Ultrasonik HC-SR04 dan Cloud4RPi

Secara teori, setiap kali anda pergi ke mesin kopi untuk cawan pagi anda, hanya ada satu-dua puluh peluang anda perlu mengisi tangki air. Walau bagaimanapun, dalam praktiknya mesin tersebut mencari jalan untuk selalu mengerjakan tugas ini. Semakin anda mahukan kopi, semakin besar kemungkinan anda mendapat pesanan "isi tangki air" yang ditakuti. Rakan sekerja saya merasakan perkara yang sama dalam hal ini. Sebagai kutu buku yang ada, kami memutuskan untuk menerapkan teknologi yang akan mengakhiri ini.

Bekalan

Peralatan Kami

Kami mempunyai mesin kopi SAECO Aulika Focus. Sehingga hari ini, kami menggunakan pam tangan untuk mengisi tangki air mesin dari botol air 5 Gallon (19L) standard.

Matlamat Kami

  1. Gunakan pam elektrik yang digerakkan oleh beberapa jenis pengawal atau komputer mikro melalui geganti.
  2. Mempunyai cara untuk mengukur paras air di tangki mesin kopi sehingga sistem kami tahu kapan harus mengisi semula.
  3. Mempunyai kaedah untuk mengawal sistem, lebih baik dalam masa nyata dari peranti mudah alih.
  4. Terima pemberitahuan (melalui Slack atau perkhidmatan serupa) jika ada yang tidak kena dengan sistem.

Langkah 1: Memilih Peralatan

Memilih Peralatan
Memilih Peralatan
Memilih Peralatan
Memilih Peralatan
Memilih Peralatan
Memilih Peralatan
Memilih Peralatan
Memilih Peralatan

Pam

Pencarian web yang cepat akan menunjukkan beberapa model pam elektrik yang direka untuk botol air pilihan anda. Pam sedemikian biasanya dikendalikan oleh suis ON / OFF (contohnya, Hot Frost A12 atau SMixx ХL-D2). Inilah pam yang kami pilih untuk projek kami.

Peranti Pengawal

Kami mencuba beberapa peranti tetapi menggunakan Raspberry Pi kerana kelebihan berikut:

  • Ia mempunyai GPIO yang membolehkan kita menyambungkan sensor jarak
  • Ia menyokong Python

Kami memasang versi baru Raspbian Buster Lite dan semua yang diperlukan untuk menjalankan Python 3.

Bagaimana Kami Menukar Pam

Untuk mengawal kuasa, kami memilih relay keadaan pepejal kuasa sederhana (12V / 2A) yang sesuai untuk arus bolak-balik. Relay menghubungkan pam ke saluran keluar dan dikendalikan oleh pin digital Raspberry Pi.

Bagaimana Kami Memeriksa Paras Air

Penting bagi kami untuk tidak mengubah pembinaan mesin kopi, jadi kami memutuskan untuk menggunakan sensor jarak Ultrasonik HC-SR04 untuk mengukur paras air.

Kami mencetak 3D penutup tangki air khas dengan dua lubang untuk pemancar sensor. Kami dengan mudah menemui perpustakaan GitHub untuk sensor. Pada ketika ini semua persiapan selesai.

Langkah 2: Merancang Sistem

Merancang Sistem
Merancang Sistem
Merancang Sistem
Merancang Sistem

Logik Sistem

Sistem ini dirancang dengan mempertimbangkan logik mudah berikut:

  • Sistem ini sentiasa memantau jarak antara sensor dan permukaan air.
  • Setiap kali perubahan jarak melebihi nilai ambang, sistem akan menghantar maklumat mengenai keadaannya ke awan.
  • Sekiranya jarak melebihi nilai maksimum yang dibenarkan (tangki kosong), sistem akan mengaktifkan pam dan mematikannya apabila jaraknya kurang dari nilai minimum yang dibenarkan.
  • Setiap kali keadaan sistem berubah (misalnya, pam diaktifkan), ia memberitahu awan.

Sekiranya berlaku kesalahan, pemberitahuan dikirim ke saluran Slack.

Apabila mesin kopi tidak berfungsi, sistem akan membuat ping perkhidmatan awan dengan data diagnostik sekali setiap minit. Selain itu, ia menghantar keadaan ke awan setiap 5 minit.

Apabila pam aktif, sistem menghantar data lebih kerap tetapi tidak lebih dari sekali setiap setengah saat.

def send (cloud, variables, dist, error_code = 0, force = False): pump_on = is_pump_on () persen = calc_water_level_percent (dist) pemboleh ubah ['Jarak'] ['nilai'] = pemboleh ubah dist ['WaterLevel'] [' nilai '] = pemboleh ubah peratus [' PumpRelay '] [' nilai '] = pemboleh ubah pump_on [' Status '] [' nilai '] = calc_status (kesalahan_kod, peratus, pam_on)

semasa = masa ()

last_sending_time global jika berlaku atau semasa - last_sending_time> MIN_SEND_INTERVAL: bacaan = cloud.read_data () cloud.publish_data (bacaan) last_sending_time = semasa

Bekerja dengan Pam

Kami menentukan pemalar berikut sebagai asas logik operasi pam.

# GPIO Pin (BCM) GPIO_PUMP = 4 GPIO_TRIGGER = 17 GPIO_ECHO = 27

# Pam

START_PUMP = 1 STOP_PUMP = 0 PUMP_BOUNCE_TIME = 50 # milisaat PUMP_STOP_TIMEOUT = 5 # saat

PENTING: Jika anda akan menggunakan Pin 4, jangan lupa untuk mematikan pilihan raspi-config 1-Wire untuk mengelakkan konflik.

Pada permulaan program, kami mendaftarkan panggilan balik dan menetapkan keadaan awal ke NONAKTIF.

Inilah kod untuk fungsi yang menukar pam:

def toggle_pump (value): if pump_disabled: return if is_pump_on ()! = value: log_debug ("[x]% s"% ('START' if value else 'STOP')) GPIO.setup (GPIO_PUMP, GPIO. OUT) GPIO.output (GPIO_PUMP, nilai) # Mula / Berhenti menuangkan

Seperti yang ditentukan dalam kod permulaan di atas, apabila relay AKTIF, panggilan balik berikut dipanggil:

pump_on = Palsu def pump_relay_handle (pin): global pump_on pump_on = GPIO.input (GPIO_PUMP) log_debug ("Relay pam diubah menjadi% d"% pump_on)

Dalam panggilan balik, kami menyimpan keadaan semasa pam ke pemboleh ubah. Dalam gelung utama aplikasi, kami dapat mengesan saat pam beralih seperti yang ditunjukkan di bawah:

def is_pump_on (): global pump_on return pump_on

jika GPIO.event_detected (GPIO_PUMP):

is_pouring = is_pump_on () #… log_debug ('[!] Event pump dikesan:% s'% ('On' if is_pouring else 'Off')) hantar (awan, pemboleh ubah, jarak, daya = benar)

Mengukur Jarak

Cukup mudah untuk mengukur jarak ke permukaan air menggunakan sensor jarak ultrasonik. Di repositori kami, kami berkongsi beberapa skrip python yang membolehkan anda menguji sensor.

Dalam aplikasi sebenar, pembacaan sensor dapat berubah-ubah kerana kesan pantulan dan ayunan air sensor. Dalam beberapa kes, bacaan boleh hilang sepenuhnya. Kami melaksanakan kelas BounceFilter yang mengumpulkan nilai N terkini, membuang puncak dan mengira purata pengukuran yang tinggal. Proses pengukuran dilaksanakan dengan algoritma tak segerak berikut.

# Menjaga pengukuran pengukuran sensor terakhir = BounceFilter (ukuran = 6, buang_kira = 1)

read_complete = threading. Acara ()

def tunggu_untuk_jarak ():

read_complete.clear () thread = threading. Thread (target = read_distance) thread.start ()

jika tidak membaca_complete.wait (MAX_READING_TIMEOUT):

log_info ('Timeout sensor bacaan') kembali Tiada pembacaan kembali.avg ()

def read_distance ():

cuba: nilai = hcsr04.raw_distance (sample_size = 5) bulat = nilai jika nilai Tidak ada yang lain bulat (nilai, 1) readings.add (bulat) kecuali Pengecualian sebagai kesalahan: log_error ('Kesalahan dalaman:% s'% err) akhirnya: read_complete.set ()

Anda boleh mendapatkan penerapan lengkap penapis di sumbernya.

Langkah 3: Mengendalikan Situasi Kecemasan

Mengendalikan Situasi Kecemasan
Mengendalikan Situasi Kecemasan
Mengendalikan Situasi Kecemasan
Mengendalikan Situasi Kecemasan
Mengendalikan Situasi Kecemasan
Mengendalikan Situasi Kecemasan

Bagaimana jika sensor terbakar, atau jatuh, atau menunjuk ke kawasan yang salah? Kami memerlukan cara untuk melaporkan kes sedemikian sehingga kami dapat mengambil tindakan manual.

Sekiranya sensor gagal memberikan bacaan jarak jauh, sistem akan menghantar status yang berubah ke awan dan menghasilkan pemberitahuan yang sesuai.

Logiknya digambarkan oleh kod di bawah.

jarak = tunggu_untuk_jarak () # Baca kedalaman air semasa jika jarak Tiada: log_error ('Kesalahan jarak!') notify_in_background (calc_alert (SENSOR_ERROR)) hantar (awan, pemboleh ubah, jarak, kesalahan_kod = SENSOR_ERROR, kekuatan = Benar)

Kami mempunyai jangkauan paras air operasi yang harus dijaga ketika sensor berada di tempatnya. Kami menguji sama ada paras air semasa berada dalam julat ini:

# Jarak dari sensor ke permukaan air # berdasarkan tangki air mesin kopi MIN_DISTANCE = 2 # cm MAX_DISTANCE = 8 # cm

# Jarak di luar jangkauan yang diharapkan: jangan mula mencurah

jika jarak> MAX_DISTANCE * 2: log_error ('Jarak berada di luar jarak:%.2f'% jarak) teruskan

Kami mematikan pam jika ia aktif semasa berlaku ralat.

jika is_pump_on () dan prev_distance <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('[!] Hentian kecemasan pam. Tiada isyarat dari sensor jarak')

toggle_pump (STOP_PUMP)

Kami juga memproses kes itu apabila botol kehabisan air. Kami memeriksa sama ada paras air tidak berubah semasa pam berjalan. Sekiranya demikian, sistem menunggu selama 5 saat dan kemudian memeriksa apakah pam telah dimatikan. Sekiranya tidak, sistem akan melaksanakan penutupan pam kecemasan dan menghantar pemberitahuan kesalahan.

PUMP_STOP_TIMEOUT = 5 # saat-kecemasan_stop_time = Tiada

def set_emergency_stop_time (sekarang, is_pouring):

global emergency_stop_time emergency_stop_time = sekarang + PUMP_STOP_TIMEOUT jika / sedang_membuang yang lain Tiada

def check_water_source_empty (sekarang):

kembali darurat_stop_time dan sekarang> emergency_stop_time

# --------- gelung utama -----------

jika GPIO.event_detected (GPIO_PUMP): is_pouring = is_pump_on () set_emergency_stop_time (sekarang, is_pouring) #…

global pump_disabled

if check_water_source_empty (now): log_error ('[!] Berhenti kecemasan pam. / Sumber air kosong') toggle_pump (STOP_PUMP) pump_disabled = True

Di atas adalah contoh log mesej yang dihasilkan semasa berhenti kecemasan.

Langkah 4: Menjalankan Sistem 24/7

Menjalankan Sistem 24/7
Menjalankan Sistem 24/7

Kod pada peranti disahpepijat dan berjalan tanpa masalah. Kami melancarkannya sebagai perkhidmatan, jadi dimulakan semula jika Raspberry Pi dihidupkan semula. Untuk kemudahan, kami membuat Makefile yang membantu penyebaran, menjalankan perkhidmatan dan melihat log.

. PHONY: install run start stop status log menyebarkan MAIN_FILE: = coffee-pump / main.py SERVICE_INSTALL_SCRIPT: = service_install.sh SERVICE_NAME: = coffee-pump.service

pasang:

chmod + x $ (SERVICE_INSTALL_SCRIPT) sudo./$(SERVICE_INSTALL_SCRIPT) $ (MAIN_FILE)

jalankan:

sudo python3 $ (MAIN_FILE)

mulakan:

sudo systemctl mulai $ (SERVICE_NAME)

status:

status sistemo sudo $ (SERVICE_NAME)

berhenti:

sudo systemctl stop $ (SERVICE_NAME)

log:

sudo journalctl -u pam kopi - sejak hari ini

menyebarkan:

rsync -av sensor pam kopi-persediaan Makefile *.sh pi@XX. XX. XXX. XXX: ~ /

Anda boleh mendapatkan fail ini dan semua skrip yang diperlukan di repositori kami.

Langkah 5: Pemantauan Awan

Pemantauan Awan
Pemantauan Awan
Pemantauan Awan
Pemantauan Awan
Pemantauan Awan
Pemantauan Awan
Pemantauan Awan
Pemantauan Awan

Kami menggunakan Cloud4RPi untuk melaksanakan panel kawalan. Kami mula-mula menambahkan widget untuk menunjukkan parameter penting sistem.

By the way, widget untuk pemboleh ubah STATUS dapat menggunakan skema warna yang berbeza berdasarkan nilainya (lihat gambar di atas).

Kami menambahkan widget carta untuk memaparkan data dinamik. Pada gambar di bawah ini anda dapat melihat saat pam dihidupkan dan dimatikan dan paras air masing-masing.

Sekiranya anda menganalisis jangka masa yang lebih lama, anda dapat melihat puncak - ketika pam itu sedang berjalan.

Cloud4RPi juga membolehkan anda menetapkan tahap kelancaran yang berbeza.

Langkah 6: Ia Berfungsi

Image
Image

Ianya berfungsi! Panel kawalan secara keseluruhan kelihatan seperti gambar di bawah.

Pada masa ini, pam automatik kami telah beroperasi selama beberapa minggu dan yang perlu kami lakukan hanyalah mengganti botol air. Kod lengkap untuk projek kami terdapat di repositori GitHub kami.

Disyorkan: