Բովանդակություն:

Smart Coffee Machine Pump Controlled by Raspberry Pi & HC-SR04 Ultrasonic Sensor and Cloud4RPi: 6 Steps
Smart Coffee Machine Pump Controlled by Raspberry Pi & HC-SR04 Ultrasonic Sensor and Cloud4RPi: 6 Steps

Video: Smart Coffee Machine Pump Controlled by Raspberry Pi & HC-SR04 Ultrasonic Sensor and Cloud4RPi: 6 Steps

Video: Smart Coffee Machine Pump Controlled by Raspberry Pi & HC-SR04 Ultrasonic Sensor and Cloud4RPi: 6 Steps
Video: Smart Coffee Machine Pump Controlled by Raspberry Pi & HC-SR04 Ultrasonic Sensor 2024, Նոյեմբեր
Anonim
Խելացի սուրճի մեքենայի պոմպ, որը վերահսկվում է Raspberry Pi & HC-SR04 ուլտրաձայնային տվիչով և Cloud4RPi- ով
Խելացի սուրճի մեքենայի պոմպ, որը վերահսկվում է Raspberry Pi & HC-SR04 ուլտրաձայնային տվիչով և Cloud4RPi- ով

Տեսականորեն, ամեն անգամ, երբ սուրճի մեքենա ես գնում առավոտյան բաժակի համար, քսանից մեկ հավանականություն կա, որ ստիպված կլինես լցնել ջրի բաքը: Գործնականում, սակայն, թվում է, որ մեքենան ինչ -որ կերպ գտնում է մի միջոց, որը միշտ ձեզ վրա է դնում այս աշխատանքը: Որքան շատ սուրճ եք ուզում, այնքան ավելի հավանական է, որ ստանաք «ջրի բաքը լցնելու» սարսափելի հաղորդագրությունը: Իմ գործընկերները նույն կերպ են վերաբերվում դրան: Լինելով այն հիմարները, որոնք մենք ենք, մենք որոշեցինք կիրառել այն տեխնոլոգիան, որը վերջ կդնի դրան:

Պարագաներ

Մեր սարքավորումները

Մենք ունենք SAECO Aulika Focus սուրճի մեքենա: Մինչ օրս մենք ձեռքի պոմպով էինք լցնում մեքենայի ջրի բաքը սովորական 5 գալոն (19 լ) ջրի շշից:

Մեր նպատակները

  1. Օգտագործեք էլեկտրական պոմպ, որը շարժվում է ինչ -որ կարգավարի կամ միկրոհամակարգչի միջոցով `ռելեի միջոցով:
  2. Ունեք սուրճի մեքենայի բաքում ջրի մակարդակը չափելու միջոց, որպեսզի մեր համակարգը իմանա, թե երբ պետք է այն լիցքավորել:
  3. Միջոցներ ունենալ համակարգը վերահսկելու համար, ցանկալի է իրական ժամանակում շարժական սարքից:
  4. Ստացեք ծանուցումներ (Slack- ի կամ նմանատիպ ծառայության միջոցով), եթե ինչ -որ բան սխալ է տեղի ունենում համակարգում:

Քայլ 1: Սարքավորումների ընտրություն

Սարքավորումների ընտրություն
Սարքավորումների ընտրություն
Սարքավորումների ընտրություն
Սարքավորումների ընտրություն
Սարքավորումների ընտրություն
Սարքավորումների ընտրություն
Սարքավորումների ընտրություն
Սարքավորումների ընտրություն

Պոմպը

Արագ որոնումը ցույց կտա էլեկտրական պոմպի մի քանի մոդել, որոնք նախատեսված են ձեր ընտրած ջրի շշի համար: Նման պոմպերը սովորաբար վերահսկվում են ON/OFF անջատիչով (օրինակ ՝ Hot Frost A12 կամ SMixx ХL-D2): Ահա մեր նախագծի համար ընտրված պոմպը:

Վերահսկիչ սարք

Մենք փորձեցինք մի քանի սարքեր, բայց նստեցինք Raspberry Pi- ի վրա ՝ հետևյալ առավելությունների պատճառով.

  • Այն ունի GPIO, որը թույլ է տալիս միացնել հարևանության տվիչ
  • Այն աջակցում է Python- ին

Մենք տեղադրել ենք Raspbian Buster Lite- ի թարմ տարբերակը և այն ամենը, ինչ անհրաժեշտ է Python 3 -ը գործարկելու համար:

Ինչպես ենք մենք փոխում պոմպը

Էլեկտրաէներգիան վերահսկելու համար մենք ընտրեցինք միջին հզորության (12V/2A) պինդ վիճակի ռելե, որը հարմար է փոփոխական հոսանքի համար: Ռելեն միացնում է պոմպը վարդակին և վերահսկվում է Raspberry Pi- ի թվային քորոցով:

Ինչպես ենք մենք ստուգում ջրի մակարդակը

Մեզ համար կարևոր էր չփոխել սուրճի մեքենայի կառուցվածքը, ուստի որոշեցինք օգտագործել HC-SR04 ուլտրաձայնային հարևանության սենսորը `ջրի մակարդակը չափելու համար:

Մենք եռաչափ տպեցինք ջրի բաքի ծածկը ՝ երկու անցքով ՝ սենսորի արտանետիչների համար: Մենք հեշտությամբ գտանք սենսորի GitHub գրադարանը: Այս պահին բոլոր նախապատրաստական աշխատանքներն ավարտվեցին:

Քայլ 2: Համակարգի նախագծում

Համակարգի նախագծում
Համակարգի նախագծում
Համակարգի նախագծում
Համակարգի նախագծում

Համակարգի տրամաբանություն

Համակարգը նախագծված է ՝ հաշվի առնելով հետևյալ պարզ տրամաբանությունը.

  • Համակարգը մշտապես վերահսկում է տվիչի և ջրի մակերևույթի միջև հեռավորությունը:
  • Ամեն անգամ, երբ հեռավորության փոփոխությունը անցնում է շեմի արժեքից, համակարգը իր վիճակի մասին տեղեկատվություն է ուղարկում ամպ:
  • Եթե հեռավորությունը անցնում է թույլատրելի առավելագույն արժեքից (բաքը դատարկ է), համակարգը միացնում է պոմպը և անջատում այն, երբ հեռավորությունը փոքր է թույլատրելի նվազագույն արժեքից:
  • Ամեն անգամ, երբ համակարգի վիճակը փոխվում է (օրինակ ՝ պոմպը ակտիվանում է), այն տեղեկացնում է ամպին:

Սխալի դեպքում ծանուցումն ուղարկվում է Slack ալիքին:

Երբ սուրճի ապարատը անգործության է մատնված, համակարգը րոպեական մեկ անգամ ախտորոշիչ տվյալներով ամպային ծառայություն է մատուցում: Բացի այդ, այն իր վիճակն ամպ է ուղարկում ամեն 5 րոպեն մեկ:

Երբ պոմպն ակտիվ է, համակարգը տվյալներ է ուղարկում ավելի հաճախ, բայց ոչ ավելի, քան կես վայրկյանը մեկ:

def send (ամպ, փոփոխականներ, dist, error_code = 0, force = False): pump_on = is_pump_on () տոկոս = calc_water_level_percent (dist) փոփոխականներ ['Distance'] ['value'] = dist variables ['WaterLevel'] [' արժեք '] = տոկոսային փոփոխականներ [' PumpRelay '] [' value '] = փոփոխականների_պոմպ

ընթացիկ = ժամանակ ()

գլոբալ last_sending_time եթե ուժ կամ ընթացիկ - last_sending_time> MIN_SEND_INTERVAL: ընթերցումներ = cloud.read_data () cloud.publish_data (ընթերցումներ) last_sending_time = ընթացիկ

Պոմպի հետ աշխատելը

Մենք սահմանում ենք հետևյալ հաստատունները ՝ որպես պոմպի շահագործման տրամաբանության հիմք:

# GPIO կապում (BCM) GPIO_PUMP = 4 GPIO_TRIGGER = 17 GPIO_ECHO = 27

# Պոմպ

START_PUMP = 1 STOP_PUMP = 0 PUMP_BOUNCE_TIME = 50 # միլիվայրկյան PUMP_STOP_TIMEOUT = 5 # վրկ

ԿԱՐԵՎՈՐ. Եթե մտադիր եք օգտագործել Pin 4-ը, մի մոռացեք անջատել 1-Wire raspi-config տարբերակը `հակամարտություններից խուսափելու համար:

Theրագրի գործարկման ժամանակ մենք գրանցում ենք հետադարձ կապ և նախնական վիճակը դնում OFF:

Ահա պոմպը միացնող գործառույթի կոդը.

def toggle_pump (արժեք). GPIO.output (GPIO_PUMP, արժեք) # Սկսել/դադարեցնել թափելը

Ինչպես սահմանված է վերը նշված գործարկման կոդի մեջ, երբ ռելեոնը միացված է, կանչվում է հետևյալ հետադարձ կապը.

pump_on = Սխալ def pump_relay_handle (pin). գլոբալ pump_on pump_on = GPIO.input (GPIO_PUMP) log_debug ("Պոմպի ռելեդը փոխվել է % d" % pump_on)

Հետադարձ կապում մենք պոմպի ընթացիկ վիճակը պահում ենք փոփոխականի մեջ: applicationրագրի հիմնական հանգույցում մենք կարող ենք հայտնաբերել այն պահը, երբ պոմպը միանում է, ինչպես ցույց է տրված ստորև.

def is_pump_on (): գլոբալ pump_on վերադարձի pump_on

եթե GPIO.event_detected (GPIO_PUMP):

is_pouring = is_pump_on () #… log_debug ('[!] Պոմպի իրադարձությունը հայտնաբերվել է. % s' % ('On' if ispporing else 'Off')) ուղարկել (ամպ, փոփոխականներ, հեռավորություն, ուժ = True)

Հեռավորության չափում

Quiteրի մակերևույթին հեռավորությունը չափելը բավականին հեշտ է `օգտագործելով ուլտրաձայնային հարևանության սենսոր: Մեր շտեմարանում մենք կիսեցինք մի քանի պիթոնի սցենարներ, որոնք թույլ են տալիս փորձարկել սենսորը:

Իրական ծրագրերում սենսորների ընթերցումները կարող են տատանվել սենսորի բարձրացնող ազդեցության և ջրի տատանումների պատճառով: Որոշ դեպքերում ընթերցումները կարող են ամբողջությամբ բացակայել: Մենք իրականացրեցինք BounceFilter դաս, որը կուտակում է N- ի վերջին արժեքները, գցում է գագաթները և հաշվարկում մնացած չափումների միջին ցուցանիշը: Չափման գործընթացն իրականացվում է հետևյալ ասինխրոն ալգորիթմի միջոցով:

# Պահում է սենսորի վերջին չափումների ընթերցումները = BounceFilter (չափը = 6, discard_count = 1)

read_complete = threading. Event ()

def wait_for_distance ():

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

եթե չեք կարդում_ ամբողջական. սպասեք (MAX_READING_TIMEOUT):

log_info ('Reading sensor timeout') return Ոչ մի վերադարձի ընթերցում չկա: avg ()

def read_distance ():

փորձեք.: reading_complete.set ()

Դուք կարող եք գտնել ֆիլտրի ամբողջական իրականացումը աղբյուրներում:

Քայլ 3: Արտակարգ իրավիճակների կարգավորում

Արտակարգ իրավիճակների կառավարում
Արտակարգ իրավիճակների կառավարում
Արտակարգ իրավիճակների կառավարում
Արտակարգ իրավիճակների կառավարում
Արտակարգ իրավիճակների կառավարում
Արտակարգ իրավիճակների կառավարում

Ի՞նչ կլինի, եթե սենսորը այրվի կամ ընկնի կամ սխալ տարածք նշի: Մեզ անհրաժեշտ էր նման դեպքեր հաղորդելու միջոց, որպեսզի կարողանանք ձեռքով գործողություններ կատարել:

Եթե սենսորը չի կարողանում ապահովել հեռավորության ընթերցումներ, համակարգը փոփոխված կարգավիճակն ուղարկում է ամպ և ստեղծում համապատասխան ծանուցում:

Տրամաբանությունը պատկերված է ստորև բերված ծածկագրով:

distance = wait_for_distance () # Կարդացեք ջրի ընթացիկ խորությունը, եթե հեռավորությունը չկա: log_error ('Distance error!') notify_in_background (calc_alert (SENSOR_ERROR)) send (cloud, variables, distance, error_code = SENSOR_ERROR, force = True)

Մենք ունենք ջրի մակարդակի գործառնական տիրույթ, որը պետք է պահպանվի, երբ սենսորը իր տեղում է: Մենք ստուգում ենք, արդյոք ջրի ներկայիս մակարդակը ընկնում է այս տիրույթում.

# Սենսորից մինչև ջրի մակարդակ # սուրճի մեքենայի ջրի բաքի հիման վրա MIN_DISTANCE = 2 # սմ MAX_DISTANCE = 8 # սմ

# Հեռավորությունը սպասված տիրույթից դուրս է. Մի սկսեք լցվել

եթե հեռավորությունը> MAX_DISTANCE * 2: log_error ('Հեռավորությունը տիրույթից դուրս է. %.2f' % հեռավորություն) շարունակեք

Մենք անջատում ենք պոմպը, եթե այն ակտիվ էր, երբ տեղի էր ունենում սխալ:

եթե is_pump_on () և pre_distance <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('

toggle_pump (STOP_PUMP)

Մենք մշակում ենք նաև այն դեպքը, երբ շշի ջուրն ավարտվում է: Մենք ստուգում ենք, արդյոք ջրի մակարդակը չի փոխվում, երբ պոմպն աշխատում է: Եթե այդպես է, համակարգը սպասում է 5 վայրկյան, իսկ հետո ստուգում է, արդյոք պոմպն անջատված է: Եթե դա չի եղել, ապա համակարգը իրականացնում է վթարային պոմպի անջատում և ուղարկում սխալի մասին ծանուցում:

PUMP_STOP_TIMEOUT = 5 # secsemergency_stop_time = Ոչ մեկը

def set_emergency_stop_time (այժմ, հորդառատ է).

գլոբալ Emergency_stop_time Emergency_stop_time = այժմ + PUMP_STOP_TIMEOUT, եթե / այլևս չի թափվում Ոչ մեկը

def check_water_source_empty (այժմ):

վերադարձնել Emergency_stop_time- ը և այժմ> Emergency_stop_time- ը

# --------- հիմնական հանգույց -----------

եթե GPIO.event_detected (GPIO_PUMP): is_pouring = is_pump_on () set_emergency_stop_time (now, is_pouring) #…

գլոբալ պոմպը_անջատված է

եթե check_water_source_empty (այժմ). log_error ('[!] Պոմպի վթարային կանգառ: / sourceրի աղբյուրը դատարկ է') toggle_pump (STOP_PUMP) pump_disabled = True

Վերևում արտակարգ իրավիճակների կանգառի ժամանակ առաջացած հաղորդագրությունների մատյան է:

Քայլ 4: Համակարգի գործարկում 24/7

Համակարգի գործարկում 24/7 ռեժիմով
Համակարգի գործարկում 24/7 ռեժիմով

Սարքի կոդը կարգաբերված է և աշխատում է առանց խնդիրների: Մենք այն գործարկեցինք որպես ծառայություն, ուստի այն վերագործարկվում է, եթե Raspberry Pi- ն վերագործարկվի: Հարմարության համար մենք ստեղծեցինք Makefile, որն օգնում է տեղակայմանը, ծառայության գործարկմանը և տեղեկամատյանների դիտմանը:

. PHONY: տեղադրել գործարկման մեկնարկի կանգառի կարգավիճակի մատյան, տեղակայել MAIN_FILE: = սուրճ-պոմպ/main.py SERVICE_INSTALL_SCRIPT: = service_install.sh SERVICE_NAME: = coffee-pump.service

տեղադրել:

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

վազել:

sudo python3 $ (MAIN_FILE)

սկիզբ:

sudo systemctl սկսել $ (SERVICE_NAME)

կարգավիճակ:

sudo systemctl կարգավիճակը $ (SERVICE_NAME)

կանգառ:

sudo systemctl կանգառը $ (SERVICE_NAME)

տեղեկամատյան:

sudo journalctl -u սուրճի պոմպ -այսօրվանից

տեղակայել:

rsync -av սուրճ-պոմպի սենսոր-կարգավորում Makefile *.sh pi@XX. XX. XXX. XXX: ~/

Դուք կարող եք գտնել այս ֆայլը և բոլոր անհրաժեշտ սցենարները մեր շտեմարանում:

Քայլ 5: Ամպի մոնիտորինգ

Ամպային մոնիտորինգ
Ամպային մոնիտորինգ
Ամպային մոնիտորինգ
Ամպային մոնիտորինգ
Ամպային մոնիտորինգ
Ամպային մոնիտորինգ
Ամպային մոնիտորինգ
Ամպային մոնիտորինգ

Մենք օգտագործեցինք Cloud4RPi ՝ կառավարման վահանակ իրականացնելու համար: Սկզբում մենք ավելացրեցինք վիջեթներ `նշելու համակարգի հիմնական պարամետրերը:

Ի դեպ, STATUS փոփոխականի վիջեթը կարող է օգտագործել տարբեր գույնի սխեմաներ `հիմնված դրա արժեքի (տե՛ս վերևի պատկերը):

Մենք ավելացրեցինք գծապատկերային վիջեթ ՝ դինամիկ տվյալները ցուցադրելու համար: Ստորև բերված պատկերում դուք կարող եք տեսնել այն պահը, երբ պոմպը միացված և անջատված է, և ջրի համապատասխան մակարդակները:

Եթե ավելի երկար ժամանակ եք վերլուծում, կարող եք տեսնել գագաթներ, դա այն ժամանակ էր, երբ պոմպը աշխատում էր:

Cloud4RPi- ն նաև թույլ է տալիս սահմանել հարթեցման տարբեր մակարդակներ:

Քայլ 6: Այն աշխատում է

Image
Image

Աշխատում է! Կառավարման վահանակն ամբողջությամբ նայում է ստորև:

Ներկայումս մեր ավտոմատ պոմպը գործում է արդեն մի քանի շաբաթ, և այն ամենը, ինչ մեզ անհրաժեշտ էր անել, ջրի շշերի փոխարինումն է: Մեր նախագծի ամբողջական կոդը հասանելի է մեր GitHub շտեմարանում:

Խորհուրդ ենք տալիս: