Satura rādītājs:

Viedā kafijas automāta sūknis, ko kontrolē Raspberry Pi un HC-SR04 ultraskaņas sensors un Cloud4RPi: 6 soļi
Viedā kafijas automāta sūknis, ko kontrolē Raspberry Pi un HC-SR04 ultraskaņas sensors un Cloud4RPi: 6 soļi

Video: Viedā kafijas automāta sūknis, ko kontrolē Raspberry Pi un HC-SR04 ultraskaņas sensors un Cloud4RPi: 6 soļi

Video: Viedā kafijas automāta sūknis, ko kontrolē Raspberry Pi un HC-SR04 ultraskaņas sensors un Cloud4RPi: 6 soļi
Video: ПОЧЕМУ Я ЖДУ L4D3 2024, Jūlijs
Anonim
Viedā kafijas automāta sūknis, ko kontrolē Raspberry Pi un HC-SR04 ultraskaņas sensors un Cloud4RPi
Viedā kafijas automāta sūknis, ko kontrolē Raspberry Pi un HC-SR04 ultraskaņas sensors un Cloud4RPi

Teorētiski katru reizi, kad dodaties pie kafijas automāta pēc rīta krūzes, ir tikai viena iespēja divdesmit, lai piepildītu ūdens tvertni. Tomēr praksē šķiet, ka mašīna kaut kādā veidā atrod veidu, kā šo uzdevumu vienmēr uzlikt jums. Jo vairāk vēlaties kafiju, jo lielāka iespēja, ka saņemsiet drausmīgo ziņojumu “piepildiet ūdens tvertni”. Mani kolēģi par to domā tāpat. Būdami nūģi, kādi mēs esam, mēs nolēmām ieviest tehnoloģiju, kas tam pieliktu punktu.

Piegādes

Mūsu aprīkojums

Mums ir SAECO Aulika Focus kafijas automāts. Līdz šai dienai mēs izmantojām rokas sūkni, lai piepildītu iekārtas ūdens tvertni no standarta 5 litru (19 litru) ūdens pudeles.

Mūsu mērķi

  1. Izmantojiet elektrisko sūkni, ko caur releju darbina kāda veida kontrolieris vai mikrodators.
  2. Ir veids, kā izmērīt ūdens līmeni kafijas automāta tvertnē, lai mūsu sistēma zinātu, kad to uzpildīt.
  3. Ir līdzekļi sistēmas vadīšanai, vēlams reāllaikā no mobilās ierīces.
  4. Saņemiet paziņojumus (izmantojot Slack vai līdzīgu pakalpojumu), ja kaut kas notiek sistēmā.

Solis: aprīkojuma izvēle

Aprīkojuma izvēle
Aprīkojuma izvēle
Aprīkojuma izvēle
Aprīkojuma izvēle
Aprīkojuma izvēle
Aprīkojuma izvēle
Aprīkojuma izvēle
Aprīkojuma izvēle

Sūknis

Ātrā meklēšana tīmeklī parādīs vairākus elektriskā sūkņa modeļus, kas paredzēti jūsu izvēlētajai ūdens pudelei. Šādus sūkņus parasti kontrolē ar ON/OFF slēdzi (piemēram, Hot Frost A12 vai SMixx ХL-D2). Šeit ir sūknis, kuru mēs izvēlējāmies savam projektam.

Kontroliera ierīce

Mēs izmēģinājām vairākas ierīces, bet apmetāmies uz Raspberry Pi šādu priekšrocību dēļ:

  • Tam ir GPIO, kas ļauj mums savienot tuvuma sensoru
  • Tas atbalsta Python

Mēs instalējām jaunu Raspbian Buster Lite versiju un visu nepieciešamo, lai palaistu Python 3.

Kā pārslēgt sūkni

Lai kontrolētu jaudu, mēs izvēlējāmies vidējas jaudas (12V/2A) cietvielu releju, kas piemērots maiņstrāvai. Relejs savieno sūkni ar kontaktligzdu, un to kontrolē Raspberry Pi digitālā tapa.

Kā mēs pārbaudām ūdens līmeni

Mums bija svarīgi nemainīt kafijas automāta konstrukciju, tāpēc ūdens līmeņa mērīšanai nolēmām izmantot ultraskaņas tuvuma sensoru HC-SR04.

Mēs 3D drukājām pielāgotu ūdens tvertnes vāku ar diviem caurumiem sensora izstarotājiem. Mēs viegli atradām sensora GitHub bibliotēku. Šajā brīdī visi sagatavošanās darbi tika pabeigti.

2. darbība: sistēmas projektēšana

Sistēmas projektēšana
Sistēmas projektēšana
Sistēmas projektēšana
Sistēmas projektēšana

Sistēmas loģika

Sistēma ir izstrādāta, ņemot vērā šādu vienkāršu loģiku:

  • Sistēma pastāvīgi uzrauga attālumu starp sensoru un ūdens virsmu.
  • Ikreiz, kad attāluma izmaiņas pārsniedz sliekšņa vērtību, sistēma nosūta mākonim informāciju par tā stāvokli.
  • Ja attālums pārsniedz maksimāli pieļaujamo vērtību (tvertne ir tukša), sistēma aktivizē sūkni un izslēdz to, tiklīdz attālums ir mazāks par minimālo atļauto vērtību.
  • Ikreiz, kad mainās sistēmas stāvoklis (piemēram, sūknis aktivizējas), tas informē mākoni.

Kļūdas gadījumā paziņojums tiek nosūtīts uz Slack kanālu.

Kad kafijas automāts ir dīkstāvē, sistēma reizi minūtē pinga mākoņa pakalpojumu ar diagnostikas datiem. Turklāt tas ik pēc 5 minūtēm nosūta savu stāvokli mākonim.

Kad sūknis ir aktīvs, sistēma datus sūta biežāk, bet ne biežāk kā reizi pus sekundē.

def send (mākonis, mainīgie, dist, error_code = 0, force = False): pump_on = is_pump_on () procenti = calc_water_level_percent (dist) mainīgie ['Distance'] ['value'] = dist mainīgie ['WaterLevel'] [' value '] = procentuāli mainīgie [' PumpRelay '] [' value '] = pump_on mainīgie [' Status '] [' value '] = calc_status (error_code, procenti, pump_on)

pašreizējais = laiks ()

globālais pēdējā_sūtīšanas_laiks, ja spēks vai pašreizējais - pēdējais_sūtīšanas_laiks> MIN_SEND_INTERVAL: rādījumi = mākonis.lasīšanas_dati () mākonis.publiskie dati (rādījumi) pēdējā_sūtīšanas_laiks = pašreizējais

Darbs ar sūkni

Mēs definējam šādas konstantes kā pamatu sūkņa darbības loģikai.

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

# Sūknis

START_PUMP = 1 STOP_PUMP = 0 PUMP_BOUNCE_TIME = 50 # milisekundes PUMP_STOP_TIMEOUT = 5 # sekundes

SVARĪGI! Ja izmantosiet 4. tapu, neaizmirstiet atspējot opciju 1-Wire raspi-config, lai izvairītos no konfliktiem.

Programmas palaišanas brīdī mēs reģistrējam atzvanīšanu un sākotnējo stāvokli iestatām uz IZSLĒGTS.

Šeit ir sūkņa pārslēgšanas funkcijas kods:

def toggle_pump (vērtība): ja pump_disabled: atgriezties, ja is_pump_on ()! = vērtība: log_debug ("[x] % s" % ('START', ja vērtība cita 'STOP')) GPIO.setup (GPIO_PUMP, GPIO. OUT) GPIO.output (GPIO_PUMP, vērtība) # Sākt/pārtraukt ielešanu

Kā definēts iepriekšējā starta kodā, kad relejs ieslēdzas, tiek izsaukts šāds atzvanīšana:

pump_on = False def pump_relay_handle (pin): global pump_on pump_on = GPIO.input (GPIO_PUMP) log_debug ("Sūkņa relejs nomainīts uz % d" % pump_on)

Atzvanīšanas laikā mēs saglabājam sūkņa pašreizējo stāvokli uz mainīgo. Lietojumprogrammas galvenajā cilpā mēs varam noteikt brīdi, kad sūknis pārslēdzas, kā parādīts zemāk:

def is_pump_on (): globālais pump_on atgriežas pump_on

ja GPIO.event_detected (GPIO_PUMP):

is_pouring = is_pump_on () #… log_debug ('[!] Sūkņa notikums konstatēts: % s' % ('On', ja is_pouring else 'Off')) send (mākonis, mainīgie, attālums, spēks = True)

Attāluma mērīšana

Ir diezgan viegli izmērīt attālumu līdz ūdens virsmai, izmantojot ultraskaņas tuvuma sensoru. Mūsu krātuvē mēs kopīgojām pāris python skriptus, kas ļauj pārbaudīt sensoru.

Reālos lietojumos sensora rādījumi var svārstīties sensora atsitiena efekta un ūdens svārstību dēļ. Dažos gadījumos rādījumi var pilnībā trūkt. Mēs ieviesām BounceFilter klasi, kas uzkrāj N pēdējās vērtības, atmet maksimumus un aprēķina atlikušo mērījumu vidējo lielumu. Mērīšanas process tiek īstenots ar šādu asinhronu algoritmu.

# Saglabā pēdējos sensora mērījumus

reading_complete = threading. Event ()

def wait_for_distance ():

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

ja nelasa_pabeigts.gaidīt (MAX_READING_TIMEOUT):

log_info ('Nolasīšanas sensora noildze') atgriezties Nav atgrieztu lasījumus.avg ()

def read_distance ():

izmēģināt: vērtība = hcsr04.raw_distance (parauga_izmērs = 5) noapaļots = vērtība, ja vērtība ir Neviens cits apaļš (vērtība, 1) nolasījumi.add (noapaļots), izņemot Izņēmums kā kļūda: log_error ('Iekšējā kļūda: % s' % kļūda) beidzot: reading_complete.set ()

Pilnu filtra ieviešanu varat atrast avotos.

3. darbība. Ārkārtas situāciju risināšana

Ārkārtas situāciju risināšana
Ārkārtas situāciju risināšana
Ārkārtas situāciju risināšana
Ārkārtas situāciju risināšana
Ārkārtas situāciju risināšana
Ārkārtas situāciju risināšana

Ko darīt, ja sensors izdeg, nokrīt vai norāda uz nepareizu zonu? Mums bija nepieciešams veids, kā ziņot par šādiem gadījumiem, lai mēs varētu veikt manuālas darbības.

Ja sensors nespēj nolasīt attālumu, sistēma nosūta mainīto statusu mākonim un ģenerē atbilstošu paziņojumu.

Loģiku ilustrē zemāk esošais kods.

distance = wait_for_distance () # Lasīt pašreizējo ūdens dziļumu, ja attālums nav Nav: log_error ('Distance error!') paziņot_in_background (calc_alert (SENSOR_ERROR)) send (mākonis, mainīgie, distance, error_code = SENSOR_ERROR, force = True)

Mums ir darbības ūdens līmeņa diapazons, kas jāsaglabā, kad sensors atrodas savā vietā. Mēs pārbaudām, vai pašreizējais ūdens līmenis nokrīt šajā diapazonā:

# Attālums no sensora līdz ūdens līmenim #, pamatojoties uz kafijas automāta ūdens tvertni MIN_DISTANCE = 2 # cm MAX_DISTANCE = 8 # cm

# Attālums ir ārpus paredzamā diapazona: nesāciet liet

ja attālums> MAX_DISTANCE * 2: log_error ('Attālums ir ārpus diapazona: %.2f' % attālums) turpiniet

Mēs izslēdzam sūkni, ja tas bija aktīvs, kad radās kļūda.

ja is_pump_on () un iepriekšējais attālums <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('[!] Sūkņa avārijas apturēšana. Nav signāla no attāluma sensora')

pārslēgšanas sūknis (STOP_PUMP)

Mēs arī apstrādājam gadījumu, kad pudelē beidzas ūdens. Mēs pārbaudām, vai ūdens līmenis nemainās, kad sūknis darbojas. Ja tā, sistēma gaida 5 sekundes un pēc tam pārbauda, vai sūknis ir izslēgts. Ja tā nav, sistēma īsteno avārijas sūkņa izslēgšanu un nosūta paziņojumu par kļūdu.

PUMP_STOP_TIMEOUT = 5 # secsemergency_stop_time = Nav

def set_emergency_stop_time (tagad, is_pouring):

globālās ārkārtas situācijas_apstāšanās_avārijas_apstāšanās_laiks = tagad + PUMP_STOP_TIMEOUT, ja / is_pouring else Nav

def check_water_source_empty (tagad):

atgriezt avārijas apstāšanās laiku un tagad> avārijas apstāšanās laiks

# --------- galvenā cilpa -----------

ja GPIO.event_detected (GPIO_PUMP): is_pouring = is_pump_on () set_emergency_stop_time (tagad, is_pouring) #…

globālais sūknis_disabled

ja check_water_source_empty (tagad): log_error ('[!] Sūkņa avārijas apturēšana. / Ūdens avots ir tukšs') toggle_pump (STOP_PUMP) pump_disabled = True

Iepriekš ir ziņu žurnāla piemērs, kas ģenerēts ārkārtas apstāšanās laikā.

4. darbība. Sistēmas palaišana visu diennakti

Sistēmas palaišana visu diennakti
Sistēmas palaišana visu diennakti

Ierīces kods ir atkļūdots un darbojas bez problēmām. Mēs to palaidām kā pakalpojumu, tāpēc tas tiek restartēts, ja Raspberry Pi tiek restartēts. Ērtības labad mēs izveidojām Makefile, kas palīdz izvietošanā, pakalpojuma palaišanā un žurnālu skatīšanā.

. PHONY: instalēt palaist start stop status žurnālu izvietot MAIN_FILE: = coffee-pump/main.py SERVICE_INSTALL_SCRIPT: = service_install.sh SERVICE_NAME: = coffee-pump.service

uzstādīt:

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

palaist:

sudo python3 $ (MAIN_FILE)

sākt:

sudo systemctl start $ (SERVICE_NAME)

statuss:

sudo systemctl statuss $ (SERVICE_NAME)

apstāties:

sudo systemctl stop $ (SERVICE_NAME)

žurnāls:

sudo journalctl -u kafijas sūknis -kopš šodienas

izvietot:

rsync -av kafijas sūkņa sensora iestatīšana Makefile *.sh pi@XX. XX. XXX. XXX: ~/

Šo failu un visus nepieciešamos skriptus varat atrast mūsu krātuvē.

5. darbība. Mākoņu uzraudzība

Mākoņu uzraudzība
Mākoņu uzraudzība
Mākoņu uzraudzība
Mākoņu uzraudzība
Mākoņu uzraudzība
Mākoņu uzraudzība
Mākoņu uzraudzība
Mākoņu uzraudzība

Mēs izmantojām Cloud4RPi, lai ieviestu vadības paneli. Mēs vispirms pievienojām logrīkus, lai norādītu sistēmas būtiskos parametrus.

Starp citu, mainīgā STATUS logrīks var izmantot dažādas krāsu shēmas, pamatojoties uz tā vērtību (skatiet attēlu iepriekš).

Mēs pievienojām diagrammas logrīku, lai parādītu dinamiskos datus. Zemāk redzamajā attēlā var redzēt sūkņa ieslēgšanas un izslēgšanas brīdi un attiecīgos ūdens līmeņus.

Ja analizējat ilgāku laika periodu, jūs varat redzēt maksimumus - tas bija tad, kad sūknis darbojās.

Cloud4RPi arī ļauj iestatīt dažādus izlīdzināšanas līmeņus.

6. solis: tas darbojas

Image
Image

Tas strādā! Vadības panelis kopumā izskatās kā parādīts zemāk.

Pašlaik mūsu automātiskais sūknis darbojas vairākas nedēļas, un viss, kas mums jādara, ir nomainīt ūdens pudeles. Pilns mūsu projekta kods ir pieejams mūsu GitHub krātuvē.

Ieteicams: