Përmbajtje:
- Furnizimet
- Hapi 1: Zgjedhja e pajisjes
- Hapi 2: Hartimi i sistemit
- Hapi 3: Trajtimi i situatave emergjente
- Hapi 4: Drejtimi i sistemit 24/7
- Hapi 5: Monitorimi i reve
- Hapi 6: Punon
Video: Pompë Smart Coffee Machine e kontrolluar nga Raspberry Pi & HC-SR04 Sensor tejzanor dhe Cloud4RPi: 6 hapa
2024 Autor: John Day | [email protected]. E modifikuara e fundit: 2024-01-30 12:17
Në teori, sa herë që shkoni në aparatin e kafesë për filxhanin tuaj të mëngjesit, ka vetëm një mundësi në njëzet që të keni për të mbushur rezervuarin e ujit. Në praktikë, megjithatë, duket se makina në një farë mënyre gjen një mënyrë për ta vënë gjithmonë këtë punë të rëndë mbi ju. Sa më shumë që dëshironi kafe, aq më shumë ka gjasa që të merrni mesazhin e frikshëm "mbushni rezervuarin e ujit". Kolegët e mi ndihen njësoj për këtë. Duke qenë budallenjtë që jemi, ne vendosëm të zbatonim teknologjinë që do t'i jepte fund kësaj.
Furnizimet
Pajisjet tona
Ne kemi një aparat kafeje SAECO Aulika Focus. Deri më sot, ne përdorëm një pompë dore për të mbushur rezervuarin e ujit të makinës nga një shishe standarde uji 5 Gallon (19L).
Qëllimet tona
- Përdorni një pompë elektrike të drejtuar nga një lloj kontrolluesi ose një mikrokompjuter përmes një stafetë.
- Keni një mënyrë për të matur nivelin e ujit në rezervuarin e makinës së kafesë në mënyrë që sistemi ynë të dijë kur ta rimbush atë.
- Keni mjete për të kontrolluar sistemin, mundësisht në kohë reale nga një pajisje celulare.
- Merrni njoftime (përmes Slack ose një shërbimi të ngjashëm) nëse diçka nuk shkon mirë me sistemin.
Hapi 1: Zgjedhja e pajisjes
Pompë
Një kërkim i shpejtë në internet do të tregojë disa modele të pompave elektrike të dizajnuara për shishen tuaj të ujit të zgjedhur. Pompa të tilla zakonisht kontrollohen nga një çelës ON/OFF (për shembull, Hot Frost A12 ose SMixx ХL-D2). Këtu është pompa që kemi zgjedhur për projektin tonë.
Pajisja e Kontrolluesit
Ne provuam disa pajisje, por u vendosëm në një Raspberry Pi për shkak të përparësive të mëposhtme:
- Ka një GPIO që na lejon të lidhim një sensor afërsie
- Mbështet Python
Ne instaluam një version të ri të Raspbian Buster Lite dhe gjithçka që kërkohej për të drejtuar Python 3.
Si e ndryshojmë pompën
Për të kontrolluar fuqinë, ne zgjodhëm një stafetë të fuqisë mesatare (12V/2A) të përshtatshme për rrymë alternative. Stafeta lidh pompën me prizën dhe kontrollohet nga kunja dixhitale e Raspberry Pi.
Si të kontrollojmë nivelin e ujit
Ishte e rëndësishme për ne që të mos ndryshojmë strukturën e makinës së kafesë, kështu që vendosëm të përdorim sensorin e afërsisë tejzanor HC-SR04 për të matur nivelin e ujit.
Ne printuam 3D një mbulesë të rezervuarit të ujit me dy vrima për emetuesit e sensorit. Gjetëm lehtësisht një bibliotekë GitHub për sensorin. Në këtë pikë të gjitha përgatitjet kishin përfunduar.
Hapi 2: Hartimi i sistemit
Logjika e sistemit
Sistemi është krijuar me logjikën e thjeshtë të mëposhtme në mendje:
- Sistemi monitoron vazhdimisht distancën midis sensorit dhe sipërfaqes së ujit.
- Sa herë që një ndryshim në distancë kalon një vlerë pragu, sistemi dërgon informacion në lidhje me gjendjen e tij në re.
- Nëse distanca tejkalon vlerën maksimale të lejuar (rezervuari është bosh), sistemi aktivizon pompën dhe e fik atë pasi distanca është më e vogël se vlera minimale e lejuar.
- Sa herë që ndryshon gjendja e sistemit (për shembull, pompa aktivizohet), ajo informon cloud.
Në rast të një gabimi, një njoftim i dërgohet një kanali Slack.
Kur aparati i kafesë është i papunë, sistemi e shërben shërbimin cloud me të dhëna diagnostike një herë në minutë. Për më tepër, ai dërgon gjendjen e tij në re çdo 5 minuta.
Kur pompa është aktive, sistemi dërgon të dhëna më shpesh, por jo më shumë se një herë në gjysmë sekonde.
def send (cloud, variablat, dist, error_code = 0, force = False): pump_on = is_pump_on () qind = calc_water_level_percent (dist) variablat ['Distanca'] ['vlera'] = ndryshoret
aktuale = koha ()
koha globale e fundit_dërgimit nëse është me forcë ose aktuale - koha e_dërgimit të fundit> MIN_SEND_INTERVAL: lexime = cloud.read_data () cloud.publish_data (lexime) last_sending_time = aktuale
Duke punuar me pompën
Ne përcaktojmë konstantet e mëposhtme si bazë për logjikën e funksionimit të pompës.
# Kunjat GPIO (BCM) GPIO_PUMP = 4 GPIO_TRIGGER = 17 GPIO_ECHO = 27
# Pompë
START_PUMP = 1 STOP_PUMP = 0 PUMP_BOUNCE_TIME = 50 # milisekonda PUMP_STOP_TIMEOUT = 5 # sekonda
E RORTNDSISHME: Nëse do të përdorni Pin 4, mos harroni të çaktivizoni opsionin 1-Wire raspi-config për të shmangur konfliktet.
Në fillimin e programit, ne regjistrojmë një përgjigje në telefon dhe vendosim gjendjen fillestare në OFF.
Këtu është kodi për funksionin që ndryshon pompën:
def toggle_pump (vlera): nëse pump_disabled: kthehu nëse është_pump_on ()! = vlera: log_debug ("[x] % s" % ('START' nëse vlera tjetër 'STOP')) GPIO.setup (GPIO_PUMP, GPIO. OUT) GPIO.putput (GPIO_PUMP, vlera) # Fillimi/Ndalimi i derdhjes
Siç përcaktohet në kodin e fillimit më lart, kur stafeta ndizet, thirret thirrja e mëposhtme:
pump_on = Dorëzimi i rremë i pompës_relay_hand (pin): pompë globale mbi pump_on = GPIO.input (GPIO_PUMP) log_debug ("Stafeta e pompës ndryshoi në % d" % pump_on)
Në thirrjen kthyese, ne ruajmë gjendjen aktuale të pompës në një ndryshore. Në lakun kryesor të aplikacionit, ne mund të zbulojmë momentin kur pompa ndryshon siç tregohet më poshtë:
def is_pump_on (): pompë globale_në pompë_ kthimi
nëse GPIO.event_detected (GPIO_PUMP):
is_pouring = është_pump_on () #… log_debug ('[!] Ngjarja e pompës u zbulua: % s' % ('Aktiv' nëse po derdhet tjetër 'Joaktiv')) dërgoni (re, ndryshore, distanca, forca = E vërtetë)
Matja e Distancës
Quiteshtë mjaft e lehtë të matësh distancën drejt sipërfaqes së ujit duke përdorur një sensor tejzanor të afërsisë. Në depon tonë, ne ndamë disa shkrime python që ju lejojnë të provoni një sensor.
Në aplikimet reale, leximet e sensorëve mund të luhaten për shkak të efektit të kërcimit të sensorit dhe luhatjeve të ujit. Në disa raste, leximet mund të mungojnë plotësisht. Ne zbatuam një klasë BounceFilter që grumbullon N vlera të fundit, hedh majat dhe llogarit mesataren e matjeve të mbetura. Procesi i matjes zbatohet nga algoritmi asinkron i mëposhtëm.
# Mban matjet e fundit të leximit të sensorit = BounceFilter (madhësia = 6, discard_count = 1)
read_complete = filetim. Ngjarje ()
def wait_for_distance ():
read_complete.clear () thread = threading. Thread (target = read_distance) thread.start ()
nëse nuk lexon_plotë. prisni (MAX_READING_TIMEOUT):
log_info ("Periudha e leximit të sensorit të leximit") kthehet Asnjë lexim i kthimit.avg ()
def read_distance ():
provo: vlera = hcsr04.raw_distance (mostra_size = 5) e rrumbullakosur = vlera nëse vlera nuk është Asnjë tjetër e rrumbullakët (vlera, 1) lexime. shto (rrumbullakuar) përveç Përjashtim si gabim: log_error ('Gabim i brendshëm: % s' % gaboj) më në fund: read_complete.set ()
Ju mund të gjeni zbatimin e plotë të filtrit në burimet.
Hapi 3: Trajtimi i situatave emergjente
Po sikur sensori të digjej, ose të binte, ose të tregonte një zonë të gabuar? Ne kishim nevojë për një mënyrë për të raportuar raste të tilla në mënyrë që të mund të ndërmarrim veprime manuale.
Nëse sensori nuk arrin të sigurojë lexime në distancë, sistemi dërgon statusin e ndryshuar në re dhe gjeneron një njoftim përkatës.
Logjika ilustrohet nga kodi më poshtë.
distanca = prit_për_ distancë () # Lexo thellësinë aktuale të ujit nëse distanca është Asnjë: log_error ('Gabimi në distancë!') njofto_ në_përfundim (calc_alert (SENSOR_ERROR)) dërgoj (re, ndryshore, distancë, gabim_kod = SENSOR_ERROR, forcë = E vërtetë)
Ne kemi një gamë operacionale të nivelit të ujit që duhet të mirëmbahet kur sensori është në vendin e tij. Ne testojmë nëse niveli aktual i ujit bie në këtë interval:
# Distanca nga sensori në nivelin e ujit # bazuar në rezervuarin e ujit të makinës së kafesë MIN_DISTANCE = 2 # cm MAX_DISTANCE = 8 # cm
# Distanca është jashtë kufirit të pritshëm: mos filloni të derdhni
nëse distanca> MAX_DISTANCE * 2: log_error ('Distanca është jashtë rrezes: %.2f' % distancë) vazhdoni
Ne e fikim pompën nëse ishte aktive kur ndodhi një gabim.
nëse është_pump_on () dhe distanca e mëparshme <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('[!] Ndalimi urgjent i pompës. Asnjë sinjal nga sensori i distancës')
toggle_pump (STOP_PUMP)
Ne gjithashtu përpunojmë rastin kur shishja mbaron me ujë. Ne kontrollojmë nëse niveli i ujit nuk ndryshon kur pompa funksionon. Nëse është kështu, sistemi pret për 5 sekonda dhe pastaj kontrollon nëse pompa është fikur. Nëse jo, sistemi zbaton mbylljen e pompës emergjente dhe dërgon një njoftim gabimi.
PUMP_STOP_TIMEOUT = 5 # sekonde_ emergjence_stop_time = Asnjë
def set_emergency_stop_time (tani, po_ derdhet):
urgjente_stop_time globale
def check_water_source_empty (tani):
ktheni urgjencën_stop_ kohën dhe tani> urgjencën_stop_ kohën
# --------- lak kryesor -----------
nëse GPIO.event_detected (GPIO_PUMP): is_pouring = is_pump_on () set_emergency_stop_time (tani, po_ derdhet) #…
pompë globale_ e paaftë
nëse check_water_source_empty (tani): log_error ('[!] Ndalimi urgjent i pompës. / Burimi i ujit është bosh') toggle_pump (STOP_PUMP) pump_disabled = E vërtetë
Më sipër është një shembull i një regjistri mesazhesh të krijuar gjatë një ndalese emergjente.
Hapi 4: Drejtimi i sistemit 24/7
Kodi në pajisje është i korrigjuar dhe funksionon pa probleme. Ne e nisëm atë si një shërbim, kështu që riniset nëse Raspberry Pi rindizet. Për lehtësi, ne krijuam një Makefile që ndihmon në vendosjen, drejtimin e shërbimit dhe shikimin e regjistrave.
. PHONY: instaloni regjistrimin e statusit të fillimit të ndalesës vendosjen MAIN_FILE: = kafe-pompë/kryesore.py SERVICE_INSTALL_SCRIPT: = service_install.sh SERVICE_NAME: = kafe-pompë.shërbim
instalo:
chmod +x $ (SERVICE_INSTALL_SCRIPT) sudo./$(SERVICE_INSTALL_SCRIPT) $ (MAIN_FILE)
vrapo:
sudo python3 $ (MAIN_FILE)
fillo:
fillo sudo systemctl $ (SERVICE_NAME)
statusi:
statusi sudo systemctl $ (SERVICE_NAME)
ndalo:
ndalesa sudo systemctl $ (SERVICE_NAME)
log:
sudo journalctl -u kafe -pompë -që sot
vendos:
rsync -av kafe-pompë sensori-konfigurim Makefile *.sh pi@XX. XX. XXX. XXX: ~/
Ju mund ta gjeni këtë skedar dhe të gjithë skriptet e kërkuara në depon tonë.
Hapi 5: Monitorimi i reve
Ne përdorëm Cloud4RPi për të zbatuar një panel kontrolli. Ne së pari shtuam widget për të treguar parametrat thelbësorë të sistemeve.
Nga rruga, widget për ndryshoren STATUS mund të përdorë skema të ndryshme ngjyrash bazuar në vlerën e tij (shiko imazhin më lart).
Ne shtuam një widget grafik për të shfaqur të dhëna dinamike. Në imazhin më poshtë mund të shihni momentin kur pompa është ndezur dhe fikur dhe nivelet përkatëse të ujit.
Nëse analizoni një hapësirë më të gjatë kohore, mund të shihni majat - kjo është kur pompa po funksiononte.
Cloud4RPi gjithashtu ju lejon të vendosni nivele të ndryshme zbutjeje.
Hapi 6: Punon
Punon! Paneli i kontrollit në tërësinë e tij duket siç tregohet më poshtë.
Aktualisht, pompa jonë automatike ka funksionuar për disa javë dhe e tëra që na është dashur të bëjmë është të zëvendësojmë shishet e ujit. Kodi i plotë për projektin tonë është në dispozicion në depon tonë GitHub.
Recommended:
Pompë e kontrolluar Arduino për kullimin e ujit: 4 hapa (me fotografi)
Pompë e kontrolluar Arduino për kullimin e ujit: Ideja e këtij projekti doli kur bleva një kazan me gaz kondensues për banesën time. Unë nuk kam asnjë kullim afër për ujin e kondensuar që prodhon kaldaja. Kështu që uji mblidhet në një rezervuar prej 20 litrash (daulle) për disa ditë dhe kur të marrë
Si të bëni një robot të kontrolluar nga celulari Bazuar në DTMF - Pa Mikrokontrollues & Programim - Kontroll nga kudo në botë - RoboGeeks: 15 hapa
Si të bëni një robot të kontrolluar nga celulari Bazuar në DTMF | Pa Mikrokontrollues & Programim | Kontroll nga kudo në botë | RoboGeeks: Dëshironi të bëni një robot i cili mund të kontrollohet nga kudo në botë, Le ta bëjmë atë
Automatizimi dhe monitorimi i shtëpisë i kontrolluar nga zëri/interneti duke përdorur ESP8266 dhe Google Home Mini: 6 hapa
Automatizimi dhe monitorimi i shtëpisë i kontrolluar nga zëri/interneti duke përdorur ESP8266 dhe Google Home Mini: Hej !! Pas një pushimi të gjatë unë jam këtu pasi të gjithë duhet të bëjmë diçka të mërzitshme (punë) për të fituar. Pas të gjithë artikujve të AUTOMATITS SOM SHTPIS kam shkruar nga BLUETOOTH, IR, Local WIFI, Cloud dmth ato të vështirat, * TANI * vjen më e lehtë por më efikase
Zbulimi i pengesave dhe paralajmërimi - Arduino UNO dhe tejzanor: 4 hapa (me fotografi)
Zbulimi i pengesave dhe paralajmërimi - Arduino UNO dhe tejzanor: Ky është një mësim për t'ju ndihmuar të kuptoni ultratinguj dhe zhurmë dhe të shkoni më thellë në mësimin e Arduino, ndiqni këto hapa dhe më jepni reagime
Rick & Morty: Shpëtoni nga Universi! Sensori i afërsisë tejzanor: 7 hapa (me fotografi)
Rick & Morty: Shpëtoni nga Universi! Sensori i afërsisë tejzanor Lojë: Për çfarë bëhet fjalë? Loja është shumë e thjeshtë. Ju kontrolloni anijen kozmike në të cilën ndodhen Rick dhe Morty duke lëvizur dorën lart e poshtë sensorit të afërsisë tejzanor. Objektivi: Mblidhni armët e portalit për të fituar rezultat, frikacak Jerry the Worm double