Sisällysluettelo:
- Tarvikkeet
- Vaihe 1: Laitteiden valinta
- Vaihe 2: Järjestelmän suunnittelu
- Vaihe 3: Hätätilanteiden käsittely
- Vaihe 4: Järjestelmän käyttö 24/7
- Vaihe 5: Pilvivalvonta
- Vaihe 6: Se toimii
Video: Älykäs kahvinkeitinpumppu, jota ohjaavat Raspberry Pi & HC-SR04-ultraäänianturi ja Cloud4RPi: 6 vaihetta
2024 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2024-01-30 09:01
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
- Käytä sähköpumppua, jota ohjaa jonkinlainen ohjain tai mikrotietokone releen kautta.
- Voit mitata kahvinkeittimen säiliön vedenpinnan, jotta järjestelmämme tietää milloin se on täytettävä.
- Sinulla on keinot hallita järjestelmää mieluiten reaaliajassa mobiililaitteesta.
- Vastaanota ilmoituksia (Slackin tai vastaavan palvelun kautta), jos järjestelmässä on jotain vikaa.
Vaihe 1: 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 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
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
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
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
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:
556 Aika antaa kellotulon 2 vuosikymmenen laskurille, jotka ohjaavat 20 LEDiä: 6 vaihetta
556 Aika antaa kellotulon kahdelle vuosikymmenen laskurille, jotka käyttävät 20 LEDiä: Tämä opas näyttää kuinka 556 -ajastin antaa kellotulot 2 vuosikymmenen laskuriin. Vuosikymmenen laskurit käyttävät 20 LED -valoa. LEDit vilkkuvat 10 sekunnissa
Älykäs herätyskello: Älykäs herätyskello, joka on valmistettu Raspberry Pi: llä: 10 vaihetta (kuvilla)
Älykäs herätyskello: älykäs herätyskello, joka on valmistettu Raspberry Pi: llä: Oletko koskaan halunnut älykkään kellon? Jos näin on, tämä on ratkaisu sinulle! Tein Smart Alarm Clockin, tämä on kello, jolla voit muuttaa herätysaikaa verkkosivuston mukaan. Kun hälytys soi, kuuluu ääni (summeri) ja 2 valoa
IoT -pohjainen älykäs puutarhanhoito ja älykäs maatalous ESP32: 7 askeleen avulla
IoT -pohjainen älykäs puutarhanhoito ja älykäs maatalous ESP32: n avulla: Maailma muuttuu ajan ja maatalouden tavoin. Nykyään ihmiset integroivat elektroniikkaa kaikilla aloilla, eikä maatalous ole poikkeus tähän. Tämä elektroniikan yhdistäminen maataloudessa auttaa viljelijöitä ja puutarhoja hoitavia ihmisiä
ESP8266 -NODEMCU $ 3 WiFi -moduuli #2 - langattomat nastat, jotka ohjaavat verkkosivun kautta: 9 vaihetta (kuvilla)
ESP8266 -NODEMCU $ 3 WiFi -moduuli #2 - Langattomat nastat, jotka ohjaavat verkkosivun kautta: Näiden mikrotietokoneiden uusi maailma on saapunut ja tämä asia on ESP8266 NODEMCU. Tämä on ensimmäinen osa, joka näyttää kuinka voit asentaa esp8266 -ympäristön arduino IDE -laitteeseesi aloitusvideon kautta ja osina
Mahtavat liikkuvat vaihteet, joita ohjaavat mahtavat painikkeet (jatkoa): 9 vaihetta
Mahtavat liikkuvat vaihteet, joita ohjaavat mahtavat painikkeet (jatkoa): Fyysinen / elektroninen pelisuunnittelu UCLA Design Media Artsille Eddo Sternin kanssa. Tämä ohje on epätäydellinen. Hanke on edelleen kesken