Obsah:

Inteligentné čerpadlo na kávovar ovládané ultrazvukovým senzorom Raspberry Pi a HC-SR04 a cloud4RPi: 6 krokov
Inteligentné čerpadlo na kávovar ovládané ultrazvukovým senzorom Raspberry Pi a HC-SR04 a cloud4RPi: 6 krokov

Video: Inteligentné čerpadlo na kávovar ovládané ultrazvukovým senzorom Raspberry Pi a HC-SR04 a cloud4RPi: 6 krokov

Video: Inteligentné čerpadlo na kávovar ovládané ultrazvukovým senzorom Raspberry Pi a HC-SR04 a cloud4RPi: 6 krokov
Video: Inteligentný dom s neobmedzeným rozpočtom – nahliadnite dovnútra! | Loxone 2022 [4K] 2024, Júl
Anonim
Inteligentná pumpa do kávovaru ovládaná ultrazvukovým senzorom Raspberry Pi a HC-SR04 a Cloud4RPi
Inteligentná pumpa do kávovaru ovládaná ultrazvukovým senzorom Raspberry Pi a HC-SR04 a Cloud4RPi

Teoreticky vždy, keď idete do kávovaru na rannú šálku, je len jedna z dvadsiatich šancí, že budete musieť naplniť nádrž na vodu. V praxi sa však zdá, že stroj akosi nájde spôsob, ako vám túto fušku vždy položiť. Čím viac kávy chcete, tým je väčšia pravdepodobnosť, že sa vám zobrazí obávaná správa „naplňte nádržku na vodu“. Rovnako to vnímajú aj moji kolegovia. Keďže sme hlupáci, ktorými sme, rozhodli sme sa implementovať technológiu, ktorá s tým skončí.

Zásoby

Naše zariadenie

Máme kávovar SAECO Aulika Focus. Až do dnešného dňa sme používali ručnú pumpu na plnenie nádrže na vodu zo štandardnej fľaše na vodu s objemom 19 litrov.

Naše ciele

  1. Použite elektrické čerpadlo poháňané nejakým radičom alebo mikropočítačom cez relé.
  2. Majte spôsob, ako zmerať hladinu vody v nádrži kávovaru, aby náš systém vedel, kedy ju doplniť.
  3. Mať prostriedky na ovládanie systému, najlepšie v reálnom čase z mobilného zariadenia.
  4. Dostávajte upozornenia (prostredníctvom služby Slack alebo podobnej služby), ak sa v systéme niečo pokazí.

Krok 1: Výber zariadenia

Výber zariadenia
Výber zariadenia
Výber zariadenia
Výber zariadenia
Výber zariadenia
Výber zariadenia
Výber zariadenia
Výber zariadenia

Čerpadlo

Rýchle vyhľadávanie na internete zobrazí niekoľko modelov elektrických čerpadiel navrhnutých pre zvolenú fľašu vody. Také čerpadlá sa zvyčajne ovládajú vypínačom ON/OFF (napríklad Hot Frost A12 alebo SMixx ХL-D2). Tu je pumpa, ktorú sme si vybrali pre náš projekt.

Ovládacie zariadenie

Vyskúšali sme niekoľko zariadení, ale usadili sme sa na Raspberry Pi kvôli nasledujúcim výhodám:

  • Má GPIO, ktoré nám umožňuje pripojiť snímač priblíženia
  • Podporuje Python

Nainštalovali sme novú verziu Raspbian Buster Lite a všetko potrebné na spustenie Pythonu 3.

Ako prepíname čerpadlo

Na ovládanie napájania sme vybrali polovodičové relé so stredným výkonom (12V/2A) vhodné pre striedavý prúd. Relé pripája čerpadlo k zásuvke a je ovládané digitálnym kolíkom Raspberry Pi.

Ako kontrolujeme hladinu vody

Bolo pre nás dôležité nemeniť konštrukciu kávovaru, a preto sme sa na meranie hladiny vody rozhodli použiť ultrazvukový senzor priblíženia HC-SR04.

Vytlačili sme 3D vlastný kryt nádrže na vodu s dvoma otvormi pre žiariče senzora. Pre senzor sme ľahko našli knižnicu GitHub. V tomto bode boli všetky prípravy dokončené.

Krok 2: Navrhovanie systému

Navrhovanie systému
Navrhovanie systému
Navrhovanie systému
Navrhovanie systému

Logika systému

Systém je navrhnutý s ohľadom na nasledujúcu jednoduchú logiku:

  • Systém neustále monitoruje vzdialenosť medzi senzorom a vodnou hladinou.
  • Kedykoľvek zmena vzdialenosti prekročí prahovú hodnotu, systém pošle do cloudu informácie o svojom stave.
  • Ak vzdialenosť prekročí maximálnu povolenú hodnotu (nádrž je prázdna), systém aktivuje čerpadlo a vypne ho, akonáhle je vzdialenosť menšia ako minimálna povolená hodnota.
  • Kedykoľvek sa zmení stav systému (napríklad sa aktivuje pumpa), informuje cloud.

V prípade chyby sa na kanál Slack odošle upozornenie.

Keď je kávovar nečinný, systém pinguje cloudovú službu s diagnostickými údajmi raz za minútu. Okrem toho odosiela svoj stav do cloudu každých 5 minút.

Keď je pumpa aktívna, systém odosiela údaje častejšie, ale nie viac ako raz za pol sekundy.

def send (cloud, premenné, dist, error_code = 0, force = False): pump_on = is_pump_on () percent = calc_water_level_percent (dist) variables ['Distance'] ['value'] = dist variables ['WaterLevel'] [' hodnota '] = percentuálne premenné [' PumpRelay '] [' hodnota '] = premenné pump_on [' stav '] [' hodnota '] = stav_kalkuly (chybový_kód, percento, pump_on)

aktuálny = čas ()

globálny čas posledného odoslania, ak je platný alebo aktuálny - čas posledného odoslania> MIN_SEND_INTERVAL: readings = cloud.read_data () cloud.publish_data (čítania) last_sending_time = aktuálny

Práca s pumpou

Nasledujúce konštanty definujeme ako základ pre logiku prevádzky čerpadla.

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

# Čerpadlo

START_PUMP = 1 STOP_PUMP = 0 PUMP_BOUNCE_TIME = 50 # milisekúnd PUMP_STOP_TIMEOUT = 5 # s

DÔLEŽITÉ: Ak sa chystáte používať Pin 4, nezabudnite vypnúť možnosť 1-Wire raspi-config, aby ste predišli konfliktom.

Pri spustení programu zaregistrujeme spätné volanie a nastavíme počiatočný stav na VYPNUTÉ.

Tu je kód pre funkciu, ktorá prepína pumpu:

def toggle_pump (hodnota): ak pump_disabled: vráti ak is_pump_on ()! = hodnota: log_debug ("[x] % s" % ('START' ak je hodnota iná 'STOP')) GPIO.setup (GPIO_PUMP, GPIO. OUT) GPIO.output (GPIO_PUMP, hodnota) # Spustenie/zastavenie nalievania

Ako je definované v spúšťacom kóde vyššie, keď sa relé zopne, volá sa nasledujúce spätné volanie:

pump_on = False def pump_relay_handle (pin): global pump_on pump_on = GPIO.input (GPIO_PUMP) log_debug ("Relé pumpy zmenené na % d" % pump_on)

Pri spätnom volaní uložíme aktuálny stav pumpy do premennej. V hlavnej slučke aplikácie môžeme zistiť okamih, kedy sa pumpa prepína, ako je uvedené nižšie:

def is_pump_on (): global pump_on return pump_on

if GPIO.event_detected (GPIO_PUMP):

is_pouring = is_pump_on () #… log_debug ('[!] Bola zistená udalosť pumpy: % s' % ('On', ak is_pouring else 'Off')) send (cloud, variables, distance, force = True)

Meranie vzdialenosti

Zmerať vzdialenosť k vodnej hladine pomocou ultrazvukového senzora priblíženia je celkom jednoduché. V našom úložisku sme zdieľali niekoľko pythonových skriptov, ktoré vám umožňujú testovať senzor.

V skutočných aplikáciách môžu hodnoty senzora kolísať v dôsledku odrazového efektu senzora a oscilácií vody. V niektorých prípadoch môžu údaje úplne chýbať. Implementovali sme triedu BounceFilter, ktorá akumuluje N posledných hodnôt, zahodí vrcholy a vypočíta priemer zostávajúcich meraní. Proces merania je implementovaný nasledujúcim asynchrónnym algoritmom.

# Zachováva posledné čítanie meraní senzora = BounceFilter (veľkosť = 6, discard_count = 1)

reading_complete = threading. Event ()

def wait_for_distance ():

reading_complete.clear () vlákno = navliekanie. Vlákno (cieľ = vzdialenosť na čítanie) thread.start ()

ak nie je read_complete.wait (MAX_READING_TIMEOUT):

log_info ('Časový limit snímača čítania') návrat Žiadny návrat readings.avg ()

def read_distance ():

try: value = hcsr04.raw_distance (sample_size = 5) rounded = value if value is None else round (value, 1) readings.add (rounded) except Exception as err: log_error ('Internal error: % s' % err) konečne: reading_complete.set ()

Úplnú implementáciu filtra nájdete v zdrojoch.

Krok 3: Riešenie núdzových situácií

Riešenie núdzových situácií
Riešenie núdzových situácií
Riešenie núdzových situácií
Riešenie núdzových situácií
Riešenie núdzových situácií
Riešenie núdzových situácií

Čo keď snímač vyhorel alebo spadol alebo ukázal na nesprávnu oblasť? Potrebovali sme spôsob, ako hlásiť takéto prípady, aby sme mohli podniknúť manuálne opatrenia.

Ak snímač neposkytne údaje o vzdialenosti, systém odošle zmenený stav do cloudu a vygeneruje zodpovedajúce upozornenie.

Logiku ilustruje nasledujúci kód.

distance = wait_for_distance () # Prečítajte si aktuálnu hĺbku vody, ak vzdialenosť nie je žiadna: log_error („Chyba vzdialenosti!“)

Máme prevádzkový rozsah hladiny vody, ktorý by sa mal udržiavať, keď je snímač na svojom mieste. Testujeme, či aktuálna hladina vody klesá v tomto rozsahu:

# Vzdialenosť od senzora k hladine vody # podľa nádržky na vodu kávovaru MIN_DISTANCE = 2 # cm MAX_DISTANCE = 8 # cm

# Vzdialenosť je mimo očakávaného rozsahu: nezačínajte sypať

ak vzdialenosť> MAX_DISTANCE * 2: log_error („Vzdialenosť je mimo rozsah: %.2f“% vzdialenosť) pokračovať

Čerpadlo vypneme, ak bolo aktívne, keď sa vyskytla chyba.

if is_pump_on () and prev_distance <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('[!] Emergency stop of the pump. No signal from a distance sensor')

toggle_pump (STOP_PUMP)

Spracovávame aj prípad, keď fľaši dôjde voda. Skontrolujeme, či sa hladina vody nemení, keď čerpadlo beží. Ak je to tak, systém počká 5 sekúnd a potom skontroluje, či sa čerpadlo vyplo. Ak nie, systém implementuje núdzové vypnutie čerpadla a odošle upozornenie na chybu.

PUMP_STOP_TIMEOUT = 5 # secsemergency_stop_time = Žiadne

def set_emergency_stop_time (now, is_pouring):

globálny núdzový_stop_čas núdzový_stop_čas = teraz + PUMP_STOP_TIMEOUT, ak / is_pouring else None

def check_water_source_empty (now):

vráťte núdzový_stop_čas a teraz> núdzový_stop_čas

# --------- hlavná slučka -----------

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

global pump_disabled

if check_water_source_empty (now): log_error ('[!] Emergency stop of the pump. / Water source is empty') toggle_pump (STOP_PUMP) pump_disabled = True

Hore je príklad denníka správ generovaného počas núdzového zastavenia.

Krok 4: Spustenie systému 24/7

Beh systému 24/7
Beh systému 24/7

Kód v zariadení je ladený a beží bez problémov. Spustili sme ho ako službu, takže sa reštartuje, ak sa Raspberry Pi reštartuje. Pre pohodlie sme vytvorili súbor Makefile, ktorý pomáha s nasadením, spustením služby a zobrazovaním denníkov.

. PHONY: nainštalovať beh spustiť stop stavový protokol nasadiť MAIN_FILE: = coffee-pump/main.py SERVICE_INSTALL_SCRIPT: = service_install.sh SERVICE_NAME: = coffee-pump.service

Inštalácia:

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

beh:

sudo python3 $ (MAIN_FILE)

štart:

sudo systemctl start $ (SERVICE_NAME)

postavenie:

sudo systemctl status $ (SERVICE_NAME)

zastaviť:

sudo systemctl stop $ (SERVICE_NAME)

denník:

sudo journalctl -u coffee -pump -od dnes

nasadiť:

rsync -av snímač čerpadla čerpadla-nastavenie Makefile *.sh pi@XX. XX. XXX. XXX: ~/

Tento súbor a všetky požadované skripty nájdete v našom úložisku.

Krok 5: Cloudové monitorovanie

Cloudové monitorovanie
Cloudové monitorovanie
Cloudové monitorovanie
Cloudové monitorovanie
Cloudové monitorovanie
Cloudové monitorovanie
Cloudové monitorovanie
Cloudové monitorovanie

Na implementáciu ovládacieho panela sme použili Cloud4RPi. Najprv sme pridali miniaplikácie na označenie základných parametrov systému.

Mimochodom, miniaplikácia pre premennú STATUS môže používať rôzne farebné schémy na základe svojej hodnoty (pozri obrázok vyššie).

Pridali sme widget grafu na zobrazenie dynamických údajov. Na obrázku nižšie vidíte okamih zapnutia a vypnutia čerpadla a príslušné hladiny vody.

Ak analyzujete dlhšie časové obdobie, môžete vidieť špičky - vtedy čerpadlo bežalo.

Cloud4RPi vám tiež umožňuje nastaviť rôzne úrovne vyhladzovania.

Krok 6: Funguje to

Image
Image

Funguje to! Ovládací panel ako celok vyzerá ako na obrázku nižšie.

V súčasnej dobe naša automatická pumpa funguje už niekoľko týždňov a stačilo nám len vymeniť fľaše s vodou. Úplný kód pre náš projekt je k dispozícii v našom úložisku GitHub.

Odporúča: