Sisukord:
- Tarvikud
- Samm: seadmete valimine
- 2. samm: süsteemi kujundamine
- 3. samm: hädaolukordade lahendamine
- Samm: süsteemi töötamine ööpäevaringselt
- Samm: pilve jälgimine
- 6. samm: see töötab
Video: Nutikas kohvimasina pump, mida juhivad Raspberry Pi ja HC-SR04 ultraheli andur ja Cloud4RPi: 6 sammu
2024 Autor: John Day | [email protected]. Viimati modifitseeritud: 2024-01-30 08:47
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
- Kasutage relee kaudu elektripumpa, mida juhib mingi kontroller või mikroarvuti.
- Kasutage võimalust kohvimasina paagi veetaseme mõõtmiseks, et meie süsteem teaks, millal seda uuesti täita.
- Kas teil on vahendeid süsteemi juhtimiseks, eelistatavalt reaalajas mobiilseadmest.
- Saate märguandeid (Slacki või sarnase teenuse kaudu), kui süsteemiga midagi läheb valesti.
Samm: 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 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
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
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
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
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:
Ultraheli andur: 3 sammu
Ultraheli andur: Selles õpetuses mõõdan kaugust ultraheli anduriga
Ultraheli andur objektide positsioonimuutuste jäädvustamiseks: 3 sammu
Ultraheliandur objektide positsioonimuutuste jäädvustamiseks: On oluline, et teie väärtuslikud asjad oleksid turvaliselt kaitstud. Oleks labane, kui hoiate oma lossi terve päeva. Kasutades vaarika pi kaamerat, saate klõpsud õigel hetkel teha. See juhend aitab teil videot või pilti teha
RC Rover, mida juhivad žestid Motions & Joyestick: 8 sammu
RC Rover, mida juhib Gestures Motions & Joyestick: RC Rover on robootikaprojekt, mille eesmärk on parandada roveri juhtimist raadiosageduse kasutamise ja roveri liikumise ja käeliigutuste koostoime abil inertsiaalseadme (MPU6050) abil, aga ka selle juhtimist Rover koos Joyestikuga. Kõik
Vedeliku taseme andur (kasutades ultraheli): 5 sammu
Vedeliku taseme andur (kasutades ultraheli): Vedeliku taseme andur tuvastab vedeliku taseme maapinnalt. Lülitab mootori sisse (vajab mootori draiveri võimendit) alla antud väärtuse ja lülitab selle pärast vedeliku täitmist etteantud väärtuse kohal välja. Selle süsteemi omadused: töötab mis tahes li
Awesome liikuvad käigud, mida juhivad vinged nupud (jätkamiseks): 9 sammu
Awesome Moving Gears, mida juhivad vinged nupud (jätkub): füüsiline / elektrooniline mängukujundus UCLA Design Media Artsile koos Eddo Sterniga. See juhend on puudulik. Projekt on veel pooleli