Sadržaj:

Pametna pumpa za aparat za kavu kojom upravlja Raspberry Pi & HC-SR04 ultrazvučni senzor i Cloud4RPi: 6 koraka
Pametna pumpa za aparat za kavu kojom upravlja Raspberry Pi & HC-SR04 ultrazvučni senzor i Cloud4RPi: 6 koraka

Video: Pametna pumpa za aparat za kavu kojom upravlja Raspberry Pi & HC-SR04 ultrazvučni senzor i Cloud4RPi: 6 koraka

Video: Pametna pumpa za aparat za kavu kojom upravlja Raspberry Pi & HC-SR04 ultrazvučni senzor i Cloud4RPi: 6 koraka
Video: Часть 5 — Аудиокнига «Бэббит» Синклера Льюиса (главы 23–28) 2024, Srpanj
Anonim
Pametna pumpa za aparat za kavu kojom upravlja Raspberry Pi & HC-SR04 ultrazvučni senzor i Cloud4RPi
Pametna pumpa za aparat za kavu kojom upravlja Raspberry Pi & HC-SR04 ultrazvučni senzor i Cloud4RPi

U teoriji, svaki put kad odete do aparata za kavu na jutarnju šalicu, postoji samo jedna od dvadeset prilika da ćete morati napuniti spremnik vode. U praksi se, međutim, čini da stroj na neki način pronalazi način da vam ovaj posao uvijek prepusti. Što više želite kavu, veća je vjerojatnost da ćete dobiti strašnu poruku "napuni spremnik vode". Moje kolege osjećaju isto po tom pitanju. Budući da smo štreberi, odlučili smo implementirati tehnologiju koja će ovomu stati na kraj.

Pribor

Naša oprema

Imamo aparat za kavu SAECO Aulika Focus. Do danas smo koristili ručnu pumpu za punjenje spremnika vode u mašini iz standardne boce za vodu od 5 litara (19 l).

Naši ciljevi

  1. Koristite električnu pumpu koju pokreće neka vrsta kontrolera ili mikroračunalo preko releja.
  2. Imajte način izmjeriti razinu vode u spremniku aparata za kavu kako bi naš sustav znao kada ga treba napuniti.
  3. Imati sredstva za upravljanje sustavom, po mogućnosti u stvarnom vremenu s mobilnog uređaja.
  4. Primajte obavijesti (putem Slacka ili slične usluge) ako sustav pođe po zlu.

Korak 1: Odabir opreme

Odabir opreme
Odabir opreme
Odabir opreme
Odabir opreme
Odabir opreme
Odabir opreme
Odabir opreme
Odabir opreme

Pumpa

Brzo pretraživanje na webu prikazat će nekoliko modela električnih pumpi dizajniranih za vašu bocu vode po izboru. Takve se crpke obično upravljaju prekidačem za uključivanje/isključivanje (na primjer, Hot Frost A12 ili SMixx XL-D2). Evo pumpe koju smo odabrali za naš projekt.

Uređaj za upravljanje

Isprobali smo nekoliko uređaja, ali smo se odlučili za Raspberry Pi zbog sljedećih prednosti:

  • Ima GPIO koji nam omogućuje povezivanje senzora blizine
  • Podržava Python

Instalirali smo svježu verziju Raspbian Buster Lite i sve potrebno za pokretanje Pythona 3.

Kako prebacujemo pumpu

Za kontrolu snage odabrali smo poluprovodnički relej srednje snage (12V/2A) prikladan za izmjeničnu struju. Relej povezuje crpku s utičnicom i kontrolira se digitalnim pinom Raspberry Pi.

Kako provjeravamo razinu vode

Bilo nam je važno da ne mijenjamo konstrukciju aparata za kavu, pa smo odlučili upotrijebiti ultrazvučni senzor blizine HC-SR04 za mjerenje razine vode.

3D smo ispisali prilagođeni poklopac spremnika vode s dvije rupe za emitere senzora. Lako smo pronašli GitHub biblioteku za senzor. Tada su sve pripreme bile završene.

Korak 2: Projektiranje sustava

Projektiranje sustava
Projektiranje sustava
Projektiranje sustava
Projektiranje sustava

Logika sustava

Sustav je dizajniran imajući na umu sljedeću jednostavnu logiku:

  • Sustav stalno prati udaljenost između senzora i vodene površine.
  • Kad god promjena udaljenosti pređe graničnu vrijednost, sustav šalje informacije o svom stanju u oblak.
  • Ako udaljenost prelazi najveću dopuštenu vrijednost (spremnik je prazan), sustav uključuje pumpu i isključuje je kad udaljenost bude manja od minimalne dopuštene vrijednosti.
  • Kad god se stanje sustava promijeni (na primjer, crpka se aktivira), obavještava oblak.

U slučaju pogreške, obavijest se šalje Slack kanalu.

Kad je aparat za kavu u mirovanju, sustav jednom u minuti uputi uslugu oblaka s dijagnostičkim podacima. Osim toga, šalje svoje stanje u oblak svakih 5 minuta.

Kad je crpka aktivna, sustav šalje podatke češće, ali ne više od jednom u pola sekunde.

def send (cloud, varijable, dist, error_code = 0, force = False): pump_on = is_pump_on () postotak = calc_water_level_percent (dist) varijable ['Distance'] ['value'] = dist varijable ['WaterLevel'] [' vrijednost '] = varijable postotka [' PumpRelay '] [' vrijednost '] = varijable pump_on [' Status '] [' vrijednost '] = stanje kalc. (kôd pogreške, postotak, crpka_on)

struja = vrijeme ()

globalno last_sending_time if force or current - last_sending_time> MIN_SEND_INTERVAL: očitanja = cloud.read_data () cloud.publish_data (očitanja) last_sending_time = current

Rad s pumpom

Sljedeće konstante definiramo kao osnovu za logiku rada pumpe.

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

# Pumpa

START_PUMP = 1 STOP_PUMP = 0 PUMP_BOUNCE_TIME = 50 # milisekundi PUMP_STOP_TIMEOUT = 5 # sekundi

VAŽNO: Ako ćete koristiti Pin 4, ne zaboravite onemogućiti opciju 1-Wire raspi-config kako biste izbjegli sukobe.

Prilikom pokretanja programa registriramo povratni poziv i početno stanje postavljamo na OFF.

Evo koda za funkciju koja uključuje / isključuje pumpu:

def toggle_pump (value): if pump_disabled: return if is_pump_on ()! = value: log_debug ("[x] % s" % ('START' ako je vrijednost else 'STOP')) GPIO.setup (GPIO_PUMP, GPIO. OUT) GPIO.izlaz (GPIO_PUMP, vrijednost) # Start/Stop pouring

Kao što je definirano u gornjem kodu za pokretanje, kada se relej UKLJUČI, poziva se sljedeći povratni poziv:

pump_on = False def pump_relay_handle (pin): global pump_on pump_on = GPIO.input (GPIO_PUMP) log_debug ("Relej crpke promijenjen u % d" % pump_on)

U povratnom pozivu spremamo trenutno stanje crpke u varijablu. U glavnoj petlji aplikacije možemo otkriti trenutak prebacivanja crpke kao što je prikazano u nastavku:

def is_pump_on (): globalna pump_on povratna pump_on

ako je otkriven GPIO.event_devent (GPIO_PUMP):

is_pouring = is_pump_on () #… log_debug ('[!] Otkriven događaj pumpe: % s' % ('Uključeno' ako je_lijevanje drugo 'Isključeno')) slanje (oblak, varijable, udaljenost, sila = True)

Mjerenje udaljenosti

Vrlo je lako izmjeriti udaljenost do vodene površine pomoću ultrazvučnog senzora blizine. U našem spremištu podijelili smo nekoliko python skripti koje vam omogućuju testiranje senzora.

U stvarnim primjenama očitanja senzora mogu varirati zbog efekta odbijanja senzora i oscilacija vode. U nekim slučajevima očitanja mogu potpuno nedostajati. Implementirali smo klasu BounceFilter koja akumulira N nedavnih vrijednosti, odbacuje vrhove i izračunava prosjek preostalih mjerenja. Proces mjerenja provodi se sljedećim asinkronim algoritmom.

# Zadržava posljednja očitavanja mjerenja senzora = BounceFilter (veličina = 6, broj odbacivanja = 1)

read_complete = threading. Event ()

def wait_for_distance ():

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

ako nije čitanje_potpuno.čekajte (MAX_READING_TIMEOUT):

log_info ('Vremensko ograničenje senzora za čitanje') return Nema povratnih očitanja.avg ()

def read_distance ():

pokušajte: vrijednost = hcsr04.raw_distance (sample_size = 5) zaokruženo = vrijednost ako je vrijednost Ništa drugo okruglo (vrijednost, 1) readings.add (zaokruženo) osim iznimke kao pogreške: log_error ('Interna pogreška: % s' % err) konačno: reading_complete.set ()

Potpunu implementaciju filtra možete pronaći u izvorima.

Korak 3: Rješavanje izvanrednih situacija

Rješavanje izvanrednih situacija
Rješavanje izvanrednih situacija
Rješavanje izvanrednih situacija
Rješavanje izvanrednih situacija
Rješavanje izvanrednih situacija
Rješavanje izvanrednih situacija

Što ako je senzor izgorio, otpao ili pokazuje na pogrešno područje? Trebao nam je način da prijavimo takve slučajeve kako bismo mogli poduzeti ručne mjere.

Ako senzor ne uspije dati očitanja udaljenosti, sustav šalje promijenjeni status u oblak i generira odgovarajuću obavijest.

Logika je ilustrirana donjim kodom.

distance = wait_for_distance () # Pročitajte trenutnu dubinu vode ako udaljenost nije None: log_error ('Distance error!') notify_in_background (calc_alert (SENSOR_ERROR)) send (cloud, varijable, distance, error_code = SENSOR_ERROR, force = True)

Imamo radni raspon razine vode koji se treba održavati kada je senzor na svom mjestu. Testiramo pada li trenutna razina vode u ovom rasponu:

# Udaljenost od senzora do razine vode # na temelju spremnika za vodu u aparatu za kavu MIN_DISTANCE = 2 # cm MAX_DISTANCE = 8 # cm

# Udaljenost je izvan očekivanog raspona: nemojte početi lijevati

ako je udaljenost> MAX_DISTANCE * 2: log_error ('Udaljenost je izvan raspona: %.2f' % udaljenost) nastavi

Crpku isključujemo ako je bila aktivna kada je došlo do pogreške.

if is_pump_on () and pre_distance <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('[!] Hitno zaustavljanje crpke. Nema signala senzora udaljenosti')

toggle_pump (STOP_PUMP)

Obrađujemo i slučaj kada boci ponestane vode. Provjeravamo ne mijenja li se razina vode tijekom rada crpke. Ako je tako, sustav čeka 5 sekundi, a zatim provjerava je li se crpka isključila. Ako se to ne dogodi, sustav provodi nužno isključivanje pumpe i šalje obavijest o pogrešci.

PUMP_STOP_TIMEOUT = 5 # secsemergency_stop_time = Nema

def set_emergency_stop_time (sada, is_pouring):

globalna hitna_stopa_vremena hitna_zaustavljanja_vremena = sada + PUMP_STOP_TIMEOUT ako je / ulijevanje drugo Ništa

def check_water_source_empty (sada):

vratite hitno_ustanje_vremena i sada> hitno_stanje_vremena

# --------- glavna petlja -----------

ako je GPIO.event_detected (GPIO_PUMP): is_pouring = is_pump_on () set_emergency_stop_time (now, is_pouring) #…

globalna crpka_omogućena

if check_water_source_empty (now): log_error ('[!] Hitno zaustavljanje crpke. / Izvor vode je prazan') toggle_pump (STOP_PUMP) pump_disabled = True

Gore je primjer dnevnika poruka generiranog tijekom hitnog zaustavljanja.

Korak 4: Pokretanje sustava 24 sata dnevno

Pokretanje sustava 24 sata dnevno
Pokretanje sustava 24 sata dnevno

Kod na uređaju otklonjen je pogreške i radi bez problema. Pokrenuli smo ga kao uslugu pa se ponovno pokreće ako se Raspberry Pi ponovno pokrene. Radi praktičnosti, stvorili smo Makefile koji pomaže pri implementaciji, pokretanju usluge i pregledavanju dnevnika.

. PHONY: instaliraj run start start stop log log deploy MAIN_FILE: = pumpica za kavu/main.py SERVICE_INSTALL_SCRIPT: = service_install.sh SERVICE_NAME: = pumpica za kavu.service

instalirati:

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

trčanje:

sudo python3 $ (MAIN_FILE)

početak:

sudo systemctl start $ (SERVICE_NAME)

status:

sudo systemctl status $ (SERVICE_NAME)

Stop:

sudo systemctl stop $ (SERVICE_NAME)

zapisnik:

sudo journalctl -u pumpa za kavu --od danas

rasporediti:

rsync -av-senzor pumpe za kavu-postavljanje Makefile *.sh pi@XX. XX. XXX. XXX: ~/

Ovu datoteku i sve potrebne skripte možete pronaći u našem spremištu.

Korak 5: Nadzor nad oblakom

Nadzor nad oblakom
Nadzor nad oblakom
Nadzor nad oblakom
Nadzor nad oblakom
Nadzor nad oblakom
Nadzor nad oblakom
Nadzor nad oblakom
Nadzor nad oblakom

Za implementaciju upravljačke ploče koristili smo Cloud4RPi. Prvo smo dodali widgete za označavanje bitnih parametara sustava.

Usput, widget za varijablu STATUS može koristiti različite sheme boja na temelju svoje vrijednosti (vidi gornju sliku).

Dodali smo widget grafikona za prikaz dinamičkih podataka. Na donjoj slici možete vidjeti trenutak uključivanja i isključivanja pumpe te odgovarajuće razine vode.

Ako analizirate dulji vremenski raspon, možete vidjeti vrhove - tada je pumpa radila.

Cloud4RPi vam također omogućuje postavljanje različitih razina glađenja.

Korak 6: Radi

Image
Image

Radi! Upravljačka ploča u cijelosti izgleda kao što je prikazano u nastavku.

Trenutno naša automatska pumpa radi već nekoliko tjedana i sve što trebamo učiniti je zamijeniti boce s vodom. Cjelokupni kod za naš projekt dostupan je u našem GitHub spremištu.

Preporučeni: