Kazalo:

Pametna črpalka za aparat za kavo, ki jo nadzira ultrazvočni senzor Raspberry Pi & HC-SR04 in Cloud4RPi: 6 korakov
Pametna črpalka za aparat za kavo, ki jo nadzira ultrazvočni senzor Raspberry Pi & HC-SR04 in Cloud4RPi: 6 korakov

Video: Pametna črpalka za aparat za kavo, ki jo nadzira ultrazvočni senzor Raspberry Pi & HC-SR04 in Cloud4RPi: 6 korakov

Video: Pametna črpalka za aparat za kavo, ki jo nadzira ultrazvočni senzor Raspberry Pi & HC-SR04 in Cloud4RPi: 6 korakov
Video: BP DOCTOR PRO Smart Watch Blood Pressure Monitor: Is It as Accurate as a Traditional BP Monitor? 2024, November
Anonim
Pametna črpalka za aparat za kavo, ki jo nadzirata ultrazvočni senzor Raspberry Pi & HC-SR04 in Cloud4RPi
Pametna črpalka za aparat za kavo, ki jo nadzirata ultrazvočni senzor Raspberry Pi & HC-SR04 in Cloud4RPi

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

  1. Uporabite električno črpalko, ki jo preko releja poganja nekakšen krmilnik ali mikroračunalnik.
  2. Izmerite raven vode v rezervoarju aparata za kavo, da bo naš sistem vedel, kdaj ga napolniti.
  3. Imeti sredstva za nadzor sistema, po možnosti v realnem času iz mobilne naprave.
  4. Prejemajte obvestila (prek Slacka ali podobne storitve), če gre s sistemom kaj narobe.

1. korak: Izbira opreme

Izbira opreme
Izbira opreme
Izbira opreme
Izbira opreme
Izbira opreme
Izbira opreme
Izbira opreme
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

Oblikovanje sistema
Oblikovanje sistema
Oblikovanje sistema
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

Obravnavanje izrednih razmer
Obravnavanje izrednih razmer
Obravnavanje izrednih razmer
Obravnavanje izrednih razmer
Obravnavanje izrednih razmer
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

Zagon sistema 24/7
Zagon sistema 24/7

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

Nadzor v oblaku
Nadzor v oblaku
Nadzor v oblaku
Nadzor v oblaku
Nadzor v oblaku
Nadzor v oblaku
Nadzor v oblaku
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

Image
Image

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: