Obsah:

Inteligentní pumpa do kávovaru ovládaná ultrazvukovým senzorem Raspberry Pi a HC-SR04 a Cloud4RPi: 6 kroků
Inteligentní pumpa do kávovaru ovládaná ultrazvukovým senzorem Raspberry Pi a HC-SR04 a Cloud4RPi: 6 kroků

Video: Inteligentní pumpa do kávovaru ovládaná ultrazvukovým senzorem Raspberry Pi a HC-SR04 a Cloud4RPi: 6 kroků

Video: Inteligentní pumpa do kávovaru ovládaná ultrazvukovým senzorem Raspberry Pi a HC-SR04 a Cloud4RPi: 6 kroků
Video: Veletrh IFA 2023 - exkluzivní reportáž - nové technologie a inovace domácích spotřebičů 2024, Červenec
Anonim
Inteligentní pumpa do kávovaru ovládaná ultrazvukovým senzorem Raspberry Pi a HC-SR04 a Cloud4RPi
Inteligentní pumpa do kávovaru ovládaná ultrazvukovým senzorem Raspberry Pi a HC-SR04 a Cloud4RPi

Teoreticky, pokaždé, když jdete do kávovaru pro svůj ranní šálek, je jen jedna ku dvaceti šancím, že budete muset naplnit nádrž na vodu. V praxi to ale vypadá, že si stroj nějak najde způsob, jak na vás tuto fušku vždy nasadit. Čím více budete chtít kávu, tím větší je pravděpodobnost, že se vám zobrazí obávaná zpráva „naplňte nádržku na vodu“. Stejně to vnímají i moji kolegové. Protože jsme hlupáci, jací jsme, rozhodli jsme se implementovat technologii, která to ukončí.

Zásoby

Naše vybavení

Máme kávovar SAECO Aulika Focus. Až do dnešního dne jsme pomocí ruční pumpy plnili nádrž na vodu ze standardní lahve na vodu o objemu 5 galonů (19 l).

Naše cíle

  1. Použijte elektrické čerpadlo poháněné nějakým ovladačem nebo mikropočítačem přes relé.
  2. Mějte způsob, jak změřit hladinu vody v nádrži kávovaru, aby náš systém věděl, kdy ji doplnit.
  3. Mít prostředky k ovládání systému, nejlépe v reálném čase z mobilního zařízení.
  4. Přijímejte oznámení (prostřednictvím služby Slack nebo podobné služby), pokud se v systému něco pokazí.

Krok 1: Výběr vybavení

Výběr vybavení
Výběr vybavení
Výběr vybavení
Výběr vybavení
Výběr vybavení
Výběr vybavení
Výběr vybavení
Výběr vybavení

Pumpa

Rychlé vyhledávání na webu zobrazí několik modelů elektrických pump navržených pro vámi vybranou láhev s vodou. Taková čerpadla jsou obvykle ovládána vypínačem ON/OFF (například Hot Frost A12 nebo SMixx ХL-D2). Zde je čerpadlo, které jsme vybrali pro náš projekt.

Řídicí zařízení

Vyzkoušeli jsme několik zařízení, ale usadili jsme se na Raspberry Pi kvůli následujícím výhodám:

  • Má GPIO, které nám umožňuje připojit senzor přiblížení
  • Podporuje Python

Nainstalovali jsme novou verzi Raspbian Buster Lite a vše potřebné ke spuštění Pythonu 3.

Jak přepínáme čerpadlo

Pro ovládání výkonu jsme vybrali polovodičové relé se středním výkonem (12V/2A) vhodné pro střídavý proud. Relé spojuje čerpadlo se zásuvkou a je ovládáno digitálním pinem Raspberry Pi.

Jak kontrolujeme hladinu vody

Bylo pro nás důležité nezměnit konstrukci kávovaru, proto jsme se rozhodli pro měření hladiny vody použít ultrazvukový senzor přiblížení HC-SR04.

Vytiskli jsme 3D kryt vlastní nádrže na vodu se dvěma otvory pro vysílače senzoru. Pro senzor jsme snadno našli knihovnu GitHub. V tuto chvíli byly všechny přípravy dokončeny.

Krok 2: Navrhování systému

Navrhování systému
Navrhování systému
Navrhování systému
Navrhování systému

Logika systému

Systém je navržen s následující jednoduchou logikou:

  • Systém neustále monitoruje vzdálenost mezi senzorem a vodní hladinou.
  • Kdykoli změna vzdálenosti překročí prahovou hodnotu, systém odešle informace o svém stavu do cloudu.
  • Pokud vzdálenost překročí maximální povolenou hodnotu (nádrž je prázdná), systém aktivuje čerpadlo a vypne jej, jakmile je vzdálenost menší než minimální povolená hodnota.
  • Kdykoli se změní stav systému (například se aktivuje pumpa), informuje cloud.

V případě chyby je na kanál Slack odesláno oznámení.

Když je kávovar nečinný, systém pinguje cloudovou službu s diagnostickými daty jednou za minutu. Navíc každých 5 minut odesílá svůj stav do cloudu.

Když je pumpa aktivní, systém odesílá data častěji, ale ne více než jednou za půl sekundy.

def send (cloud, proměnné, dist, error_code = 0, force = False): pump_on = is_pump_on () procent = calc_water_level_percent (dist) variables ['Distance'] ['value'] = dist variables ['WaterLevel'] [' hodnota '] = proměnné v procentech [' PumpRelay '] [' hodnota '] = proměnné pump_on [' Stav '] [' hodnota '] = stav_počtu (kód_ chyby, procento, pump_on)

aktuální = čas ()

global last_sending_time if force or current - last_sending_time> MIN_SEND_INTERVAL: readings = cloud.read_data () cloud.publish_data (readings) last_sending_time = current

Práce s pumpou

Následující konstanty definujeme jako základ pro logiku provozu čerpadla.

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

# Čerpadlo

START_PUMP = 1 STOP_PUMP = 0 PUMP_BOUNCE_TIME = 50 # milisekund PUMP_STOP_TIMEOUT = 5 # s

DŮLEŽITÉ: Pokud budete používat Pin 4, nezapomeňte deaktivovat možnost 1-Wire raspi-config, abyste předešli konfliktům.

Při spuštění programu zaregistrujeme zpětné volání a nastavíme počáteční stav na VYPNUTO.

Zde je kód pro funkci, která přepíná čerpadlo:

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, hodnota) # Start/Stop nalévání

Jak je definováno ve spouštěcím kódu výše, když se relé sepne, volá se následující zpětné volání:

pump_on = False def pump_relay_handle (pin): global pump_on pump_on = GPIO.input (GPIO_PUMP) log_debug ("Pump relay changed to % d" % pump_on)

Při zpětném volání uložíme aktuální stav pumpy do proměnné. V hlavní smyčce aplikace můžeme detekovat okamžik, kdy se pumpa přepíná, jak je uvedeno níže:

def is_pump_on (): global pump_on return pump_on

pokud GPIO.event_detected (GPIO_PUMP):

is_pouring = is_pump_on () #… log_debug ('[!] Byla zjištěna událost pumpy: % s' % ('On', pokud is_pouring else 'Off')) send (cloud, variables, distance, force = True)

Měření vzdálenosti

Je velmi snadné změřit vzdálenost k vodní hladině pomocí ultrazvukového senzoru přiblížení. V našem úložišti jsme sdíleli několik pythonových skriptů, které vám umožňují testovat senzor.

Ve skutečných aplikacích mohou hodnoty senzorů kolísat kvůli odrazovému účinku senzoru a oscilacím vody. V některých případech mohou údaje zcela chybět. Implementovali jsme třídu BounceFilter, která akumuluje N posledních hodnot, zahodí vrcholy a vypočítá průměr zbývajících měření. Proces měření je implementován následujícím asynchronním algoritmem.

# Udržuje poslední měření senzoru čtení = BounceFilter (velikost = 6, discard_count = 1)

reading_complete = threading. Event ()

def wait_for_distance ():

reading_complete.clear () vlákno = threading. Thread (target = read_distance) thread.start ()

pokud není read_complete.wait (MAX_READING_TIMEOUT):

log_info ('Časový limit snímače čtení') návrat Žádný 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 ()

Úplnou implementaci filtru najdete ve zdrojích.

Krok 3: Řešení mimořádných situací

Řešení mimořádných situací
Řešení mimořádných situací
Řešení mimořádných situací
Řešení mimořádných situací
Řešení mimořádných situací
Řešení mimořádných situací

Co když snímač vyhořel nebo spadl nebo ukázal na špatnou oblast? Potřebovali jsme způsob, jak takové případy hlásit, abychom mohli podniknout ruční kroky.

Pokud snímač neposkytne údaje o vzdálenosti, systém odešle změněný stav do cloudu a vygeneruje odpovídající oznámení.

Logiku ilustruje níže uvedený kód.

distance = wait_for_distance () # Přečtěte si aktuální hloubku vody, pokud vzdálenost není Žádná: log_error ('Chyba vzdálenosti!')

Máme provozní rozsah hladiny vody, který by měl být udržován, když je senzor na svém místě. Testujeme, zda aktuální hladina vody klesne v tomto rozsahu:

# Vzdálenost od senzoru k vodní hladině # na základě vodní nádrže kávovaru MIN_DISTANCE = 2 # cm MAX_DISTANCE = 8 # cm

# Vzdálenost je mimo očekávaný rozsah: nezačínejte nalévat

pokud vzdálenost> MAX_DISTANCE * 2: log_error ('Vzdálenost je mimo rozsah: %.2f' % vzdálenost) pokračovat

Čerpadlo vypneme, pokud bylo aktivní, když došlo k chybě.

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)

Zpracováváme také případ, kdy láhvi dojde voda. Zkontrolujeme, zda se hladina vody nemění, když čerpadlo běží. Pokud ano, systém čeká 5 sekund a poté zkontroluje, zda se čerpadlo nevyplo. Pokud tomu tak není, systém implementuje nouzové vypnutí čerpadla a odešle oznámení o chybě.

PUMP_STOP_TIMEOUT = 5 # secsemergency_stop_time = Žádné

def set_emergency_stop_time (nyní is_pouring):

global emergency_stop_time emergency_stop_time = now + PUMP_STOP_TIMEOUT if / is_pouring else None

def check_water_source_empty (nyní):

vrátit nouzový_stop_čas a hned> nouzový_stop_čas

# --------- hlavní smyčka -----------

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

globální 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

Nahoře je příklad protokolu zpráv generovaného během nouzového zastavení.

Krok 4: Spuštění systému 24/7

Spuštění systému 24/7
Spuštění systému 24/7

Kód v zařízení je odladěn a běží bez problémů. Spustili jsme to jako službu, takže se restartuje, pokud se Raspberry Pi restartuje. Pro pohodlí jsme vytvořili soubor Makefile, který pomáhá s nasazením, spuštěním služby a zobrazováním protokolů.

. PHONY: install run start stop log log deploy MAIN_FILE: = coffee-pump/main.py SERVICE_INSTALL_SCRIPT: = service_install.sh SERVICE_NAME: = coffee-pump.service

Nainstalujte:

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

běh:

sudo python3 $ (MAIN_FILE)

Start:

sudo systemctl start $ (SERVICE_NAME)

postavení:

sudo systemctl status $ (SERVICE_NAME)

stop:

sudo systemctl stop $ (SERVICE_NAME)

protokol:

sudo journalctl -u coffee -pump -od dnešního dne

nasadit:

rsync -av nastavení čidla čerpadla kávy Makefile *.sh pi@XX. XX. XXX. XXX: ~/

Tento soubor a všechny požadované skripty najdete v našem úložišti.

Krok 5: Cloudové monitorování

Cloudové monitorování
Cloudové monitorování
Cloudové monitorování
Cloudové monitorování
Cloudové monitorování
Cloudové monitorování
Cloudové monitorování
Cloudové monitorování

K implementaci ovládacího panelu jsme použili Cloud4RPi. Nejprve jsme přidali widgety k označení základních parametrů systémů.

Mimochodem, widget pro proměnnou STATUS může používat různá barevná schémata na základě své hodnoty (viz obrázek výše).

Přidali jsme widget pro zobrazení dynamických dat. Na obrázku níže vidíte okamžik zapnutí a vypnutí čerpadla a příslušné hladiny vody.

Pokud analyzujete delší časové období, můžete vidět špičky - tehdy čerpadlo běželo.

Cloud4RPi také umožňuje nastavit různé úrovně vyhlazování.

Krok 6: Funguje to

Image
Image

Funguje to! Ovládací panel jako celek vypadá, jak je znázorněno níže.

V současné době naše automatické čerpadlo běží několik týdnů a vše, co jsme museli udělat, je vyměnit lahve s vodou. Úplný kód pro náš projekt je k dispozici v našem úložišti GitHub.

Doporučuje: