Sisällysluettelo:

Älykäs kahvinkeitinpumppu, jota ohjaavat Raspberry Pi & HC-SR04-ultraäänianturi ja Cloud4RPi: 6 vaihetta
Älykäs kahvinkeitinpumppu, jota ohjaavat Raspberry Pi & HC-SR04-ultraäänianturi ja Cloud4RPi: 6 vaihetta

Video: Älykäs kahvinkeitinpumppu, jota ohjaavat Raspberry Pi & HC-SR04-ultraäänianturi ja Cloud4RPi: 6 vaihetta

Video: Älykäs kahvinkeitinpumppu, jota ohjaavat Raspberry Pi & HC-SR04-ultraäänianturi ja Cloud4RPi: 6 vaihetta
Video: Жёлтые парижские жилеты: горит ли Париж? Ярость и гнев парижан из жёлтых жилетов и французов! 2024, Heinäkuu
Anonim
Älykäs kahvinkeitinpumppu, jota ohjaavat Raspberry Pi & HC-SR04-ultraäänianturi ja Cloud4RPi
Älykäs kahvinkeitinpumppu, jota ohjaavat Raspberry Pi & HC-SR04-ultraäänianturi ja Cloud4RPi

Teoriassa joka kerta, kun menet kahvikoneeseen aamukuppia varten, on vain yksi kahdeskymmenes mahdollisuus, että sinun on täytettävä vesisäiliö. Käytännössä näyttää kuitenkin siltä, että kone löytää jotenkin tavan asettaa tämä työ aina sinuun. Mitä enemmän haluat kahvia, sitä todennäköisemmin saat pelätyn "täytä vesisäiliö" -viestin. Kollegani ajattelevat samoin tästä. Koska me olemme nörttejä, päätimme ottaa käyttöön tekniikan, joka lopettaisi tämän.

Tarvikkeet

Laitteistomme

Meillä on SAECO Aulika Focus -kahvinkeitin. Tähän päivään asti käytimme käsipumppua täyttämään koneen vesisäiliön tavallisesta 5 litran (19 litran) vesipullosta.

Tavoitteemme

  1. Käytä sähköpumppua, jota ohjaa jonkinlainen ohjain tai mikrotietokone releen kautta.
  2. Voit mitata kahvinkeittimen säiliön vedenpinnan, jotta järjestelmämme tietää milloin se on täytettävä.
  3. Sinulla on keinot hallita järjestelmää mieluiten reaaliajassa mobiililaitteesta.
  4. Vastaanota ilmoituksia (Slackin tai vastaavan palvelun kautta), jos järjestelmässä on jotain vikaa.

Vaihe 1: Laitteiden valinta

Laitteiden valinta
Laitteiden valinta
Laitteiden valinta
Laitteiden valinta
Laitteiden valinta
Laitteiden valinta
Laitteiden valinta
Laitteiden valinta

Pumppu

Nopea verkkohaku näyttää useita sähköpumppumalleja, jotka on suunniteltu valitsemallesi vesipullolle. Tällaisia pumppuja ohjataan yleensä ON/OFF-kytkimellä (esimerkiksi Hot Frost A12 tai SMixx ХL-D2). Tässä on pumppu, jonka valitsimme projektillemme.

Ohjainlaite

Kokeilimme useita laitteita, mutta päädyimme Raspberry Pi -laitteeseen seuraavien etujen vuoksi:

  • Siinä on GPIO, jonka avulla voimme liittää läheisyysanturin
  • Se tukee Pythonia

Asensimme uuden Raspbian Buster Lite -version ja kaiken tarvittavan Python 3: n suorittamiseen.

Kuinka vaihdamme pumpun

Virran hallitsemiseksi valitsimme keskitehoisen (12V/2A) puolijohdereleen, joka soveltuu vaihtovirtaan. Rele yhdistää pumpun pistorasiaan ja sitä ohjaa Raspberry Pi: n digitaalinen nasta.

Kuinka tarkistamme vedenpinnan

Meille oli tärkeää, ettei kahvinkeittimen rakennetta muuteta, joten päätimme käyttää HC-SR04-ultraääni-läheisyysanturia vedenpinnan mittaamiseen.

Painimme 3D-vesisäiliön kannen, jossa oli kaksi reikää anturin lähettäjille. Löysimme helposti GitHub-kirjaston anturille. Tässä vaiheessa kaikki valmistelut olivat valmiit.

Vaihe 2: Järjestelmän suunnittelu

Järjestelmän suunnittelu
Järjestelmän suunnittelu
Järjestelmän suunnittelu
Järjestelmän suunnittelu

Järjestelmän logiikka

Järjestelmä on suunniteltu seuraavan yksinkertaisen logiikan mielessä:

  • Järjestelmä valvoo jatkuvasti anturin ja veden pinnan välistä etäisyyttä.
  • Aina kun etäisyyden muutos ylittää kynnysarvon, järjestelmä lähettää tietoja tilastaan pilveen.
  • Jos etäisyys ylittää suurimman sallitun arvon (säiliö on tyhjä), järjestelmä aktivoi pumpun ja sammuttaa sen, kun etäisyys on pienempi kuin sallittu vähimmäisarvo.
  • Aina kun järjestelmän tila muuttuu (esimerkiksi pumppu aktivoituu), se ilmoittaa siitä pilvelle.

Virheen sattuessa lähetetään ilmoitus Slack -kanavalle.

Kun kahvinkeitin on käyttämättömänä, järjestelmä lähettää pilvipalvelulle diagnostiikkatietoja kerran minuutissa. Lisäksi se lähettää tilansa pilveen 5 minuutin välein.

Kun pumppu on aktiivinen, järjestelmä lähettää tietoja useammin, mutta enintään puolen sekunnin välein.

def send (pilvi, muuttujat, dist, error_code = 0, force = False): pump_on = is_pump_on () prosenttia = calc_water_level_percent (dist) muuttujat ['Distance'] ['value'] = dist muuttujat ['WaterLevel'] [' arvo '] = muuttujien prosenttiosuus [' PumpRelay '] [' value '] = pump_on -muuttujat [' Status '] [' value '] = calc_status (error_code, percent, pump_on)

nykyinen = aika ()

yleinen viimeinen_lähetysaika, jos voima tai nykyinen - viimeinen_lähetysaika> MIN_SEND_INTERVAL: lukemat = cloud.read_data () cloud.publish_data (lukemat) last_sending_time = current

Työskentely pumpun kanssa

Määritämme seuraavat vakiot pumpun toimintalogiikan perustaksi.

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

# Pumppu

START_PUMP = 1 STOP_PUMP = 0 PUMP_BOUNCE_TIME = 50 # millisekuntia PUMP_STOP_TIMEOUT = 5 # sekuntia

TÄRKEÄÄ: Jos aiot käyttää nastaista 4, älä unohda poistaa 1-johtiminen raspi-config-vaihtoehto ristiriitojen välttämiseksi.

Ohjelman käynnistyksen yhteydessä rekisteröimme takaisinsoiton ja asetamme alkutilaksi POIS.

Tässä on pumppua vaihtavan toiminnon koodi:

def toggle_pump (arvo): if pump_disabled: return if is_pump_on ()! = value: log_debug ("[x] % s" % ('START' jos arvo muu 'STOP')) GPIO.setup (GPIO_PUMP, GPIO. OUT) GPIO. output (GPIO_PUMP, arvo) # Aloita/lopeta kaataminen

Kuten yllä oleva käynnistyskoodi määrittelee, kun rele kytkeytyy päälle, kutsutaan seuraavaa takaisinsoittoa:

pump_on = Väärä def pump_relay_handle (pin): global pump_on pump_on = GPIO.input (GPIO_PUMP) log_debug ("Pumpun rele vaihdettu % d" % pump_on)

Takaisinsoitossa tallennamme pumpun nykyisen tilan muuttujaan. Sovelluksen pääsilmukassa voimme tunnistaa hetken, jolloin pumppu vaihtaa, kuten alla on esitetty:

def is_pump_on (): globaali pump_on return pump_on

jos GPIO.event_detected (GPIO_PUMP):

is_pouring = is_pump_on () #… log_debug ('[!] Pumpun tapahtuma havaittu: % s' % ('On', jos is_pouring else 'Off')) send (pilvi, muuttujat, etäisyys, voima = True)

Etäisyyden mittaaminen

On melko helppoa mitata etäisyys vedenpintaan ultraääni -läheisyysanturin avulla. Varastossamme jaoimme pari python -komentosarjaa, joiden avulla voit testata anturia.

Todellisissa sovelluksissa anturin lukemat voivat vaihdella anturin pomppiva vaikutus ja veden värähtely. Joissakin tapauksissa lukemat voivat puuttua kokonaan. Toteutimme BounceFilter -luokan, joka kerää N viimeaikaista arvoa, hylkää huipput ja laskee jäljellä olevien mittausten keskiarvon. Mittausprosessi toteutetaan seuraavan asynkronisen algoritmin avulla.

# Säilyttää viimeiset anturin mittaukset lukemat = BounceFilter (koko = 6, discard_count = 1)

reading_complete = threading. Event ()

def wait_for_distance ():

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

jos ei lue_täydellinen.oota (MAX_READING_TIMEOUT):

log_info ('Lukutunnistimen aikakatkaisu') return Ei palauta lukemia.avg ()

def read_distance ():

try: value = hcsr04.raw_distance (sample_size = 5) pyöristetty = arvo, jos arvo on Ei mitään muuta pyöreä (arvo, 1) lukemat. lisää (pyöristetty) paitsi poikkeus err: log_error ('Sisäinen virhe: % s' % err) lopulta: reading_complete.set ()

Löydät suodattimen täyden toteutuksen lähteistä.

Vaihe 3: Hätätilanteiden käsittely

Hätätilanteiden käsittely
Hätätilanteiden käsittely
Hätätilanteiden käsittely
Hätätilanteiden käsittely
Hätätilanteiden käsittely
Hätätilanteiden käsittely

Entä jos anturi palaa tai putoaa tai osoittaa väärälle alueelle? Tarvitsimme tapaa ilmoittaa tällaisista tapauksista, jotta voimme ryhtyä manuaalisiin toimiin.

Jos anturi ei pysty antamaan etäisyyslukemia, järjestelmä lähettää muutetun tilan pilveen ja antaa vastaavan ilmoituksen.

Logiikkaa havainnollistaa alla oleva koodi.

distance = wait_for_distance () # Lue nykyinen veden syvyys, jos etäisyys ei ole mitään: log_error ('Distance error!') alert_in_background (calc_alert (SENSOR_ERROR))) send (cloud, muuttujat, distance, error_code = SENSOR_ERROR, force = True)

Meillä on toiminnallinen vedenpinta -alue, joka on säilytettävä, kun anturi on paikallaan. Testaamme, laskeeko nykyinen vedenpinta tällä alueella:

# Etäisyys anturista vedenpintaan # perustuu kahvinkeittimen vesisäiliöön MIN_DISTANCE = 2 # cm MAX_DISTANCE = 8 # cm

# Etäisyys on odotetun alueen ulkopuolella: älä aloita kaatamista

jos etäisyys> MAX_DISTANCE * 2: log_error ('Etäisyys on alueen ulkopuolella: %.2f' % etäisyys) jatka

Sammutamme pumpun, jos se oli aktiivinen virheen ilmetessä.

if is_pump_on () ja prev_distance <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('[!] Pumpun hätäpysäytys. Ei signaalia etäisyysanturilta')

toggle_pump (STOP_PUMP)

Käsittelemme myös tapauksen, kun pullosta loppuu vesi. Tarkistamme, ettei vedenpinta muutu pumpun käydessä. Jos näin on, järjestelmä odottaa 5 sekuntia ja tarkistaa sitten, onko pumppu sammunut. Jos näin ei ole, järjestelmä toteuttaa pumpun hätäpysäytyksen ja lähettää virheilmoituksen.

PUMP_STOP_TIMEOUT = 5 # secsemergency_stop_time = Ei mitään

def set_emergency_stop_time (nyt, is_pouring):

maailmanlaajuinen hätätilanne_pysäytysaika hätätilanne_pysäytysaika = nyt + PUMP_STOP_TIMEOUT, jos / on_kaatava muu Ei mitään

def check_water_source_empty (nyt):

palauta hätäpysäytysaika ja nyt> hätätilanteen_pysäytysaika

# --------- pääsilmukka -----------

jos GPIO.event_detected (GPIO_PUMP): is_pouring = is_pump_on () set_emergency_stop_time (nyt, is_pouring) #…

globaali pumppu_poissa käytöstä

jos check_water_source_empty (nyt): log_error ('[!] Pumpun hätäpysäytys. / Vesilähde on tyhjä') toggle_pump (STOP_PUMP) pump_disabled = True

Yllä on esimerkki hätäpysäytyksen aikana luotusta sanomalokista.

Vaihe 4: Järjestelmän käyttö 24/7

Järjestelmän käyttö 24/7
Järjestelmän käyttö 24/7

Laitteen koodi on virheenkorjattu ja toimii ilman ongelmia. Käynnistimme sen palveluna, joten se käynnistyy uudelleen, jos Raspberry Pi käynnistetään uudelleen. Kätevyyden vuoksi loimme Makefilen, joka auttaa käyttöönotossa, palvelun suorittamisessa ja lokien tarkastelussa.

. PHONY: asenna ajon aloituspysäytystilaloki käyttöönotto MAIN_FILE: = coffee-pump/main.py SERVICE_INSTALL_SCRIPT: = service_install.sh SERVICE_NAME: = coffee-pump.service

Asentaa:

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

juosta:

sudo python3 $ (MAIN_FILE)

alkaa:

sudo systemctl start $ (SERVICE_NAME)

Tila:

sudo systemctl status $ (SERVICE_NAME)

lopettaa:

sudo systemctl stop $ (SERVICE_NAME)

Hirsi:

sudo journalctl -u kahvipumppu -tänään

ottaa käyttöön:

rsync -av kahvipumpun anturin asennus Makefile *.sh pi@XX. XX. XXX. XXX: ~/

Löydät tämän tiedoston ja kaikki tarvittavat komentosarjat arkistostamme.

Vaihe 5: Pilvivalvonta

Pilvivalvonta
Pilvivalvonta
Pilvivalvonta
Pilvivalvonta
Pilvivalvonta
Pilvivalvonta
Pilvivalvonta
Pilvivalvonta

Käytämme Cloud4RPi: tä ohjauspaneelin toteuttamiseen. Lisäsimme ensin widgetit, jotka osoittavat järjestelmän olennaiset parametrit.

Muuten STATUS -muuttujan widget voi käyttää erilaisia värimalleja sen arvon perusteella (katso yllä oleva kuva).

Lisäsimme kaavio -widgetin näyttämään dynaamisia tietoja. Alla olevassa kuvassa näet hetken, jona pumppu käynnistyy ja sammutetaan, sekä vesitasot.

Jos analysoit pidempää aikaväliä, näet huiput - silloin pumppu kävi.

Cloud4RPi mahdollistaa myös eri tasoittamistasojen asettamisen.

Vaihe 6: Se toimii

Image
Image

Se toimii! Ohjauspaneeli näyttää kokonaisuudessaan alla olevan kuvan mukaiselta.

Tällä hetkellä automaattinen pumppu on ollut käynnissä useita viikkoja, ja meidän tarvitsee vain vaihtaa vesipullot. Projektimme koko koodi on saatavana GitHub -arkistostamme.

Suositeltava: