Tartalomjegyzék:

Okos kávéfőző szivattyú a Raspberry Pi és a HC-SR04 ultrahangos érzékelő és a Cloud4RPi vezérlésével: 6 lépés
Okos kávéfőző szivattyú a Raspberry Pi és a HC-SR04 ultrahangos érzékelő és a Cloud4RPi vezérlésével: 6 lépés

Videó: Okos kávéfőző szivattyú a Raspberry Pi és a HC-SR04 ultrahangos érzékelő és a Cloud4RPi vezérlésével: 6 lépés

Videó: Okos kávéfőző szivattyú a Raspberry Pi és a HC-SR04 ultrahangos érzékelő és a Cloud4RPi vezérlésével: 6 lépés
Videó: A Raspberry és Te - Kovács Zoltán: Pellettüzelésű kazánt vezérlő rendszer 2024, Június
Anonim
Okos kávéfőző szivattyú a Raspberry Pi és a HC-SR04 ultrahangos érzékelő és a Cloud4RPi vezérlésével
Okos kávéfőző szivattyú a Raspberry Pi és a HC-SR04 ultrahangos érzékelő és a Cloud4RPi vezérlésével

Elméletileg minden alkalommal, amikor a kávéfőzőhöz megy a reggeli csészéért, csak egy a huszadiknak az esélye, hogy meg kell töltenie a víztartályt. A gyakorlatban azonban úgy tűnik, hogy a gép valahogy megtalálja a módját, hogy ezt a házimunkát mindig rábírja. Minél többet szeretne kávét, annál nagyobb valószínűséggel kapja meg a rettegett „töltse fel a víztartályt” üzenetet. A kollégáim is hasonlóan vélekednek erről. Mivel mi vagyunk a malacok, úgy döntöttünk, hogy megvalósítjuk azt a technológiát, amely ennek véget vet.

Kellékek

Berendezéseink

Van egy SAECO Aulika Focus kávéfőzőnk. A mai napig kézi szivattyúval töltöttük fel a gép víztartályát egy standard 5 literes (19 literes) vizespalackból.

Céljaink

  1. Használjon elektromos szivattyút, amelyet valamilyen vezérlő vagy mikroszámítógép hajt egy relén keresztül.
  2. Legyen módja a kávéfőző tartályában lévő vízszint mérésére, hogy rendszerünk tudja, mikor kell újratölteni.
  3. Legyen eszköze a rendszer vezérlésére, lehetőleg valós időben, mobileszközről.
  4. Értesítések fogadása (a Slack vagy hasonló szolgáltatáson keresztül), ha bármi baj van a rendszerrel.

Lépés: A berendezés kiválasztása

A berendezés kiválasztása
A berendezés kiválasztása
A berendezés kiválasztása
A berendezés kiválasztása
A berendezés kiválasztása
A berendezés kiválasztása
A berendezés kiválasztása
A berendezés kiválasztása

A pumpa

Egy gyors internetes keresés számos elektromos szivattyúmodellt jelenít meg az Ön által választott kulacshoz. Az ilyen szivattyúkat általában egy BE/KI kapcsoló vezérli (például Hot Frost A12 vagy SMixx ХL-D2). Itt van a szivattyú, amelyet a projektünkhöz választottunk.

A vezérlő eszköz

Több eszközt is kipróbáltunk, de a Raspberry Pi mellett döntöttünk a következő előnyök miatt:

  • GPIO -val rendelkezik, amely lehetővé teszi a közelségérzékelő csatlakoztatását
  • Támogatja a Python -ot

Telepítettük a Raspbian Buster Lite friss verzióját és mindent, ami a Python 3 futtatásához szükséges.

Hogyan kapcsoljuk be a szivattyút

A teljesítmény szabályozásához egy közepes teljesítményű (12V/2A) szilárdtest relét választottunk, amely alkalmas váltakozó áramra. A relé a szivattyút a kimenethez köti, és a Raspberry Pi digitális csapja vezérli.

Hogyan ellenőrizzük a vízszintet

Fontos volt számunkra, hogy ne változtassuk meg a kávéfőző szerkezetét, ezért úgy döntöttünk, hogy a HC-SR04 ultrahangos közelségérzékelőt használjuk a vízszint mérésére.

3D-s nyomtatást készítettünk az egyedi víztartály fedelére, két lyukkal az érzékelő kibocsátói számára. Könnyen találtunk egy GitHub könyvtárat az érzékelő számára. Ezen a ponton minden előkészítés befejeződött.

2. lépés: A rendszer tervezése

A rendszer tervezése
A rendszer tervezése
A rendszer tervezése
A rendszer tervezése

A rendszer logikája

A rendszer a következő egyszerű logikát szem előtt tartva készült:

  • A rendszer folyamatosan figyeli az érzékelő és a vízfelület közötti távolságot.
  • Amikor a távolság változása meghaladja a küszöbértéket, a rendszer információt küld az állapotáról a felhőnek.
  • Ha a távolság meghaladja a megengedett legnagyobb értéket (a tartály üres), a rendszer aktiválja a szivattyút, és kikapcsolja, ha a távolság kisebb, mint a megengedett legkisebb érték.
  • Amikor a rendszer állapota megváltozik (például a szivattyú bekapcsol), tájékoztatja a felhőt.

Hiba esetén értesítést küld a Slack csatornára.

Amikor a kávéfőző tétlen, a rendszer percenként egyszer feljelenti a felhőszolgáltatást diagnosztikai adatokkal. Ezenkívül 5 percenként elküldi állapotát a felhőbe.

Amikor a szivattyú aktív, a rendszer gyakrabban, de legfeljebb fél másodpercenként küld adatokat.

def send (felhő, változók, dist, error_code = 0, force = False): pump_on = is_pump_on () percent = calc_water_level_percent (dist) variables ['Distance'] ['value'] = dist variables ['WaterLevel'] [' value '] = százalékos változó [' PumpRelay '] [' value '] = pump_on variables [' Status '] [' value '] = calc_status (error_code, percent, pump_on)

jelenlegi = idő ()

globális last_sending_time ha erő vagy aktuális - last_sending_time> MIN_SEND_INTERVAL: readings = cloud.read_data () cloud.publish_data (olvasmányok) last_sending_time = aktuális

Munka a szivattyúval

A következő állandókat definiáljuk a szivattyú működési logikájának alapjaként.

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

# Szivattyú

START_PUMP = 1 STOP_PUMP = 0 PUMP_BOUNCE_TIME = 50 # ezredmásodperc PUMP_STOP_TIMEOUT = 5 # másodperc

FONTOS: Ha a 4. tűt fogja használni, ne felejtse el letiltani az 1 vezetékes raspi-config opciót a konfliktusok elkerülése érdekében.

A program indításakor regisztrálunk egy visszahívást, és a kezdeti állapotot OFF -ra állítjuk.

Itt található a szivattyút váltó funkció kódja:

def toggle_pump (érték): if pump_disabled: return if is_pump_on ()! = value: log_debug ("[x] % s" % ('START' if else value 'STOP')) GPIO.setup (GPIO_PUMP, GPIO. OUT) GPIO.output (GPIO_PUMP, érték) # Öntés leállítása/leállítása

A fenti indítási kódban meghatározottak szerint a relé bekapcsolásakor a következő visszahívás hívódik:

pump_on = Hamis def pump_relay_handle (pin): globális pump_on pump_on = GPIO.input (GPIO_PUMP) log_debug ("A szivattyú relé % d -re változott" % pump_on)

A visszahívásban mentjük a szivattyú aktuális állapotát egy változóba. Az alkalmazás fő hurkában észlelhetjük azt a pillanatot, amikor a szivattyú átkapcsol az alábbiak szerint:

def is_pump_on (): globális pump_on return pump_on

ha GPIO.event_detected (GPIO_PUMP):

is_pouring = is_pump_on () #… log_debug ('[!] Szivattyúesemény észlelve: % s' % ('On', ha is_pouring else 'Off')) send (felhő, változók, távolság, erő = igaz)

A távolság mérése

Az ultrahangos közelségérzékelő segítségével nagyon könnyű megmérni a vízfelülethez mért távolságot. Tárunkban megosztottunk néhány python -szkriptet, amelyek lehetővé teszik az érzékelő tesztelését.

Valós alkalmazásokban az érzékelő leolvasása ingadozhat az érzékelő ugráló hatása és a víz lengése miatt. Bizonyos esetekben az értékek teljesen hiányozhatnak. Bevezettünk egy BounceFilter osztályt, amely N friss értékeket halmoz fel, elveti a csúcsokat és kiszámítja a fennmaradó mérések átlagát. A mérési folyamatot a következő aszinkron algoritmus hajtja végre.

# Megőrzi az utolsó érzékelői méréseket.

reading_complete = threading. Event ()

def wait_for_distance ():

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

ha nem olvassa el a teljes.várakozást (MAX_READING_TIMEOUT):

log_info ('Olvasási érzékelő időtúllépése') return Nincs visszatérés readings.avg ()

def read_distance ():

try: value = hcsr04.raw_distance (minta_mérete = 5) kerekítve = érték, ha az érték Nincs más kerek (érték, 1) readings.add (kerekítve), kivéve a kivétel mint hibát: log_error ('Belső hiba: % s' % err) végül: reading_complete.set ()

A szűrő teljes megvalósítását megtalálhatja a forrásokban.

3. lépés: Vészhelyzetek kezelése

Vészhelyzetek kezelése
Vészhelyzetek kezelése
Vészhelyzetek kezelése
Vészhelyzetek kezelése
Vészhelyzetek kezelése
Vészhelyzetek kezelése

Mi van, ha az érzékelő kiégett, leesett, vagy rossz helyre mutat? Szükségünk volt az ilyen esetek bejelentésének módjára, hogy manuálisan tegyünk lépéseket.

Ha az érzékelő nem tudja megadni a távolság leolvasását, a rendszer elküldi a megváltozott állapotot a felhőnek, és megfelelő értesítést generál.

A logikát az alábbi kód szemlélteti.

distance = wait_for_distance () # Olvassa el az aktuális vízmélységet, ha a távolság nincs: log_error ('Távolsághiba!') értesítés_háttérben (calc_alert (SENSOR_ERROR)) send (felhő, változók, távolság, error_code = SENSOR_ERROR, force = True)

Van egy működési vízszint -tartományunk, amelyet fenn kell tartani, amikor az érzékelő a helyén van. Vizsgáljuk, hogy az aktuális vízszint ebbe a tartományba esik -e:

# Az érzékelő és a vízszint közötti távolság # a kávéfőző víztartálya alapján MIN_DISTANCE = 2 # cm MAX_DISTANCE = 8 # cm

# A távolság a várt tartományon kívül van: ne kezdje el önteni

ha a távolság> MAX_DISTANCE * 2: log_error ('A távolság kívül esik a tartományon: %.2f' % távolság) folytassa

Lekapcsoljuk a szivattyút, ha hiba esetén aktív volt.

if is_pump_on () és prev_distance <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('[!] A szivattyú vészleállítása. Nincs jel a távolságérzékelőből')

toggle_pump (STOP_PUMP)

Azt az esetet is feldolgozzuk, amikor a palackból kifogy a víz. Ellenőrizzük, hogy a vízszint nem változik -e a szivattyú működése közben. Ha igen, a rendszer 5 másodpercet vár, majd ellenőrzi, hogy a szivattyú kikapcsolta -e. Ha nem, akkor a rendszer végrehajtja a szivattyú vészleállítását, és hibaüzenetet küld.

PUMP_STOP_TIMEOUT = 5 # secsemergency_stop_time = Nincs

def set_emergency_stop_time (most, is_pouring):

globális vészhelyzet_megállási idő vészhelyzet_időzítési ideje = most + PUMP_STOP_TIMEOUT, ha / is_pouring else Nincs

def check_water_source_empty (most):

return_stop_time és most> ārkārtas_stop_idő

# --------- főhurok -----------

ha GPIO.event_detected (GPIO_PUMP): is_pouring = is_pump_on () set_emergency_stop_time (most, is_pouring) #…

globális pump_disabled

if check_water_source_empty (most): log_error ('[!] A szivattyú vészleállítása. / A vízforrás üres') toggle_pump (STOP_PUMP) pump_disabled = Igaz

A fenti példa a vészleállítás során létrehozott üzenetnapló.

4. lépés: A rendszer futtatása a nap 24 órájában

A rendszer futtatása a nap 24 órájában
A rendszer futtatása a nap 24 órájában

Az eszközön található kódot hibakeresés után futtatják, és gond nélkül fut. Szolgáltatásként indítottuk el, tehát újraindul, ha a Raspberry Pi újraindul. A kényelem érdekében létrehoztunk egy Makefile -t, amely segít a telepítésben, a szolgáltatás futtatásában és a naplók megtekintésében.

. PHONY: telepítés futtatás start stop állapotnapló telepítés MAIN_FILE: = coffee-pump/main.py SERVICE_INSTALL_SCRIPT: = service_install.sh SERVICE_NAME: = coffee-pump.service

telepítés:

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

fuss:

sudo python3 $ (MAIN_FILE)

Rajt:

sudo systemctl start $ (SERVICE_NAME)

állapot:

sudo systemctl állapot $ (SERVICE_NAME)

álljon meg:

sudo systemctl stop $ (SERVICE_NAME)

napló:

sudo journalctl -u kávépumpa -mától

telepítés:

rsync -av kávépumpa érzékelő beállítása Makefile *.sh pi@XX. XX. XXX. XXX: ~/

Ezt a fájlt és az összes szükséges szkriptet megtalálja a tárházunkban.

5. lépés: Felhőfigyelés

Felhőfigyelés
Felhőfigyelés
Felhőfigyelés
Felhőfigyelés
Felhőfigyelés
Felhőfigyelés
Felhőfigyelés
Felhőfigyelés

A Cloud4RPi -t használtuk a vezérlőpult megvalósításához. Először modulokat adtunk hozzá, amelyek jelzik a rendszer alapvető paramétereit.

Egyébként a STATUS változó widgetje különböző színsémákat használhat az értéke alapján (lásd a fenti képet).

Hozzáadtunk egy diagram widgetet a dinamikus adatok megjelenítéséhez. Az alábbi képen láthatja a szivattyú be- és kikapcsolásának pillanatát, valamint a megfelelő vízszintet.

Ha hosszabb időtartamot elemez, csúcsokat láthat - ekkor működött a szivattyú.

A Cloud4RPi lehetővé teszi különböző simítási szintek beállítását is.

6. lépés: Működik

Image
Image

Működik! A kezelőpanel teljes egészében az alábbiak szerint néz ki.

Jelenleg automatikus szivattyúnk hetek óta működik, és csak a vizespalackok cseréjét kellett elvégeznünk. Projektünk teljes kódja elérhető a GitHub adattárunkban.

Ajánlott: