Turinys:

„Smart“kavos aparato siurblys, valdomas „Raspberry Pi“ir „HC-SR04“ultragarso jutiklio ir „Cloud4RPi“: 6 žingsniai
„Smart“kavos aparato siurblys, valdomas „Raspberry Pi“ir „HC-SR04“ultragarso jutiklio ir „Cloud4RPi“: 6 žingsniai

Video: „Smart“kavos aparato siurblys, valdomas „Raspberry Pi“ir „HC-SR04“ultragarso jutiklio ir „Cloud4RPi“: 6 žingsniai

Video: „Smart“kavos aparato siurblys, valdomas „Raspberry Pi“ir „HC-SR04“ultragarso jutiklio ir „Cloud4RPi“: 6 žingsniai
Video: Testing the new @keurig K Cafe Smart🔥🔥 2024, Lapkritis
Anonim
Išmanusis kavos aparato siurblys, valdomas „Raspberry Pi“ir „HC-SR04“ultragarso jutiklio bei „Cloud4RPi“
Išmanusis kavos aparato siurblys, valdomas „Raspberry Pi“ir „HC-SR04“ultragarso jutiklio bei „Cloud4RPi“

Teoriškai kiekvieną kartą, kai einate prie kavos aparato išgerti ryto puodelio, yra tik viena iš dvidešimties tikimybė, kad turėsite užpildyti vandens baką. Tačiau praktiškai atrodo, kad mašina kažkaip randa būdą, kaip visada uždėti šį darbą. Kuo daugiau norite kavos, tuo didesnė tikimybė, kad gausite baisų pranešimą „užpildykite vandens baką“. Mano kolegos tą patį jaučia. Būdami šaunuoliai, tokie, kokie esame, nusprendėme įdiegti technologiją, kuri tai užbaigtų.

Prekės

Mūsų įranga

Turime kavos aparatą „SAECO Aulika Focus“. Iki šiol rankiniu siurbliu užpildėme mašinos vandens baką iš standartinio 5 litrų (19 litrų) vandens butelio.

Mūsų tikslai

  1. Naudokite elektrinį siurblį, kurį per relę valdo tam tikras valdiklis arba mikrokompiuteris.
  2. Turėkite būdą išmatuoti vandens lygį kavos aparato bake, kad mūsų sistema žinotų, kada jį papildyti.
  3. Turėkite priemonių valdyti sistemą, pageidautina realiuoju laiku iš mobiliojo įrenginio.
  4. Gaukite pranešimus (per „Slack“ar panašią paslaugą), jei sistemoje kažkas negerai.

1 žingsnis: įrangos pasirinkimas

Įrangos pasirinkimas
Įrangos pasirinkimas
Įrangos pasirinkimas
Įrangos pasirinkimas
Įrangos pasirinkimas
Įrangos pasirinkimas
Įrangos pasirinkimas
Įrangos pasirinkimas

Siurblys

Greita paieška internete parodys kelis elektrinių siurblių modelius, skirtus jūsų pasirinktam vandens buteliui. Tokie siurbliai paprastai valdomi įjungimo/išjungimo jungikliu (pavyzdžiui, „Hot Frost A12“arba „SMixx ХL-D2“). Štai siurblys, kurį pasirinkome savo projektui.

Valdiklio įrenginys

Mes išbandėme kelis įrenginius, bet apsipirkome „Raspberry Pi“dėl šių privalumų:

  • Jis turi GPIO, kuris leidžia mums prijungti artumo jutiklį
  • Jis palaiko „Python“

Įdiegėme naują „Raspbian Buster Lite“versiją ir viską, ko reikia norint paleisti „Python 3“.

Kaip perjungti siurblį

Norėdami valdyti galią, pasirinkome vidutinės galios (12V/2A) kietojo kūno relę, tinkamą kintamajai srovei. Relė jungia siurblį prie išleidimo angos ir yra valdoma „Raspberry Pi“skaitmeniniu kaiščiu.

Kaip mes patikriname vandens lygį

Mums buvo svarbu nekeisti kavos aparato konstrukcijos, todėl nusprendėme vandens lygiui matuoti naudoti ultragarsinį artumo jutiklį HC-SR04.

Mes 3D atspausdinome pasirinktinį vandens rezervuaro dangtį su dviem skylėmis jutiklio skleidėjams. Mes lengvai radome jutiklio „GitHub“biblioteką. Šiuo metu visi pasiruošimai buvo baigti.

2 žingsnis: Sistemos projektavimas

Sistemos projektavimas
Sistemos projektavimas
Sistemos projektavimas
Sistemos projektavimas

Sistemos logika

Sistema sukurta atsižvelgiant į šią paprastą logiką:

  • Sistema nuolat stebi atstumą tarp jutiklio ir vandens paviršiaus.
  • Kai atstumo pokytis viršija slenkstinę vertę, sistema siunčia informaciją apie savo būseną į debesį.
  • Jei atstumas viršija didžiausią leistiną vertę (bakas tuščias), sistema įjungia siurblį ir jį išjungia, kai atstumas yra mažesnis už mažiausią leistiną vertę.
  • Kai pasikeičia sistemos būsena (pvz., Siurblys įsijungia), ji informuoja debesį.

Klaidos atveju pranešimas siunčiamas į „Slack“kanalą.

Kai kavos aparatas neveikia, sistema kartą per minutę siunčia debesies tarnybai diagnostikos duomenis. Be to, ji kas 5 minutes siunčia savo būseną į debesį.

Kai siurblys yra aktyvus, sistema siunčia duomenis dažniau, bet ne dažniau kaip kartą per pusę sekundės.

def send (debesis, kintamieji, dist, klaidos kodas = 0, jėga = klaidinga): pump_on = is_pump_on () procentai = apskaičiuotas_vandens_pakopas (dist) kintamieji ['Distance'] ['value'] = dist kintamieji ['WaterLevel'] [' value '] = procentiniai kintamieji [' PumpRelay '] [' value '] = pump_on kintamieji [' Status '] [' value '] = calc_status (error_code, procentai, pump_on)

dabartinis = laikas ()

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

Darbas su siurbliu

Mes apibrėžiame šias konstantas kaip siurblio veikimo logikos pagrindą.

# GPIO kaiščiai (BCM) GPIO_PUMP = 4 GPIO_TRIGGER = 17 GPIO_ECHO = 27

# Siurblys

START_PUMP = 1 STOP_PUMP = 0 PUMP_BOUNCE_TIME = 50 # milisekundžių PUMP_STOP_TIMEOUT = 5 # sek.

SVARBU: Jei ketinate naudoti 4 kaištį, nepamirškite išjungti 1 laido raspi-config parinkties, kad išvengtumėte konfliktų.

Kai programa paleidžiama, mes užregistruojame atgalinį skambutį ir nustatome pradinę būseną į OFF.

Čia yra siurblį perjungiančios funkcijos kodas:

def toggle_pump (vertė): jei siurblys yra išjungtas: grąžinkite, jei is_pump_on ()! = vertė: log_debug ("[x] % s" % ('START', jei kita vertė 'STOP')) GPIO.setup (GPIO_PUMP, GPIO. OUT) GPIO. output (GPIO_PUMP, vertė) # Pradėti/sustabdyti liejimą

Kaip apibrėžta aukščiau esančiame paleidimo kode, kai relė įjungiama, vadinamas šis atgalinis skambutis:

pump_on = False def pump_relay_handle (pin): global pump_on pump_on = GPIO.input (GPIO_PUMP) log_debug ("Siurblio relė pakeista į % d" % pump_on)

Atgalinio skambučio metu siurblio dabartinė būsena išsaugoma kintamajame. Programos pagrindinėje kilpoje galime aptikti momentą, kai siurblys persijungia, kaip parodyta žemiau:

def is_pump_on (): global pump_on return pump_on

jei GPIO.event_detected (GPIO_PUMP):

is_pouring = is_pump_on () #… log_debug ('[!] Aptiktas siurblio įvykis: % s' % ('On', jei is_pouring else 'Off')) send (debesis, kintamieji, atstumas, jėga = tiesa)

Atstumo matavimas

Naudojant ultragarsinį artumo jutiklį, gana lengva išmatuoti atstumą iki vandens paviršiaus. Mūsų saugykloje mes bendrinome keletą „python“scenarijų, kurie leidžia išbandyti jutiklį.

Tikrose programose jutiklio rodmenys gali svyruoti dėl jutiklio atšokimo efekto ir vandens svyravimų. Kai kuriais atvejais rodmenų gali visiškai nebūti. Įdiegėme „BounceFilter“klasę, kuri kaupia N naujausias vertes, atmeta pikas ir apskaičiuoja likusių matavimų vidurkį. Matavimo procesas vykdomas pagal šį asinchroninį algoritmą.

# Išlaiko paskutinius jutiklio matavimus

reading_complete = threading. Event ()

def wait_for_distance ():

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

jei neskaito_baigtas.laukti (MAX_READING_TIMEOUT):

log_info („Skaitymo jutiklio skirtasis laikas“) return Nieko negrąžina readings.avg ()

def read_distance ():

try: value = hcsr04.raw_distance (sample_size = 5) suapvalinta = vertė, jei reikšmė None else round (vertė, 1) readings.add (suapvalinta), išskyrus išimtį kaip klaida: log_error ('Vidinė klaida: % s' % err) galiausiai: reading_complete.set ()

Visą filtro įgyvendinimą galite rasti šaltiniuose.

3 žingsnis: Avarinių situacijų sprendimas

Avarinių situacijų sprendimas
Avarinių situacijų sprendimas
Avarinių situacijų sprendimas
Avarinių situacijų sprendimas
Avarinių situacijų sprendimas
Avarinių situacijų sprendimas

Ką daryti, jei jutiklis sudegė, nukrito arba nurodo į netinkamą vietą? Mums reikėjo pranešti apie tokius atvejus, kad galėtume imtis rankinių veiksmų.

Jei jutiklis nepateikia atstumo rodmenų, sistema siunčia pasikeitusią būseną debesiui ir sugeneruoja atitinkamą pranešimą.

Logiką iliustruoja žemiau pateiktas kodas.

distance = wait_for_distance () # Skaitykite dabartinį vandens gylį, jei atstumas nėra: log_error ('Atstumo klaida!') praneškite_in_background (calc_alert (SENSOR_ERROR))) send (debesis, kintamieji, atstumas, error_code = SENSOR_ERROR, force = True)

Mes turime darbinį vandens lygio diapazoną, kuris turėtų būti išlaikytas, kai jutiklis yra savo vietoje. Mes tikriname, ar dabartinis vandens lygis patenka į šį diapazoną:

# Atstumas nuo jutiklio iki vandens lygio # pagal kavos aparato vandens baką MIN_DISTANCE = 2 # cm MAX_DISTANCE = 8 # cm

# Atstumas viršija numatytą diapazoną: nepradėkite pilti

jei atstumas> MAX_DISTANCE * 2: log_error ('Atstumas nepatenka į diapazoną: %.2f' % atstumas) tęskite

Mes išjungiame siurblį, jei jis buvo aktyvus, kai įvyko klaida.

if is_pump_on () ir prev_distance <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('[!] Avarinis siurblio sustabdymas. Nėra signalo iš atstumo jutiklio')

perjungti siurblį (STOP_PUMP)

Mes taip pat apdorojame atvejį, kai butelyje baigiasi vanduo. Tikriname, ar veikiant siurbliui vandens lygis nesikeičia. Jei taip, sistema laukia 5 sekundes ir patikrina, ar siurblys išjungtas. Jei taip nėra, sistema įgyvendina avarinį siurblio išjungimą ir siunčia pranešimą apie klaidą.

PUMP_STOP_TIMEOUT = 5 # secsemergency_stop_time = Nėra

def set_emergency_stop_time (dabar, is_pouring):

visuotinis avarinis_stotelės laikas

def check_water_source_empty (dabar):

grįžti avarinio sustabdymo laikas ir dabar> avarinis sustojimo laikas

# --------- pagrindinė kilpa -----------

jei GPIO.event_detected (GPIO_PUMP): is_pouring = is_pump_on () set_emergency_stop_time (dabar, is_pouring) #…

global pump_disabled

jei check_water_source_empty (dabar): log_error ('[!] Avarinis siurblio sustabdymas. / Vandens šaltinis tuščias') toggle_pump (STOP_PUMP) pump_disabled = Tiesa

Aukščiau yra pranešimų žurnalo, sugeneruoto avarinio sustojimo metu, pavyzdys.

4 žingsnis: paleiskite sistemą visą parą

Sistemos paleidimas 24/7
Sistemos paleidimas 24/7

Prietaiso kodas yra derinamas ir veikia be problemų. Paleidome ją kaip paslaugą, todėl ji bus paleista iš naujo, jei „Raspberry Pi“bus paleistas iš naujo. Patogumui sukūrėme „Makefile“, kuris padeda diegti, paleisti paslaugą ir peržiūrėti žurnalus.

. PHONY: įdiegti paleidimo pradžios sustabdymo būsenos žurnalą diegti MAIN_FILE: = coffee-pump/main.py SERVICE_INSTALL_SCRIPT: = service_install.sh SERVICE_NAME: = coffee-pump.service

diegti:

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

paleisti:

sudo python3 $ (MAIN_FILE)

pradžia:

sudo systemctl start $ (SERVICE_NAME)

būsena:

„sudo systemctl“būsena $ (SERVICE_NAME)

sustabdyti:

sudo systemctl stop $ (SERVICE_NAME)

žurnalas:

sudo journalctl -u kavos siurblys -nuo šiandien

dislokuoti:

rsync -av kavos siurblio jutiklio nustatymas „Makefile“*.sh pi@XX. XX. XXX. XXX: ~/

Šį failą ir visus reikalingus scenarijus galite rasti mūsų saugykloje.

5 žingsnis: debesies stebėjimas

Debesų stebėjimas
Debesų stebėjimas
Debesų stebėjimas
Debesų stebėjimas
Debesų stebėjimas
Debesų stebėjimas
Debesų stebėjimas
Debesų stebėjimas

Valdymo pultui įdiegti naudojome „Cloud4RPi“. Pirmiausia pridėjome valdiklius, nurodančius esminius sistemos parametrus.

Beje, kintamojo STATUS valdikliui, atsižvelgiant į jo vertę, gali būti naudojamos skirtingos spalvų schemos (žr. Paveikslėlį aukščiau).

Pridėjome diagramos valdiklį, kad būtų rodomi dinaminiai duomenys. Žemiau esančiame paveikslėlyje galite pamatyti siurblio įjungimo ir išjungimo momentą ir atitinkamą vandens lygį.

Jei analizuojate ilgesnį laikotarpį, galite pamatyti smailių - tada siurblys veikė.

„Cloud4RPi“taip pat leidžia nustatyti skirtingus išlyginimo lygius.

6 žingsnis: tai veikia

Image
Image

Tai veikia! Visas valdymo pultas atrodo taip, kaip parodyta žemiau.

Šiuo metu mūsų automatinis siurblys veikia keletą savaičių ir mums tereikia pakeisti vandens butelius. Visas mūsų projekto kodas yra mūsų „GitHub“saugykloje.

Rekomenduojamas: