Talaan ng mga Nilalaman:

Ang Smart Coffee Machine Pump na Kinokontrol ng Raspberry Pi & HC-SR04 Ultrasonic Sensor at Cloud4RPi: 6 na Hakbang
Ang Smart Coffee Machine Pump na Kinokontrol ng Raspberry Pi & HC-SR04 Ultrasonic Sensor at Cloud4RPi: 6 na Hakbang

Video: Ang Smart Coffee Machine Pump na Kinokontrol ng Raspberry Pi & HC-SR04 Ultrasonic Sensor at Cloud4RPi: 6 na Hakbang

Video: Ang Smart Coffee Machine Pump na Kinokontrol ng Raspberry Pi & HC-SR04 Ultrasonic Sensor at Cloud4RPi: 6 na Hakbang
Video: 30 COOLEST Tech Gadgets you’ll NEED in 2024 – MUST HAVE 2024, Nobyembre
Anonim
Ang Smart Coffee Machine Pump na Kinokontrol ng Raspberry Pi & HC-SR04 Ultrasonic Sensor at Cloud4RPi
Ang Smart Coffee Machine Pump na Kinokontrol ng Raspberry Pi & HC-SR04 Ultrasonic Sensor at Cloud4RPi

Sa teorya, sa tuwing pupunta ka sa machine ng kape para sa iyong tasa ng umaga, mayroon lamang isang isang-sa-dalawampung pagkakataon na kailangan mong punan ang tangke ng tubig. Sa pagsasagawa, gayunpaman, tila ang makina ay sa anumang paraan ay nakakahanap ng isang paraan upang palaging ilagay ang gawaing ito sa iyo. Kung mas gusto mo ang kape, mas malamang na makuha mo ang takot na mensahe na "punan ang tangke ng tubig". Ganun din ang nararamdaman ng mga kasamahan ko tungkol dito. Dahil sa pagiging nerd namin, nagpasya kaming ipatupad ang teknolohiya na magtatapos dito.

Mga gamit

Ang aming Kagamitan

Mayroon kaming isang machine machine ng SAECO Aulika Focus. Hanggang ngayon, gumamit kami ng isang hand pump upang punan ang tangke ng tubig ng makina mula sa isang karaniwang 5 Gallon (19L) na bote ng tubig.

Ang aming Mga Layunin

  1. Gumamit ng isang de-kuryenteng bomba na hinimok ng ilang uri ng isang controller o isang microcomputer sa pamamagitan ng isang relay.
  2. Magkaroon ng isang paraan upang masukat ang antas ng tubig sa tangke ng coffee machine upang malaman ng aming system kung kailan muling punan ito.
  3. Mayroong mga paraan upang makontrol ang system, mas mabuti sa real-time mula sa isang mobile device.
  4. Makatanggap ng mga abiso (sa pamamagitan ng Slack o isang katulad na serbisyo) kung may mali sa system.

Hakbang 1: Pagpili ng Kagamitan

Pagpili ng Kagamitan
Pagpili ng Kagamitan
Pagpili ng Kagamitan
Pagpili ng Kagamitan
Pagpili ng Kagamitan
Pagpili ng Kagamitan
Pagpili ng Kagamitan
Pagpili ng Kagamitan

Ang Pump

Ang isang mabilis na paghahanap sa web ay magpapakita ng maraming mga modelo ng electric pump na dinisenyo para sa iyong pipiliing bote ng tubig. Ang mga nasabing pump ay karaniwang kinokontrol ng isang ON / OFF switch (halimbawa, Hot Frost A12 o SMixx ХL-D2). Narito ang pump na pinili namin para sa aming proyekto.

Ang Device ng Controller

Sinubukan namin ang maraming mga aparato ngunit nanirahan sa isang Raspberry Pi dahil sa mga sumusunod na kalamangan:

  • Mayroon itong GPIO na nagbibigay-daan sa amin upang ikonekta ang isang proximity sensor
  • Sinusuportahan nito ang Python

Nag-install kami ng isang sariwang bersyon ng Raspbian Buster Lite at lahat ng kinakailangan upang patakbuhin ang Python 3.

Paano Namin Palitan ang Bomba

Upang makontrol ang lakas, pumili kami ng isang medium power (12V / 2A) solid state relay na angkop para sa alternating kasalukuyang. Ang relay ay nagkokonekta sa pump sa outlet at kinokontrol ng digital pin ng Raspberry Pi.

Paano Namin Susuriin ang Antas ng Tubig

Mahalaga para sa amin na huwag baguhin ang konstruksyon ng makina ng kape, kaya nagpasya kaming gamitin ang sensor ng kalapitan ng HC-SR04 Ultrasonik upang sukatin ang antas ng tubig.

Nag-print kami ng 3d ng isang pasadyang takip ng tangke ng tubig na may dalawang butas para sa mga emitter ng sensor. Madali kaming nakahanap ng isang library ng GitHub para sa sensor. Sa puntong ito natapos ang lahat ng mga paghahanda.

Hakbang 2: Pagdidisenyo ng Sistema

Pagdidisenyo ng Sistema
Pagdidisenyo ng Sistema
Pagdidisenyo ng Sistema
Pagdidisenyo ng Sistema

Ang Logic ng System

Ang sistema ay dinisenyo kasama ang sumusunod na simpleng lohika:

  • Patuloy na sinusubaybayan ng system ang distansya sa pagitan ng sensor at ng ibabaw ng tubig.
  • Tuwing ang isang pagbabago sa distansya ay lumipas sa isang halaga ng threshold, ang system ay nagpapadala ng impormasyon tungkol sa estado nito sa cloud.
  • Kung ang distansya ay napupunta sa maximum na pinapayagan na halaga (walang laman ang tanke), pinapagana ng system ang pump at pinapatay ito kapag ang distansya ay mas mababa kaysa sa minimum na pinahihintulutang halaga.
  • Kailan man magbago ang estado ng system (halimbawa, nagpapagana ng bomba), ipinapaalam nito sa cloud.

Sa kaso ng isang error, isang notification ay ipinadala sa isang Slack channel.

Kapag ang machine ng kape ay walang ginagawa, inilalagay ng system ang cloud service na may data ng diagnostic isang beses bawat minuto. Bilang karagdagan, ipinapadala nito ang estado nito sa cloud bawat 5 minuto.

Kapag ang bomba ay aktibo, ang system ay nagpapadala ng data nang mas madalas ngunit hindi hihigit sa isang beses bawat kalahating segundo.

def send (cloud, variable, dist, error_code = 0, force = False): pump_on = is_pump_on () porsyento = calc_water_level_percent (dist) variable ['Distansya'] ['halaga'] = dist variable ['WaterLevel'] [' halaga '] = porsyento ng variable [' PumpRelay '] [' halaga '] = pump_on variable [' Status '] [' value '] = calcul_status (error_code, porsyento, pump_on)

kasalukuyang = oras ()

global last_sending_time kung lakas o kasalukuyang - last_sending_time> MIN_SEND_INTERVAL: readings = cloud.read_data () cloud.publish_data (readings) last_sending_time = kasalukuyang

Paggawa gamit ang Pump

Tinutukoy namin ang mga sumusunod na Constant bilang isang batayan para sa lohika ng pagpapatakbo ng bomba.

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

# Pump

START_PUMP = 1 STOP_PUMP = 0 PUMP_BOUNCE_TIME = 50 # milliseconds PUMP_STOP_TIMEOUT = 5 # seg

MAHALAGA: Kung gagamit ka ng Pin 4, huwag kalimutang huwag paganahin ang pagpipiliang 1-Wire raspi-config upang maiwasan ang mga salungatan.

Sa pagsisimula ng programa, nagrehistro kami ng isang callback at itinakda ang paunang estado sa OFF.

Narito ang code para sa pagpapaandar na nagpapalipat-lipat sa bomba:

def toggle_pump (halaga): kung pump_disabled: bumalik kung is_pump_on ()! = halaga: log_debug ("[x]% s"% ('SIMULA' kung ang halaga ay 'STOP')) GPIO.setup (GPIO_PUMP, GPIO. OUT) GPIO.output (GPIO_PUMP, halaga) # Simula / Ihinto ang pagbuhos

Tulad ng tinukoy sa startup code sa itaas, kapag ang relay ay ON, ang sumusunod na callback ay tinawag:

pump_on = Maling def pump_relay_handle (pin): global pump_on pump_on = GPIO.input (GPIO_PUMP) log_debug ("Ang pump relay ay binago sa% d"% pump_on)

Sa callback, nai-save namin ang kasalukuyang estado ng bomba sa isang variable. Sa pangunahing loop ng application, maaari naming makita ang sandali kapag ang pump ay nagpapatuloy tulad ng ipinapakita sa ibaba:

def is_pump_on (): global pump_on return pump_on

kung GPIO.event_detected (GPIO_PUMP):

is_pouring = is_pump_on () #… log_debug ('[!] Nakita ang kaganapan sa pump:% s'% ('On' if is_pouring else 'Off')) send (cloud, variable, distansya, puwersa = True)

Pagsukat sa Distansya

Medyo madaling sukatin ang distansya patungo sa ibabaw ng tubig gamit ang isang ultrasonic proximity sensor. Sa aming imbakan, nagbahagi kami ng ilang mga script ng python na nagbibigay-daan sa iyo upang subukan ang isang sensor.

Sa totoong mga application, ang pagbabasa ng sensor ay maaaring magbagu-bago dahil sa nagba-bounce na epekto ng sensor at mga oscillation ng tubig. Sa ilang mga kaso, ang mga pagbasa ay maaaring ganap na nawawala. Nagpatupad kami ng isang klase ng BounceFilter na naipon ang mga Kamakailang halaga, tinatapon ang mga taluktok at kinakalkula ang average ng natitirang mga sukat. Ang proseso ng pagsukat ay ipinatupad ng sumusunod na asynchronous algorithm.

# Pinapanatili ang huling mga pagsukat ng pagsukat ng sensor = BounceFilter (laki = 6, discard_count = 1)

read_complete = threading.vent ()

def wait_for_distance ():

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

kung hindi nagbabasa_complete.wait (MAX_READING_TIMEOUT):

log_info ('Pagbasa ng pag-timeout ng sensor') bumalik Walang pagbabalik na pagbabasa.avg ()

def read_distance ():

subukan: halaga = hcsr04.raw_distance (sample_size = 5) bilugan = halaga kung ang halaga ay Wala ng iba pang bilog (halaga, 1) mga pagbasa.add (bilugan) maliban sa Exception bilang err: log_error ('Panloob na error:% s'% err) sa wakas: reading_complete.set ()

Mahahanap mo ang buong pagpapatupad ng filter sa mga mapagkukunan.

Hakbang 3: Pangangasiwa ng Mga Kundisyon sa Emergency

Pangangasiwa ng Mga Kundisyon sa Emergency
Pangangasiwa ng Mga Kundisyon sa Emergency
Pangangasiwa ng Mga Kundisyon sa Emergency
Pangangasiwa ng Mga Kundisyon sa Emergency
Pangangasiwa ng Mga Kundisyon sa Emergency
Pangangasiwa ng Mga Kundisyon sa Emergency

Paano kung ang sensor ay nasunog, o nahulog, o tumuturo sa isang maling lugar? Kailangan namin ng isang paraan upang maiulat ang mga naturang kaso upang makagawa kami ng manu-manong pagkilos.

Kung nabigo ang sensor na magbigay ng mga pagbasa sa distansya, ipinapadala ng system ang binago na katayuan sa cloud at bumubuo ng isang kaukulang abiso.

Ang lohika ay isinalarawan ng code sa ibaba.

distansya = wait_for_distance () # Basahin ang kasalukuyang lalim ng tubig kung ang distansya ay Wala: log_error ('Distance error!') abisuhan_in_background (calc_alert (SENSOR_ERROR)) ipadala (cloud, variable, distansya, error_code = SENSOR_ERROR, puwersa = Totoo)

Mayroon kaming isang saklaw na antas ng antas ng tubig na dapat panatilihin kapag ang sensor ay nasa lugar nito. Sinusubukan namin kung ang kasalukuyang antas ng tubig ay bumaba sa saklaw na ito:

# Distansya mula sa sensor sa antas ng tubig # batay sa tangke ng tubig ng coffee-machine MIN_DISTANCE = 2 # cm MAX_DISTANCE = 8 # cm

# Ang distansya ay wala sa inaasahang saklaw: huwag magsimulang magbuhos

kung distansya> MAX_DISTANCE * 2: log_error ('Ang distansya ay wala sa saklaw:%.2f'% distansya) magpatuloy

Pinapatay namin ang bomba kung ito ay aktibo kapag may naganap na error.

kung is_pump_on () at prev_distance <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('[!] Emergency stop ng pump. Walang signal mula sa isang distansya sensor')

toggle_pump (STOP_PUMP)

Pinoproseso din namin ang kaso kapag naubusan ng tubig ang bote. Sinusuri namin kung ang antas ng tubig ay hindi nagbabago kapag tumatakbo ang bomba. Kung gayon, naghihintay ang system ng 5 segundo at pagkatapos ay suriin kung ang pump ay naka-off. Kung wala ito, ipinapatupad ng system ang pag-shutdown ng emergency pump at nagpapadala ng isang abiso sa error.

PUMP_STOP_TIMEOUT = 5 # secsemergency_stop_time = Wala

def set_emergency_stop_time (ngayon, ay_pouring):

pandaigdigang emergency_stop_time emergency_stop_time = ngayon + PUMP_STOP_TIMEOUT kung / ay_buhos pa Wala

def check_water_source_empty (ngayon):

ibalik ang emergency_stop_time at ngayon> emergency_stop_time

# --------- main loop -----------

kung GPIO.event_detected (GPIO_PUMP): is_pouring = is_pump_on () set_emergency_stop_time (ngayon, ay_pouring) #…

pandaigdigang pump_di pinagana

kung check_water_source_empty (ngayon): log_error ('[!] Emergency stop ng pump. / Walang laman ang mapagkukunan ng tubig') toggle_pump (STOP_PUMP) pump_disabled = True

Sa itaas ay isang halimbawa ng isang log ng mensahe na nabuo sa panahon ng isang emergency na paghinto.

Hakbang 4: Pagpapatakbo ng System 24/7

Pagpapatakbo ng System 24/7
Pagpapatakbo ng System 24/7

Ang code sa aparato ay naka-debug at tumatakbo nang walang mga problema. Inilunsad namin ito bilang isang serbisyo, kaya't ito ay nagsisimula muli kung ang Raspberry Pi ay na-reboot. Para sa kaginhawaan, gumawa kami ng isang Makefile na makakatulong sa pag-deploy, pagpapatakbo ng serbisyo at pagtingin sa mga tala.

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

i-install:

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

tumakbo:

sudo python3 $ (MAIN_SON)

simulan:

sudo systemctl simulan ang $ (SERVICE_NAME)

katayuan:

sudo systemctl status $ (SERVICE_NAME)

huminto:

sudo systemctl stop $ (SERVICE_NAME)

mag-log:

sudo journalctl -u coffee-pump --mula ngayon

i-deploy:

rsync -av coffee-pump sensor-setup Makefile *.sh pi@XX. XX. XXX. XXX: ~ /

Mahahanap mo ang file na ito at lahat ng kinakailangang mga script sa aming imbakan.

Hakbang 5: Pagsubaybay sa Cloud

Pagsubaybay sa Cloud
Pagsubaybay sa Cloud
Pagsubaybay sa Cloud
Pagsubaybay sa Cloud
Pagsubaybay sa Cloud
Pagsubaybay sa Cloud
Pagsubaybay sa Cloud
Pagsubaybay sa Cloud

Ginamit namin ang Cloud4RPi upang magpatupad ng isang control panel. Una kaming nagdagdag ng mga widget upang maipahiwatig ang mga mahahalagang parameter ng system.

Sa pamamagitan ng paraan, ang widget para sa variable na STATUS ay maaaring gumamit ng iba't ibang mga scheme ng kulay batay sa halaga nito (tingnan ang imahe sa itaas).

Nagdagdag kami ng isang widget ng tsart upang maipakita ang pabago-bagong data. Sa imahe sa ibaba maaari mong makita ang sandali na ang Bomba ay naka-ON at NAKA-OFF at kani-kanilang mga antas ng tubig.

Kung pinag-aaralan mo ang isang mas mahabang oras, maaari mong makita ang mga tuktok - doon tumatakbo ang bomba.

Pinapayagan ka rin ng Cloud4RPi na magtakda ng iba't ibang mga antas ng pag-aayos.

Hakbang 6: Gumagana Ito

Image
Image

Gumagana siya! Ang control panel sa kabuuan nito ay nakikita tulad ng ipinakita sa ibaba.

Sa kasalukuyan, ang aming awtomatikong bomba ay tumatakbo nang maraming linggo at ang kailangan lang naming gawin ay palitan ang mga bote ng tubig. Ang buong code para sa aming proyekto ay magagamit sa aming GitHub repository.

Inirerekumendang: