Kazalo:
- Zaloge
- 1. korak: Izbira opreme
- 2. korak: Oblikovanje sistema
- 3. korak: Obravnavanje izrednih razmer
- 4. korak: Zaženite sistem 24 ur na dan
- 5. korak: Nadzor v oblaku
- Korak 6: Deluje
Video: Pametna črpalka za aparat za kavo, ki jo nadzira ultrazvočni senzor Raspberry Pi & HC-SR04 in Cloud4RPi: 6 korakov
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-30 12:04
Teoretično, vsakič, ko greste do aparata za kavo na jutranjo skodelico, obstaja le ena od dvajsetih možnosti, da morate napolniti rezervoar za vodo. V praksi pa se zdi, da stroj nekako najde način, da vam to nalogo vedno naloži. Bolj kot si želite kave, večja je verjetnost, da boste prejeli grozljivo sporočilo "napolnite rezervoar za vodo". Tudi moji kolegi se glede tega počutijo enako. Ker smo norci, smo se odločili za uporabo tehnologije, ki bi temu naredila konec.
Zaloge
Naša oprema
Imamo aparat za kavo SAECO Aulika Focus. Do danes smo z ročno črpalko polnili rezervoar za vodo stroja iz standardne 5 -litrske (19 -litrske) steklenice za vodo.
Naši cilji
- Uporabite električno črpalko, ki jo preko releja poganja nekakšen krmilnik ali mikroračunalnik.
- Izmerite raven vode v rezervoarju aparata za kavo, da bo naš sistem vedel, kdaj ga napolniti.
- Imeti sredstva za nadzor sistema, po možnosti v realnem času iz mobilne naprave.
- Prejemajte obvestila (prek Slacka ali podobne storitve), če gre s sistemom kaj narobe.
1. korak: Izbira opreme
Črpalka
Hitro spletno iskanje bo prikazalo več modelov električnih črpalk, namenjenih vaši steklenici vode. Takšne črpalke običajno krmili stikalo za vklop/izklop (na primer Hot Frost A12 ali SMixx ХL-D2). Tu je črpalka, ki smo jo izbrali za naš projekt.
Krmilna naprava
Preizkusili smo več naprav, vendar smo se odločili za Raspberry Pi zaradi naslednjih prednosti:
- Ima GPIO, ki nam omogoča priključitev senzorja bližine
- Podpira Python
Namestili smo novo različico Raspbian Buster Lite in vse, kar je potrebno za zagon Pythona 3.
Kako preklopimo črpalko
Za nadzor moči smo izbrali polprevodniški rele srednje moči (12V/2A), primeren za izmenični tok. Rele priključi črpalko na vtičnico in ga krmili digitalni zatič Raspberry Pi.
Kako preverimo nivo vode
Za nas je bilo pomembno, da ne spreminjamo konstrukcije aparata za kavo, zato smo se za merjenje nivoja vode odločili uporabiti ultrazvočni senzor bližine HC-SR04.
3D-natisnili smo pokrov rezervoarja za vodo z dvema luknjama za oddajnike senzorja. Z lahkoto smo našli knjižnico GitHub za senzor. Na tej točki so bile vse priprave končane.
2. korak: Oblikovanje sistema
Logika sistema
Sistem je zasnovan z upoštevanjem naslednje preproste logike:
- Sistem stalno spremlja razdaljo med senzorjem in vodno površino.
- Kadar koli sprememba razdalje preseže mejno vrednost, sistem pošlje informacije o svojem stanju v oblak.
- Če razdalja presega največjo dovoljeno vrednost (rezervoar je prazen), sistem vklopi črpalko in jo izklopi, ko je razdalja manjša od najmanjše dovoljene vrednosti.
- Kadar se stanje sistema spremeni (na primer črpalka vklopi), o tem obvesti oblak.
V primeru napake se na Slack kanal pošlje obvestilo.
Ko aparat za kavo ne deluje, sistem enkrat na minuto pokliče storitev v oblaku z diagnostičnimi podatki. Poleg tega vsakih 5 minut pošlje svoje stanje v oblak.
Ko je črpalka aktivna, sistem podatke pošilja pogosteje, vendar največ enkrat na pol sekunde.
def send (cloud, variables, dist, error_code = 0, force = False): pump_on = is_pump_on () odstotkov = calc_water_level_percent (dist) spremenljivke ['Distance'] ['value'] = dist spremenljivke ['WaterLevel'] [' value '] = odstotne spremenljivke [' PumpRelay '] [' value '] = spremenljivke pump_on [' Status '] [' value '] = calc_status (koda napake, odstotek, črpalka_on)
trenutni = čas ()
globalno last_sending_time if force ali current - last_sending_time> MIN_SEND_INTERVAL: odčitki = cloud.read_data () cloud.publish_data (odčitki) last_sending_time = current
Delo s črpalko
Naslednje konstante opredeljujemo kot osnovo za logiko delovanja črpalke.
# GPIO zatiči (BCM) GPIO_PUMP = 4 GPIO_TRIGGER = 17 GPIO_ECHO = 27
# Črpalka
START_PUMP = 1 STOP_PUMP = 0 PUMP_BOUNCE_TIME = 50 # milisekund PUMP_STOP_TIMEOUT = 5 # s
POMEMBNO: Če boste uporabljali Pin 4, ne pozabite onemogočiti možnosti 1-Wire raspi-config, da se izognete konfliktom.
Ob zagonu programa registriramo povratni klic in nastavimo začetno stanje na OFF.
Tu je koda za funkcijo, ki preklopi črpalko:
def toggle_pump (value): if pump_disabled: return if is_pump_on ()! = value: log_debug ("[x] % s" % ('START' if value else 'STOP')) GPIO.setup (GPIO_PUMP, GPIO. OUT) GPIO.output (GPIO_PUMP, vrednost) # Začni/ustavi vlivanje
Kot je opredeljeno v zgornji zagonski kodi, se ob vklopu releja pokliče naslednji povratni klic:
pump_on = False def pump_relay_handle (pin): global pump_on pump_on = GPIO.input (GPIO_PUMP) log_debug ("Rele črpalke spremenjen v % d" % pump_on)
Pri povratnem klicu shranimo trenutno stanje črpalke v spremenljivko. V glavni zanki aplikacije lahko zaznamo trenutek, ko črpalka preklopi, kot je prikazano spodaj:
def is_pump_on (): globalna pump_on povratna pump_on
če je zaznan GPIO.event_devent (GPIO_PUMP):
is_pouring = is_pump_on () #… log_debug ('[!] Zaznan dogodek črpalke: % s' % ('Vklopljeno', če je is_pouring else 'Off')) pošlji (oblak, spremenljivke, razdalja, sila = True)
Merjenje razdalje
Z ultrazvočnim senzorjem bližine je zelo enostavno izmeriti razdaljo do vodne površine. V našem skladišču smo delili nekaj skriptov python, ki vam omogočajo, da preizkusite senzor.
V resničnih aplikacijah lahko odčitki senzorja nihajo zaradi odbijanja senzorja in nihanja vode. V nekaterih primerih lahko odčitki popolnoma manjkajo. Izvedli smo razred BounceFilter, ki zbira N zadnjih vrednosti, zavrže vrhove in izračuna povprečje preostalih meritev. Merilni proces se izvaja po naslednjem asinhronem algoritmu.
# Ohrani zadnje meritve senzorja = BounceFilter (velikost = 6, odvrg_štev = 1)
read_complete = threading. Event ()
def wait_for_distance ():
read_complete.clear () nit = threading. Thread (target = read_distance) thread.start ()
če ne read_complete.wait (MAX_READING_TIMEOUT):
log_info ('Časovna omejitev senzorja za branje') return Brez vračila readings.avg ()
def read_distance ():
poskusite: vrednost = hcsr04.raw_distance (vzorec_size = 5) zaokroženo = vrednost, če je vrednost Nič drugega okroglo (vrednost, 1) readings.add (zaokroženo) razen izjeme kot napake: log_error ('Notranja napaka: % s' % err) končno: reading_complete.set ()
Popolno izvajanje filtra najdete v virih.
3. korak: Obravnavanje izrednih razmer
Kaj pa, če je tipalo izgorelo ali je padlo ali kaže na napačno območje? Potrebovali smo način za prijavo takih primerov, da bomo lahko ročno ukrepali.
Če senzor ne zagotovi odčitkov razdalje, sistem pošlje spremenjeno stanje v oblak in ustvari ustrezno obvestilo.
Logiko ponazarja spodnja koda.
distance = wait_for_distance () # Preberite trenutno globino vode, če je razdalja None: log_error ('Distance error!') notify_in_background (calc_alert (SENSOR_ERROR)) send (cloud, variables, distance, error_code = SENSOR_ERROR, force = True)
Imamo delovno območje nivoja vode, ki ga je treba vzdrževati, ko je senzor na svojem mestu. Preverimo, ali trenutni nivo vode pade v to območje:
# Razdalja od senzorja do nivoja vode # glede na rezervoar za vodo aparata za kavo MIN_DISTANCE = 2 # cm MAX_DISTANCE = 8 # cm
# Razdalja je izven pričakovanega območja: ne začnite točiti
če je razdalja> MAX_DISTANCE * 2: log_error ('Razdalja je izven območja: %.2f' % razdalje) nadaljujte
Če je prišlo do napake, črpalko izklopimo.
če je is_pump_on () in prev_distance <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('[!] Zaustavitev črpalke v sili. Ni signala senzorja razdalje')
toggle_pump (STOP_PUMP)
Obdelamo tudi primer, ko steklenici zmanjka vode. Preverimo, ali se nivo vode med delovanjem črpalke ne spremeni. Če je tako, sistem počaka 5 sekund in nato preveri, ali se je črpalka izklopila. Če ni, sistem izvede zaustavitev črpalke v sili in pošlje obvestilo o napaki.
PUMP_STOP_TIMEOUT = 5 # secsemergency_stop_time = Brez
def set_emergency_stop_time (zdaj, is_pouring):
globalna varnostna_stop_časovna_poročna_ustavna_časov = zdaj + PUMP_STOP_TIMEOUT, če / is_pouring drugače Nič
def check_water_source_empty (zdaj):
vrni sili_stop_čas in zdaj> nujni_ustav_čas
# --------- glavna zanka -----------
če je GPIO.event_detected (GPIO_PUMP): is_pouring = is_pump_on () set_emergency_stop_time (zdaj, is_pouring) #…
globalna črpalka -onemogočena
če je check_water_source_empty (zdaj): log_error ('[!] Zasilni izklop črpalke. / Vir vode je prazen ") toggle_pump (STOP_PUMP) pump_disabled = True
Zgoraj je primer dnevnika sporočil, ustvarjenega med zaustavitvijo v sili.
4. korak: Zaženite sistem 24 ur na dan
Koda v napravi je odpravljena in deluje brez težav. Zagnali smo ga kot storitev, zato se znova zažene, če se Raspberry Pi znova zažene. Za udobje smo ustvarili datoteko Makefile, ki pomaga pri uvajanju, izvajanju storitve in ogledu dnevnikov.
. PHONY: namestite zagon zagona ustavite dnevnik stanja uvedite MAIN_FILE: = coffee-pump/main.py SERVICE_INSTALL_SCRIPT: = service_install.sh SERVICE_NAME: = coffee-pump.service
namesti:
chmod +x $ (SERVICE_INSTALL_SCRIPT) sudo./$(SERVICE_INSTALL_SCRIPT) $ (MAIN_FILE)
teči:
sudo python3 $ (MAIN_FILE)
začetek:
sudo systemctl start $ (SERVICE_NAME)
stanje:
sudo systemctl status $ (SERVICE_NAME)
ustaviti:
sudo systemctl stop $ (SERVICE_NAME)
dnevnik:
sudo journalctl -u črpalka za kavo -od danes
razporedi:
rsync -av senzor črpalke za kavo-nastavitev Makefile *.sh pi@XX. XX. XXX. XXX: ~/
To datoteko in vse potrebne skripte najdete v našem skladišču.
5. korak: Nadzor v oblaku
Za izvedbo nadzorne plošče smo uporabili Cloud4RPi. Najprej smo dodali pripomočke za označevanje bistvenih parametrov sistema.
Mimogrede, pripomoček za spremenljivko STATUS lahko uporablja različne barvne sheme glede na njeno vrednost (glej zgornjo sliko).
Za prikaz dinamičnih podatkov smo dodali pripomoček za grafikon. Na spodnji sliki lahko vidite trenutek vklopa in izklopa črpalke ter ustrezne nivoje vode.
Če analizirate daljši časovni razpon, lahko vidite vrhove - takrat je črpalka delovala.
Cloud4RPi vam omogoča tudi nastavitev različnih ravni glajenja.
Korak 6: Deluje
Deluje! Nadzorna plošča v celoti izgleda, kot je prikazano spodaj.
Trenutno naša avtomatska črpalka deluje že nekaj tednov in vse, kar moramo storiti, je zamenjati steklenice z vodo. Celotna koda našega projekta je na voljo v našem skladišču GitHub.
Priporočena:
STONE Display +STM32 +Aparat za kavo: 6 korakov
STONE Display +STM32 +Aparat za kavo: Sem inženir programske opreme MCU, pred kratkim sem prejel projekt naj bo aparat za kavo, gospodinjske zahteve z zaslonom na dotik, funkcija je dobra, nad zaslonom izbira morda ni dobra, na srečo lahko ta projekt zavrnem
WiFi aparat za kavo: 9 korakov
WiFi aparat za kavo: Aparat za kavo Wifi uporablja Arduino, NODE MCU in reciklirane dele za varno in daljinsko skodelico kave
Pametna mizica za kavo: 14 korakov (s slikami)
Pametna mizica za kavo: Pozdravljeni, z veseljem ustvarjamo projekt, ki je bil v naših mislih že dolgo in ga delimo z vami. Pametna mizica za kavo. Ker je ta miza res pametna. Osvetljuje vaše okolje glede na težo vaše pijače
JavaStation (popolnoma samodejni popolnoma avtomatski IoT aparat za kavo): 9 korakov (s slikami)
JavaStation (Samodejno polnilni popolnoma avtomatski IoT aparat za kavo): Cilj tega projekta je bil izdelati popolnoma avtomatski aparat za kavo z glasovnim nadzorom, ki se samodejno napolni z vodo in vse kar morate storiti je, da zamenjate obiskovalce in popijete kavo; )
Aparat za kavo IOT (UFEE): 7 korakov (s slikami)
Aparat za kavo IOT (UFEE): Kot dokaz znanja smo morali ustvariti napravo IOT, ki bi jo lahko upravljali prek lastnega spletnega vmesnika. Ker obožujem kavo in jo dnevno uživam veliko, sem se odločil, da si naredim svoj aparat za kavo IOT. Aparat za kavo UFEE: "