Sisukord:

Nutikas kohvimasina pump, mida juhivad Raspberry Pi ja HC-SR04 ultraheli andur ja Cloud4RPi: 6 sammu
Nutikas kohvimasina pump, mida juhivad Raspberry Pi ja HC-SR04 ultraheli andur ja Cloud4RPi: 6 sammu

Video: Nutikas kohvimasina pump, mida juhivad Raspberry Pi ja HC-SR04 ultraheli andur ja Cloud4RPi: 6 sammu

Video: Nutikas kohvimasina pump, mida juhivad Raspberry Pi ja HC-SR04 ultraheli andur ja Cloud4RPi: 6 sammu
Video: Pro Коучинг. Как найти клиентов. Обучение коучингу. Личный бренд коуча. Коучинговая практика 2024, November
Anonim
Nutikas kohvimasina pump, mida juhivad Raspberry Pi ja HC-SR04 ultraheli andur ja Cloud4RPi
Nutikas kohvimasina pump, mida juhivad Raspberry Pi ja HC-SR04 ultraheli andur ja Cloud4RPi

Teoreetiliselt on iga kord, kui lähete kohvimasina juurde hommikust tassi võtma, ainult üks kahekümnest võimalus, et peate veepaagi täitma. Praktikas aga tundub, et masin leiab kuidagi viisi, kuidas see töö alati teie peale panna. Mida rohkem kohvi soovite, seda suurem on tõenäosus, et saate kohutava teate „Täida veepaak”. Minu kolleegid tunnevad seda sama. Olles nohikud, kes me oleme, otsustasime rakendada tehnoloogiat, mis sellele punkti teeks.

Tarvikud

Meie varustus

Meil on SAECO Aulika Focus kohvimasin. Siiani kasutasime masina veepaagi täitmiseks käsipumpa tavalisest 5 -gallonilisest (19 liitrist) veepudelist.

Meie eesmärgid

  1. Kasutage relee kaudu elektripumpa, mida juhib mingi kontroller või mikroarvuti.
  2. Kasutage võimalust kohvimasina paagi veetaseme mõõtmiseks, et meie süsteem teaks, millal seda uuesti täita.
  3. Kas teil on vahendeid süsteemi juhtimiseks, eelistatavalt reaalajas mobiilseadmest.
  4. Saate märguandeid (Slacki või sarnase teenuse kaudu), kui süsteemiga midagi läheb valesti.

Samm: seadmete valimine

Seadmete valimine
Seadmete valimine
Seadmete valimine
Seadmete valimine
Seadmete valimine
Seadmete valimine
Seadmete valimine
Seadmete valimine

Pump

Kiire veebiotsing näitab mitmeid teie valitud veepudeli jaoks mõeldud elektripumba mudeleid. Selliseid pumbasid juhitakse tavaliselt ON/OFF lülitiga (näiteks Hot Frost A12 või SMixx ХL-D2). Siin on pump, mille me oma projekti jaoks valisime.

Kontrolleri seade

Proovisime mitmeid seadmeid, kuid otsustasime järgmiste eeliste tõttu Raspberry Pi -le:

  • Sellel on GPIO, mis võimaldab meil ühendada lähedusanduri
  • See toetab Pythoni

Paigaldasime Raspbian Buster Lite värske versiooni ja kõik, mis on vajalik Python 3 käivitamiseks.

Kuidas me pumpa lülitame

Võimsuse juhtimiseks valisime vahelduvvooluks sobiva keskmise võimsusega (12V/2A) tahkisrelee. Relee ühendab pumba pistikupesaga ja seda juhib Raspberry Pi digitaalne tihvt.

Kuidas kontrollida veetaset

Meie jaoks oli oluline kohvimasina konstruktsiooni mitte muuta, seega otsustasime veetaseme mõõtmiseks kasutada ultraheli lähedusandurit HC-SR04.

3D-trükkisime anduri kiirgajate jaoks kohandatud veepaagi katte, millel oli kaks auku. Leidsime anduri jaoks hõlpsasti GitHubi raamatukogu. Sel hetkel olid kõik ettevalmistused lõpetatud.

2. samm: süsteemi kujundamine

Süsteemi projekteerimine
Süsteemi projekteerimine
Süsteemi projekteerimine
Süsteemi projekteerimine

Süsteemi loogika

Süsteem on loodud järgides lihtsat loogikat:

  • Süsteem jälgib pidevalt kaugust anduri ja veepinna vahel.
  • Kui kauguse muutus ületab läviväärtuse, saadab süsteem pilve pilti oma oleku kohta.
  • Kui vahemaa ületab maksimaalse lubatud väärtuse (paak on tühi), aktiveerib süsteem pumba ja lülitab selle välja, kui vahemaa on väiksem kui lubatud miinimumväärtus.
  • Kui süsteemi olek muutub (näiteks pump aktiveerub), teavitab see pilve.

Vea korral saadetakse teade Slacki kanalile.

Kui kohvimasin on jõudeolekus, saadab süsteem kord minutis pilveteenusele diagnostikaandmeid. Lisaks saadab see oma oleku pilve iga 5 minuti järel.

Kui pump on aktiivne, saadab süsteem andmeid sagedamini, kuid mitte rohkem kui üks kord poole sekundi jooksul.

def send (pilv, muutujad, dist, error_code = 0, force = False): pump_on = is_pump_on () protsenti = calc_water_level_percent (dist) muutujad ['Distance'] ['value'] = dist variables ['WaterLevel'] [' väärtus '] = muutujate protsent [' PumpRelay '] [' väärtus '] = pump_on muutujad [' Status '] [' value '] = calc_status (veakood, protsent, pump_on)

praegune = aeg ()

globaalne last_sending_time kui jõuline või praegune - last_sending_time> MIN_SEND_INTERVAL: näidud = cloud.read_data () cloud.publish_data (näidud) last_sending_time = current

Pumbaga töötamine

Pumba tööloogika alusena määratleme järgmised konstandid.

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

# Pump

START_PUMP = 1 STOP_PUMP = 0 PUMP_BOUNCE_TIME = 50 # millisekundit PUMP_STOP_TIMEOUT = 5 # sekundit

TÄHTIS: Kui kasutate tihvti 4, ärge unustage konfliktide vältimiseks keelata 1-juhtmeline raspi-config.

Programmi käivitamisel registreerime tagasihelistamise ja seame algoleku olekuks VÄLJAS.

Siin on pumba ümberlülitamise funktsiooni kood:

def toggle_pump (väärtus): kui pump_disabled: tagasta, kui is_pump_on ()! = väärtus: log_debug ("[x] % s" % ('START', kui väärtus muu on "STOP")) GPIO.setup (GPIO_PUMP, GPIO. OUT) GPIO.väljund (GPIO_PUMP, väärtus) # Valamise alustamine/lõpetamine

Nagu ülaltoodud käivituskoodis määratletud, nimetatakse relee sisselülitamisel järgmist tagasihelistamist:

pump_on = Vale def pump_relay_handle (tihvt): globaalne pump_on pump_on = GPIO.input (GPIO_PUMP) log_debug ("Pumba relee muudeti % d" % pump_on)

Tagasihelistamisel salvestame pumba praeguse oleku muutujale. Rakenduse põhiahelas saame tuvastada hetke, mil pump lülitub, nagu allpool näidatud:

def is_pump_on (): globaalne pump_on return pump_on

kui GPIO.event_detected (GPIO_PUMP):

is_pouring = is_pump_on () #… log_debug ('[!] Pumbasündmus tuvastatud: % s' % ('On', kui is_pouring else 'Off')) send (pilv, muutujad, kaugus, jõud = tõene)

Kauguse mõõtmine

Ultraheli lähedusanduri abil on üsna lihtne mõõta veepinna kaugust. Jagasime oma hoidlas paar pythoni skripti, mis võimaldavad teil andurit testida.

Reaalsetes rakendustes võivad anduri näidud kõikuda anduri tagasilöögiefekti ja vee võnkumiste tõttu. Mõnel juhul võivad näidud täielikult puududa. Rakendasime BounceFilter klassi, mis kogub N hiljutist väärtust, loobub piikidest ja arvutab järelejäänud mõõtmiste keskmise. Mõõtmisprotsessi rakendab järgmine asünkroonne algoritm.

# Säilitab viimased anduri mõõtmised lugemid = BounceFilter (suurus = 6;

reading_complete = threading. Event ()

def wait_for_distance ():

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

kui ei loe_täielikku.oota (MAX_READING_TIMEOUT):

log_info ('Lugemisanduri ajalõpp') tagastamine Puudub tagasiside. avg ()

def read_distance ():

proovige: väärtus = hcsr04.raw_distance (sample_size = 5) ümardatud = väärtus, kui väärtus on Pole muud ümmargune (väärtus, 1) readings.add (ümardatud), välja arvatud erand kui viga: log_error ('Sisemine viga: % s' % err) lõpuks: reading_complete.set ()

Filtri täieliku rakenduse leiate allikatest.

3. samm: hädaolukordade lahendamine

Hädaolukordade lahendamine
Hädaolukordade lahendamine
Hädaolukordade lahendamine
Hädaolukordade lahendamine
Hädaolukordade lahendamine
Hädaolukordade lahendamine

Mis siis, kui andur põles läbi või kukkus maha või osutab valele alale? Vajasime viisi, kuidas sellistest juhtumitest teatada, et saaksime käsitsi tegutseda.

Kui andur ei suuda kaugusnäitu edastada, saadab süsteem muudetud oleku pilvele ja genereerib vastava teate.

Loogikat illustreerib allolev kood.

distance = wait_for_distance () # Lugege praegust vee sügavust, kui vahemaa pole Puudub: log_error ('Kauguse viga!') alert_in_background (calc_alert (SENSOR_ERROR))) send (pilv, muutujad, kaugus, error_code = SENSOR_ERROR, force = True)

Meil on töökorras veetaseme vahemik, mida tuleks säilitada, kui andur on oma kohal. Testime, kas praegune veetase langeb sellesse vahemikku:

# Kaugus andurist veetasemeni # kohvimasina veepaagi põhjal MIN_DISTANCE = 2 # cm MAX_DISTANCE = 8 # cm

# Kaugus on oodatust väiksem: ärge valage

kui kaugus> MAX_DISTANCE * 2: log_error ('Kaugus on vahemikust väljas: %.2f' % kaugus) jätka

Lülitame pumba välja, kui see oli vea ilmnemisel aktiivne.

if is_pump_on () ja prev_distance <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('[!] Pumba hädaseiskamine. Kaugusandurilt pole signaali')

lülituspump (STOP_PUMP)

Samuti töötleme juhtumit, kui pudelist saab vesi otsa. Kontrollime, kas veetase ei muutu pumba töötamise ajal. Kui jah, siis süsteem ootab 5 sekundit ja kontrollib seejärel, kas pump on välja lülitatud. Kui seda pole, rakendab süsteem avariipumba väljalülitamist ja saadab veateate.

PUMP_STOP_TIMEOUT = 5 # secsemergency_stop_time = Puudub

def set_emergency_stop_time (praegu, is_pouring):

ülemaailmne hädaolukorra_seisakuaeg erakorraline_seisakuaeg = praegu + PUMP_STOP_TIMEOUT, kui / is_pouring else Puudub

def check_water_source_empty (praegu):

tagastage hädaolukorra_seisaku_aeg ja nüüd> hädaolukorra_seisaku_aeg

# --------- peamine silmus -----------

kui GPIO.event_detected (GPIO_PUMP): is_pouring = is_pump_on () set_emergency_stop_time (nüüd, is_pouring) #…

globaalne pump_puudega

kui check_water_source_empty (praegu): log_error ('[!] Pumba hädaseiskamine. / Veeallikas on tühi') toggle_pump (STOP_PUMP) pump_disabled = True

Ülal on näide hädaseiskamise ajal loodud sõnumilogist.

Samm: süsteemi töötamine ööpäevaringselt

Süsteemi töötamine ööpäevaringselt
Süsteemi töötamine ööpäevaringselt

Seadme kood on silutud ja töötab probleemideta. Käivitasime selle teenusena, nii et see taaskäivitub, kui Raspberry Pi taaskäivitatakse. Mugavuse huvides lõime Makefile'i, mis aitab juurutamisel, teenuse käitamisel ja logide vaatamisel.

. PHONY: installi käivitamise peatamise oleku logi juuruta MAIN_FILE: = coffee-pump/main.py SERVICE_INSTALL_SCRIPT: = service_install.sh SERVICE_NAME: = coffee-pump.service

paigaldada:

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

joosta:

sudo python3 $ (MAIN_FILE)

algus:

sudo systemctl start $ (SERVICE_NAME)

staatus:

sudo systemctl olek $ (SERVICE_NAME)

peatus:

sudo systemctl stop $ (SERVICE_NAME)

logi:

sudo journalctl -u kohvipump -juba täna

juurutada:

rsync -av kohvipumba anduri seadistamine Makefile *.sh pi@XX. XX. XXX. XXX: ~/

Selle faili ja kõik vajalikud skriptid leiate meie hoidlast.

Samm: pilve jälgimine

Pilve jälgimine
Pilve jälgimine
Pilve jälgimine
Pilve jälgimine
Pilve jälgimine
Pilve jälgimine
Pilve jälgimine
Pilve jälgimine

Juhtpaneeli rakendamiseks kasutasime Cloud4RPi. Lisasime kõigepealt vidinad, mis näitavad süsteemi olulisi parameetreid.

Muide, muutuja STATUS vidin saab selle väärtuse põhjal kasutada erinevaid värviskeeme (vt ülaltoodud pilti).

Lisasime dünaamiliste andmete kuvamiseks diagrammi vidina. Alloleval pildil näete hetke, mil pump sisse ja välja lülitati, ja vastavat veetaset.

Kui analüüsite pikemat ajavahemikku, näete piike - see oli pump, mis töötas.

Cloud4RPi võimaldab teil määrata ka erinevaid silumisastmeid.

6. samm: see töötab

Image
Image

See töötab! Juhtpaneel näeb tervikuna välja nagu allpool näidatud.

Praegu töötab meie automaatpump juba mitu nädalat ja meil on vaja vaid veepudelid välja vahetada. Meie projekti täielik kood on saadaval meie GitHubi hoidlas.

Soovitan: