Obsah:
- Zásoby
- Krok 1: Výběr vybavení
- Krok 2: Navrhování systému
- Krok 3: Řešení mimořádných situací
- Krok 4: Spuštění systému 24/7
- Krok 5: Cloudové monitorování
- Krok 6: Funguje to
Video: Inteligentní pumpa do kávovaru ovládaná ultrazvukovým senzorem Raspberry Pi a HC-SR04 a Cloud4RPi: 6 kroků
2024 Autor: John Day | [email protected]. Naposledy změněno: 2024-01-30 08:21
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
- Použijte elektrické čerpadlo poháněné nějakým ovladačem nebo mikropočítačem přes relé.
- 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.
- Mít prostředky k ovládání systému, nejlépe v reálném čase z mobilního zařízení.
- 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í
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
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í
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
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í
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
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:
Připojení ESP 32 s ultrazvukovým senzorem: 3 kroky
Propojení ESP 32 s ultrazvukovým senzorem: Ultrazvukové senzory fungují tak, že vydávají zvukové vlny na příliš vysoké frekvenci, aby je lidé neslyšeli. Poté čekají, až se zvuk odrazí zpět, a vypočítají vzdálenost podle požadovaného času. Je to podobné tomu, jak radar měří čas, který zabere
Alarm Arduino s ultrazvukovým senzorem: 5 kroků (s obrázky)
Alarm Arduino s ultrazvukovým senzorem: Tento návod je o tom, jak si sami vyrobit snadné a levné alarmové zařízení. Potřebujete pouze základní znalosti z elektroniky a programování arduina. Pokud máte nějaké dotazy nebo problémy, můžete mě kontaktovat na mém e -mailu: iwx [email protected] Zde
Rozhraní Arduino s ultrazvukovým senzorem a bezkontaktním snímačem teploty: 8 kroků
Rozhraní Arduino s ultrazvukovým senzorem a bezkontaktním snímačem teploty: V dnešní době výrobci, vývojáři upřednostňují Arduino pro rychlý vývoj prototypování projektů. Arduino je open-source elektronická platforma založená na snadno použitelném hardwaru a softwaru. Arduino má velmi dobrou komunitu uživatelů. V tomto projektu
Vylepšené RC autíčko s ultrazvukovým senzorem (Arduino): 3 kroky
Vylepšené RC autíčko s ultrazvukovým senzorem (Arduino): Jedná se o RC autíčko, které bylo upgradováno jako RC auto Arduino vyhýbající se předmětům. Odstranili jsme původní desku RC auta a použili jsme pouze stejnosměrné motory. Toto RC autíčko obsahuje dva stejnosměrné motory , jeden v přední části vozu jako motor řízení a druhý stejnosměrný
Myš Bluetooth s ultrazvukovým senzorem a fotobuňkou: 10 kroků (s obrázky)
Myš Bluetooth s ultrazvukovým senzorem a fotobuňkou: Malý úvod, proč jsem tento projekt vytvořil. Právě hledám adoptovat kotě do svého nového domu. A poté, co jsem prošel několika hratelnými věcmi pro kočky, jsem si řekl: proč si neudělat hračku sám. Takže jsem vytvořil myš Bluetooth. Můžete si