Sadržaj:
- Supplies
- Korak 1: Odabir opreme
- Korak 2: Projektovanje sistema
- Korak 3: Rješavanje hitnih situacija
- Korak 4: Pokretanje sistema 24 sata dnevno
- Korak 5: Nadzor nad oblakom
- Korak 6: Radi
Video: Pametna pumpa za aparat za kavu koju kontroliše Raspberry Pi & HC-SR04 ultrazvučni senzor i Cloud4RPi: 6 koraka
2024 Autor: John Day | [email protected]. Zadnja izmjena: 2024-01-30 08:06
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
- Koristite električnu pumpu koju pokreće neka vrsta kontrolera ili mikroračunalo preko releja.
- Imajte način da izmjerite nivo vode u rezervoaru aparata za kafu kako bi naš sistem znao kada ga treba napuniti.
- Imati sredstva za upravljanje sistemom, po mogućnosti u stvarnom vremenu sa mobilnog uređaja.
- Primajte obavijesti (putem Slacka ili slične usluge) ako nešto pođe po zlu sa sistemom.
Korak 1: 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
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
Š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
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
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
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:
Parabear kapaljka sa linijom zmaja koju kontroliše telefon: 11 koraka
Parabear Dropper s telefonskom kontrolom: zmaj: UvodOva instrukcija opisuje kako izgraditi uređaj za ispuštanje do tri parabeara iz linije zmajeva. Uređaj djeluje kao bežična pristupna tačka, isporučuje web stranicu vašem telefonu ili tabletu. Ovo vam omogućava da kontrolišete pad parabeara
Pametni aparat za kavu - dio ekosistema SmartHome: 4 koraka
Pametni aparat za kavu - dio SmartHome ekosistema: Hakirani aparat za kavu, učinio ga dijelom SmartHome ekosistemaPo posjedujem stari dobri Delonghi aparat za kavu (DCM) (nije promocija i želim da bude „pametan“. Pa sam ga hakirao instaliranjem ESP8266 modul sa sučeljem za njegov mozak/mikrokontroler pomoću
Pametna LED lampa koja se kontroliše Bluetooth pametnim telefonom: 7 koraka
Pametna LED lampa koja se kontroliše Bluetooth pametnim telefonom: Uvijek sanjam da kontrolišem svoje rasvjetne uređaje. Tada je neko napravio neverovatnu šarenu LED lampu. Nedavno sam naišao na LED lampu Josepha Cashe na Youtube -u. Inspiriran njime, odlučio sam dodati nekoliko funkcija, zadržavajući pritom
Aparat za praćenje aparata za kavu s Raspberry Pi i Google tablicama: 5 koraka
Alat za praćenje aparata za kavu s Raspberry Pi i Google tablicama: Ova instrukcija će vam pokazati kako izgraditi aparat za praćenje na bazi Raspberry Pi za zajednički aparat za kavu u vašem uredskom prostoru. Koristeći OLED ekran i mehaničke prekidače za praćenje, korisnici mogu zabilježiti potrošnju kave, vidjeti ravnotežu i
Pretvorite (samo otprilike) bilo koju medijsku datoteku u (samo otprilike) bilo koju drugu medijsku datoteku besplatno!: 4 koraka
Pretvorite (samo otprilike) bilo koju medijsku datoteku u (samo otprilike) bilo koju drugu medijsku datoteku besplatno !: Moje prve instrukcije, svaka čast! U svakom slučaju, bio sam na Googleu u potrazi za besplatnim programom koji bi pretvorio moje datoteke Youtube.flv u format koji univerzalniji je, poput.wmv ili.mov. Pretražio sam bezbroj foruma i web stranica, a zatim pronašao program pod nazivom