Sadržaj:

Pametna pumpa za aparat za kavu koju kontroliše Raspberry Pi & HC-SR04 ultrazvučni senzor i Cloud4RPi: 6 koraka
Pametna pumpa za aparat za kavu koju kontroliše Raspberry Pi & HC-SR04 ultrazvučni senzor i Cloud4RPi: 6 koraka

Video: Pametna pumpa za aparat za kavu koju kontroliše Raspberry Pi & HC-SR04 ultrazvučni senzor i Cloud4RPi: 6 koraka

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

U teoriji, svaki put kada odete do aparata za kafu na jutarnju šolju, postoji samo jedna od dvadeset šansi da ćete morati napuniti rezervoar za vodu. U praksi se, međutim, čini da mašina na neki način pronađe način da vam uvijek prepusti ovaj posao. Što više želite kafu, veća je vjerovatnoća da ćete dobiti poruku „napuni rezervoar za vodu“. Moje kolege imaju isto mišljenje o ovome. Budući da smo štreberi, odlučili smo implementirati tehnologiju koja će ovomu stati na kraj.

Supplies

Naša oprema

Imamo SAECO Aulika Focus aparat za kavu. Do danas smo koristili ručnu pumpu za punjenje spremnika vode u mašini iz standardne boce za vodu od 5 galona (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 da izmjerite nivo vode u rezervoaru aparata za kafu kako bi naš sistem znao kada ga treba napuniti.
  3. Imati sredstva za upravljanje sistemom, po mogućnosti u stvarnom vremenu sa mobilnog uređaja.
  4. Primajte obavijesti (putem Slacka ili slične usluge) ako nešto pođe po zlu sa sistemom.

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 pumpe se 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 kontrolera

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

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

Instalirali smo novu verziju Raspbian Buster Lite i sve što je potrebno za pokretanje Pythona 3.

Kako prebacujemo pumpu

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

Kako provjeravamo nivo vode

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

3D smo odštampali prilagođeni poklopac rezervoara za vodu sa dvije rupe za emitere senzora. Lako smo pronašli GitHub biblioteku za senzor. Tada su sve pripreme bile završene.

Korak 2: Projektovanje sistema

Projektovanje sistema
Projektovanje sistema
Projektovanje sistema
Projektovanje sistema

Logika sistema

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

  • Sistem stalno prati udaljenost između senzora i vodene površine.
  • Kad god promjena udaljenosti pređe graničnu vrijednost, sistem š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 minimalno dopuštene vrijednosti.
  • Kad god se stanje sistema promijeni (na primjer, pumpa se aktivira), obavještava oblak.

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

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

Kada je pumpa aktivna, sistem šalje podatke češće, ali ne više od jednom u pola sekunde.

def slanje (oblak, 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 '] = calc_status (kôd greške, postotak, pump_on)

trenutna = 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 sa 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 postavljamo početno stanje 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

Kako je definirano u gore navedenom 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 pumpe promijenjen u % d" % pump_on)

U povratnom pozivu spremamo trenutno stanje pumpe u varijablu. U glavnoj petlji aplikacije možemo otkriti trenutak prebacivanja pumpe 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

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

U stvarnim aplikacijama 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 implementiran je sljedećim asinhronim algoritmom.

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

čitanje_završeno = provlačenje. Event ()

def wait_for_distance ():

čitanje_kompletno.clear () nit = provlačenje. Tema (cilj = udaljenost_čitavanja) thread.start ()

ako ne čitate_kompletno.čekajte (MAX_READING_TIMEOUT):

log_info ('Vremensko ograničenje senzora za čitanje') return Ništa ne vraća readings.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 greške: log_error ('Interna greška: % s' % err) konačno: reading_complete.set ()

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

Korak 3: Rješavanje hitnih situacija

Postupanje u hitnim situacijama
Postupanje u hitnim situacijama
Postupanje u hitnim situacijama
Postupanje u hitnim situacijama
Postupanje u hitnim situacijama
Postupanje u hitnim situacijama

Šta 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, sistem šalje promijenjeni status u oblak i generira odgovarajuće obavještenje.

Logika je ilustrirana donjim kodom.

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

Imamo raspon operativnog nivoa vode koji treba održavati kada je senzor na svom mjestu. Testiramo pada li trenutni nivo vode u ovom rasponu:

# Udaljenost od senzora do nivoa vode # na osnovu rezervoara za vodu u aparatu za kafu MIN_DISTANCE = 2 # cm MAX_DISTANCE = 8 # cm

# Rastojanje je izvan očekivanog raspona: nemojte početi sipati

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

Isključujemo pumpu ako je bila aktivna kada je došlo do greške.

if is_pump_on () i prev_distance <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('[!] Zaustavljanje pumpe u nuždi. Nema signala sa senzora udaljenosti')

toggle_pump (STOP_PUMP)

Obrađujemo i slučaj kada boci ponestane vode. Provjeravamo ne mijenja li se razina vode tijekom rada pumpe. Ako je tako, sistem čeka 5 sekundi, a zatim provjerava je li pumpa isključena. Ako nije, sistem implementira isključivanje pumpe u slučaju nužde i šalje obavijest o grešci.

PUMP_STOP_TIMEOUT = 5 # secsemergency_stop_time = Nema

def set_emergency_stop_time (sada, is_pouring):

globalna hitna_stopa_vremena hitna_ustav_vreme = sada + PUMP_STOP_TIMEOUT ako je / izlijevanje drugo Ništa

def check_water_source_empty (sada):

vratite hitno_stanje_vreme i sada> hitno_stanje_vreme

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

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

globalno pump_disabled

ako je check_water_source_empty (sada): log_error ('[!] Hitno zaustavljanje pumpe. / Izvor vode je prazan') toggle_pump (STOP_PUMP) pump_disabled = Tačno

Gore je primjer dnevnika poruka generiranog tokom hitnog zaustavljanja.

Korak 4: Pokretanje sistema 24 sata dnevno

Pokretanje sistema 24 sata dnevno
Pokretanje sistema 24 sata dnevno

Kôd na uređaju je otklonjen i radi bez problema. Pokrenuli smo ga kao uslugu pa se ponovo 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

instaliraj:

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)

dnevnik:

sudo journalctl -u pumpa za kafu -od danas

razviti:

rsync -av-senzor postavke pumpe za kafu 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

Cloud Monitoring
Cloud Monitoring
Cloud Monitoring
Cloud Monitoring
Cloud Monitoring
Cloud Monitoring
Cloud Monitoring
Cloud Monitoring

Za implementaciju kontrolne ploče koristili smo Cloud4RPi. Prvo smo dodali widgete za označavanje bitnih parametara sistema.

Inače, widget za varijablu STATUS može koristiti različite sheme boja na osnovu njene vrijednosti (pogledajte gornju sliku).

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

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

Cloud4RPi vam takođe omogućava da postavite različite nivoe zaglađivanja.

Korak 6: Radi

Image
Image

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

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

Preporučuje se: