Talaan ng mga Nilalaman:
- Mga gamit
- Hakbang 1: Pagpili ng Kagamitan
- Hakbang 2: Pagdidisenyo ng Sistema
- Hakbang 3: Pangangasiwa ng Mga Kundisyon sa Emergency
- Hakbang 4: Pagpapatakbo ng System 24/7
- Hakbang 5: Pagsubaybay sa Cloud
- Hakbang 6: Gumagana Ito
Video: Ang Smart Coffee Machine Pump na Kinokontrol ng Raspberry Pi & HC-SR04 Ultrasonic Sensor at Cloud4RPi: 6 na Hakbang
2024 May -akda: John Day | [email protected]. Huling binago: 2024-01-30 13:12
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
- Gumamit ng isang de-kuryenteng bomba na hinimok ng ilang uri ng isang controller o isang microcomputer sa pamamagitan ng isang relay.
- 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.
- Mayroong mga paraan upang makontrol ang system, mas mabuti sa real-time mula sa isang mobile device.
- Makatanggap ng mga abiso (sa pamamagitan ng Slack o isang katulad na serbisyo) kung may mali sa system.
Hakbang 1: 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
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
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
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
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
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:
Smart Dustbin Gamit ang Arduino, Ultrasonic Sensor & Servo Motor: 3 Hakbang
Smart Dustbin Gamit ang Arduino, Ultrasonic Sensor & Servo Motor: Sa proyektong ito, ipapakita ko sa iyo Paano Gumawa ng isang Smart Dustbin gamit ang Arduino, kung saan ang takip ng dustbin ay awtomatikong magbubukas kapag lumapit ka sa basurahan. Ang iba pang mahahalagang sangkap na ginamit upang gawin ang Smart dustbin na ito ay isang HC-04 Ultrasonic Sen
Kinokontrol ang Banayad na Silid Gamit ang PIR Sensor at Arduino: 6 na Hakbang
Kinokontrol ang Banayad na Silid Gamit ang PIR Sensor at Arduino: Ngayon, makokontrol namin ang iyong mga ilaw sa silid sa pamamagitan ng pagtuklas ng paggalaw gamit ang isang Arduino PIR Motion Sensor. Ang proyektong ito ay napakasayang gawin at mayroon itong praktikal na paggamit sa iyong bahay at makakapagtipid sa iyo ng kaunting pera sa pamamagitan din ng paggawa ng proyektong ito. Ju
Smart Coffee Machine - Bahagi ng SmartHome Ecosystem: 4 Hakbang
Ang Smart Coffee Machine - Bahagi ng SmartHome Ecosystem: Hacked Coffee Machine, ginawa itong bahagi ng SmartHome EcosystemMay nagtataglay ako ng isang mahusay na lumang Delonghi Coffee Machine (DCM) (hindi isang promosyon at nais itong maging "matalino". Kaya, na-hack ko ito sa pamamagitan ng pag-install ng ESP8266 module na may interface sa utak / microcontroller nito gamit ang
Kinokontrol na Pump ng Arduino para sa Draining Water: 4 na Hakbang (na may Mga Larawan)
Controlled Pump ng Arduino para sa Draining Water: Lumabas ang ideya ng proyektong ito nang bumili ako ng isang condensing gas boiler para sa aking apartment. Wala akong anumang kanal na malapit para sa condensadong tubig na ginagawa ng boiler. Kaya't ang tubig ay nakolekta sa isang 20 litro na tank (drum) sa loob ng ilang araw at kung kailan ito makakakuha
Pindutin ang Sensor at Sound Sensor na Kinokontrol ang Mga ilaw ng AC / DC: 5 Hakbang
Touch Sensor & Sound Sensor Controlling AC / DC Lights: Ito ang aking unang proyekto at ito ay gumagana batay sa dalawang pangunahing sensor ang isa ay ang Touch sensor at pangalawa ang isang Sound sensor, kapag pinindot mo ang touch pad sa touch sensor ang AC light ay lilipat ON, kung pakawalan mo ito ang ilaw ay Mapatay, at pareho