Turinys:
- Prekės
- 1 žingsnis: įrangos pasirinkimas
- 2 žingsnis: Sistemos projektavimas
- 3 žingsnis: Avarinių situacijų sprendimas
- 4 žingsnis: paleiskite sistemą visą parą
- 5 žingsnis: debesies stebėjimas
- 6 žingsnis: tai veikia
Video: „Smart“kavos aparato siurblys, valdomas „Raspberry Pi“ir „HC-SR04“ultragarso jutiklio ir „Cloud4RPi“: 6 žingsniai
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:46
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
- Naudokite elektrinį siurblį, kurį per relę valdo tam tikras valdiklis arba mikrokompiuteris.
- Turėkite būdą išmatuoti vandens lygį kavos aparato bake, kad mūsų sistema žinotų, kada jį papildyti.
- Turėkite priemonių valdyti sistemą, pageidautina realiuoju laiku iš mobiliojo įrenginio.
- Gaukite pranešimus (per „Slack“ar panašią paslaugą), jei sistemoje kažkas negerai.
1 žingsnis: į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 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
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ą
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
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
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:
Kavos aparato sekimo priemonė su „Raspberry Pi“ir „Google“skaičiuoklėmis: 5 žingsniai
Kavos aparato sekimo priemonė su „Raspberry Pi“ir „Google“skaičiuoklėmis: ši instrukcija parodys, kaip sukurti „Raspberry Pi“pagrįstą sekimo priemonę bendram kavos aparatui jūsų biure. Naudodami sekimo įrenginio OLED ekraną ir mechaninius jungiklius, vartotojai gali registruoti kavos suvartojimą, matyti jų balansą ir
„Arduino“valdomas „pasidaryk pats“kavos skrudintuvas: 13 žingsnių (su nuotraukomis)
„Arduino“valdomas „pasidaryk pats“kavos skrudintuvas: šioje instrukcijoje apžvelgsime, kaip modifikuoti karšto oro spragėsių aparatą, kad jis taptų visiškai automatiniu namų temperatūros kavos skrudintuvu. Kavos skrudinimas namuose yra stebėtinai paprastas ir netgi toks paprastas dalykas kaip kepimas
„Arduino“valdomas vandens siurblys: 4 žingsniai (su nuotraukomis)
„Arduino“valdomas vandens siurblys: šio projekto idėja kilo, kai nusipirkau kondensacinį dujų katilą savo butui. Neturiu jokio nutekėjimo kondensuotam vandeniui, kurį gamina katilas. Taigi vanduo kelias dienas surenkamas į 20 litrų talpos baką (būgną), o kai jis
„Bluetooth“valdomas „Arduino“LED kavos staliukas: 10 žingsnių (su paveikslėliais)
„Bluetooth“valdomas „Arduino LED“kavos staliukas: tai buvo mano pirmasis tikras „Arduino“projektas, taip pat pirmasis mano pamokomas dalykas, todėl būkite malonūs komentaruose :) Norėjau pabandyti atsakyti į klausimus, dėl kurių man prireikė šiek tiek laiko išsiaiškinti ir pateikti išsamias instrukcijas, kad jei tu labai gerai susipažinai su
Kas yra prie mano durų? PIR judesio jutiklio/diapazono jutiklio projektas: 5 žingsniai
Kas yra prie mano durų? PIR judesio jutiklio/diapazono jutiklio projektas: Mūsų projekto tikslas yra pajusti judesį per PIR ir atstumo jutiklius. „Arduino“kodas skleis vaizdo ir garso signalą, kad vartotojui būtų pranešta, kad kažkas yra šalia. MATLAB kodas atsiųs el. Pašto signalą, kad įspėtų vartotoją, kad kažkas yra šalia. Šis įrenginys