Përmbajtje:

Pompë Smart Coffee Machine e kontrolluar nga Raspberry Pi & HC-SR04 Sensor tejzanor dhe Cloud4RPi: 6 hapa
Pompë Smart Coffee Machine e kontrolluar nga Raspberry Pi & HC-SR04 Sensor tejzanor dhe Cloud4RPi: 6 hapa

Video: Pompë Smart Coffee Machine e kontrolluar nga Raspberry Pi & HC-SR04 Sensor tejzanor dhe Cloud4RPi: 6 hapa

Video: Pompë Smart Coffee Machine e kontrolluar nga Raspberry Pi & HC-SR04 Sensor tejzanor dhe Cloud4RPi: 6 hapa
Video: НЕВЕРОЯТНО ВКУСНЫЙ ШАШЛЫК! УДИВИТЕЛЬНО МЯГКИЙ и СОЧНЫЙ. ШАШЛЫК в АРБУЗНОМ МАРИНАДЕ 2024, Nëntor
Anonim
Pompë Smart Coffee Machine e kontrolluar nga Raspberry Pi & HC-SR04 Sensor tejzanor dhe Cloud4RPi
Pompë Smart Coffee Machine e kontrolluar nga Raspberry Pi & HC-SR04 Sensor tejzanor dhe Cloud4RPi

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

  1. Përdorni një pompë elektrike të drejtuar nga një lloj kontrolluesi ose një mikrokompjuter përmes një stafetë.
  2. 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ë.
  3. Keni mjete për të kontrolluar sistemin, mundësisht në kohë reale nga një pajisje celulare.
  4. 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

Zgjedhja e Pajisjes
Zgjedhja e Pajisjes
Zgjedhja e Pajisjes
Zgjedhja e Pajisjes
Zgjedhja e Pajisjes
Zgjedhja e Pajisjes
Zgjedhja e Pajisjes
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

Projektimi i Sistemit
Projektimi i Sistemit
Projektimi i Sistemit
Projektimi 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

Trajtimi i situatave emergjente
Trajtimi i situatave emergjente
Trajtimi i situatave emergjente
Trajtimi i situatave emergjente
Trajtimi i situatave emergjente
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

Drejtimi i sistemit 24/7
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

Monitorimi i reve
Monitorimi i reve
Monitorimi i reve
Monitorimi i reve
Monitorimi i reve
Monitorimi i reve
Monitorimi i reve
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

Image
Image

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: