Мазмуну:

Smart Coffee Machine Pump Raspberry Pi & HC-SR04 Ultrasonic Sensor жана Cloud4RPi тарабынан башкарылат: 6 кадам
Smart Coffee Machine Pump Raspberry Pi & HC-SR04 Ultrasonic Sensor жана Cloud4RPi тарабынан башкарылат: 6 кадам

Video: Smart Coffee Machine Pump Raspberry Pi & HC-SR04 Ultrasonic Sensor жана Cloud4RPi тарабынан башкарылат: 6 кадам

Video: Smart Coffee Machine Pump Raspberry Pi & HC-SR04 Ultrasonic Sensor жана Cloud4RPi тарабынан башкарылат: 6 кадам
Video: Smart Coffee Machine Pump Controlled by Raspberry Pi & HC-SR04 Ultrasonic Sensor 2024, Июль
Anonim
Smart Coffee Machine Pump Raspberry Pi & HC-SR04 Ultrasonic Sensor жана Cloud4RPi тарабынан башкарылат
Smart Coffee Machine Pump Raspberry Pi & HC-SR04 Ultrasonic Sensor жана 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 Ultrasonic жакындык сенсорун суунун деңгээлин өлчөө үчүн колдонууну чечтик.

Биз сенсордун эмитенттери үчүн эки тешиги бар атайын суу сактагычтын капкагын 3d-жолу басып чыгардык.

2 -кадам: Системаны долбоорлоо

Системаны долбоорлоо
Системаны долбоорлоо
Системаны долбоорлоо
Системаны долбоорлоо

Системанын логикасы

Система төмөнкү жөнөкөй логиканы эске алуу менен иштелип чыккан:

  • Система дайыма сенсор менен суунун ортосундагы аралыкты көзөмөлдөйт.
  • Качан аралыкта өзгөрүү чектик мааниден ашып кетсе, система булутка анын абалы жөнүндө маалыматты жөнөтөт.
  • Эгерде аралык уруксат берилген максималдуу чектен ашып кетсе (танк бош), система насосту иштетет жана аралык минималдуу уруксат берилген чектен аз болгондо өчүрөт.
  • Тутумдун абалы өзгөргөн сайын (мисалы, насос иштетилет) булутка кабар берет.

Ката болгон учурда, Slack каналына билдирүү жөнөтүлөт.

Кофе машинасы бош турганда, система булут кызматын диагностикалык маалыматтар менен мүнөтүнө бир жолу коет. Кошумча катары, ал абалын булутка 5 мүнөт сайын жөнөтөт.

Насос активдүү болгондо, система маалыматты тез -тез жөнөтөт, бирок жарым секундда бир жолудан көп эмес.

def send (булут, өзгөрмөлөр, dist, error_code = 0, күч = False): pump_on = is_pump_on () пайыз = calc_water_level_percent (dist) өзгөрмөлөр ['Distance'] ['value'] = dist variables ['WaterLevel'] [' маани '] = пайыздык өзгөрмөлөр [' PumpRelay '] [' маани '] = насостук_онумуштуу [' Статус '] [' балл '] = calc_status (ката_код, пайыз, насос_он)

учурдагы = убакыт ()

глобалдык акыркы_жөнөтүү_чактысы учурдагы же учурдагы - акыркы_жөнөтүү убактысы> 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 # сек

МААНИЛҮҮ: Эгерде сиз 4-пинди колдоно турган болсоңуз, чыр-чатактарды болтурбоо үчүн 1-зымдуу raspi-config опциясын өчүрүүнү унутпаңыз.

Программанын башталышында биз кайра чалууну каттайбыз жана баштапкы абалды ӨЧҮКкө койобуз.

Бул жерде насосту алмаштыруучу функция үчүн код:

def toggle_pump (value): if pump_disabled: return is_pump_on ()! = value: log_debug ("[x] % s" % ('START' эгер мааниси башка болсо 'STOP')) GPIO.setup (GPIO_PUMP, GPIO. OUT) GPIO.output (GPIO_PUMP, маани) # Куйууну баштоо/токтотуу

Жогорудагы старттык коддо аныкталгандай, реле күйгүзүлгөндө, төмөнкү кайра чалуу чакырылат:

pump_on = False def pump_relay_handle (pin): global pump_on pump_on = GPIO.input (GPIO_PUMP) log_debug ("Насостун релеси % d болуп өзгөрдү" % pump_on)

Кайра чалууда, биз насостун учурдагы абалын өзгөрмөгө сактайбыз. Колдонмонун негизги циклинде, биз насостун төмөндөгүдөй которулган учурун аныктай алабыз:

def is_pump_on (): глобалдык насостун_кайра насостун

эгер GPIO.event_detected (GPIO_PUMP):

is_pouring = is_pump_on () #… log_debug ('[!] Насостун окуясы аныкталды: % s' % (эгер күйгүзүлсө, башка 'Өчүк')) жөнөтүү (булут, өзгөрмөлөр, аралык, күч = Ырас)

Аралыкты өлчөө

УЗИге жакындык сенсорунун жардамы менен суунун бетине чейинки аралыкты өлчөө оңой. Биздин репозиторийде биз сенсорду текшерүүгө мүмкүндүк берген бир нече python скрипттерин бөлүштүк.

Чыныгы тиркемелерде сенсордун окуусу сенсордун секирүүчү эффектинен жана суу термелүүсүнөн улам өзгөрүшү мүмкүн. Кээ бир учурларда, окуу таптакыр жок болуп кетиши мүмкүн. Биз BounceFilter классын киргиздик, ал N акыркы баалуулуктарды топтойт, чокуларды жокко чыгарат жана калган өлчөөлөрдүн орточо эсептерин эсептейт. Өлчөө процесси төмөнкү асинхрондук алгоритм менен ишке ашырылат.

# Акыркы сенсордун өлчөөлөрүн окууну сактайт = BounceFilter (size = 6, discard_count = 1)

reading_complete = threading. Event ()

def wait_for_distance ():

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

эгер окулбаса_компьютериңизди күтүңүз (MAX_READING_TIMEOUT):

log_info ('Окуу сенсорунун күтүү убактысы') кайтаруу Эч бири кайтарылган readings.avg ()

def read_distance ():

аракет кылыңыз: маани = hcsr04.raw_distance (sample_size = 5) тегеректелген = эгерде мааниси Эч ким башка тегерек эмес (маани, 1) readings.add (тегеректелген) катадан башка учурлардан тышкары: log_error ('Ички ката: % s' % катасы) акыры: reading_complete.set ()

Чыпканын толук аткарылышын булактардан таба аласыз.

3 -кадам: Өзгөчө кырдаалдарды жөнгө салуу

Өзгөчө кырдаалдарды жөнгө салуу
Өзгөчө кырдаалдарды жөнгө салуу
Өзгөчө кырдаалдарды жөнгө салуу
Өзгөчө кырдаалдарды жөнгө салуу
Өзгөчө кырдаалдарды жөнгө салуу
Өзгөчө кырдаалдарды жөнгө салуу

Сенсор күйүп кетсе, же кулап кетсе же туура эмес жерди көрсөтсө эмне болот? Кол менен чара көрүү үчүн бизге мындай учурларды кабарлоонун жолу керек болчу.

Эгерде сенсор дистанциялык көрсөткүчтөрдү бере албаса, система өзгөрүлгөн статусту булутка жөнөтөт жана тиешелүү билдирүүнү түзөт.

Логика төмөнкү код менен сүрөттөлгөн.

расстояние = wait_for_distance () # Учурдагы суунун тереңдигин окуңуз, эгерде аралык жок болсо: log_error ('Distance error!') notify_in_background (calc_alert (SENSOR_ERROR)) send (cloud, variables, distance, error_code = SENSOR_ERROR, force = True)

Бизде сенсор өз ордунда болгондо сакталышы керек болгон суунун деңгээлинин диапазону бар. Биз учурдагы суунун деңгээли ушул диапазонго түшүп калабы деп текшеребиз:

# Сенсордон суунун деңгээлине чейинки аралык # кофе машинасынын суу сактагычына негизделген

# Аралык күтүлгөн чектен чыгып кетти: куюуну баштабаңыз

эгер аралык> MAX_DISTANCE * 2: log_error ('Аралык диапазондо эмес: %.2f' % аралык) улантуу

Биз ката кеткенде активдүү болсо насосту өчүрөбүз.

if is_pump_on () жана prev_distance <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('[!] Насостун авариялык токтотулушу. Алыстык сенсорунан сигнал жок')

toggle_pump (STOP_PUMP)

Бөтөлкөдөн суу түгөнгөндө биз дагы иштейбиз. Насос иштеп жатканда суунун деңгээли өзгөрбөй турганын текшеребиз. Андай болсо, система 5 секунд күтөт, анан насостун өчүрүлгөнүн текшерет. Эгерде ал жок болсо, анда система авариялык насосту өчүрүүнү ишке ашырат жана ката жөнүндө билдирүү жөнөтөт.

PUMP_STOP_TIMEOUT = 5 # secsemercency_stop_time = Жок

def set_emergency_stop_time (азыр, куюп жатат):

global 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_emercency_stop_time (азыр, куюп жатат) #…

global pump_disabled

if check_water_source_empty (азыр): log_error ('[!] Насостун авариялык токтотулушу. / Суу булагы бош') toggle_pump (STOP_PUMP) pump_disabled = Чын

Жогоруда авариялык токтотуу учурунда түзүлгөн билдирүүлөр журналынын мисалы.

4 -кадам: Системаны 24/7 иштетүү

Системаны 24/7 иштетүү
Системаны 24/7 иштетүү

Түзмөктөгү код мүчүлүштүктөрдү оңдоп -түзөп, көйгөйсүз иштейт. Биз аны кызмат катары ишке киргиздик, андыктан Raspberry Pi кайра жүктөлсө, ал кайра башталат. Ыңгайлуулук үчүн, биз жайгаштырууга, кызматты иштетүүгө жана журналдарды көрүүгө жардам берген Makefile түздүк.

. PHONY: орнотууну иштетүү баштоону токтотуу абалынын журналын жайылтуу MAIN_FILE: = coffee-pump/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 status $ (SERVICE_NAME)

токтотуу:

sudo systemctl stop $ (SERVICE_NAME)

журнал:

sudo journalctl -u кофе -насосу -бүгүнкү күндөн баштап

жайылтуу:

rsync -av кофе насосунун сенсорун орнотуу Makefile *.sh pi@XX. XX. XXX. XXX: ~/

Сиз бул файлды жана бардык керектүү скрипттерди биздин репозиторийден таба аласыз.

5 -кадам: Cloud Monitoring

Cloud Monitoring
Cloud Monitoring
Cloud Monitoring
Cloud Monitoring
Cloud Monitoring
Cloud Monitoring
Cloud Monitoring
Cloud Monitoring

Биз башкаруу панелин ишке ашыруу үчүн Cloud4RPi колдонгон. Биз алгач виджеттерди системанын маанилүү параметрлерин көрсөтүү үчүн коштук.

Баса, STATUS өзгөрмөсүнүн виджети анын маанисине жараша ар кандай түс схемаларын колдоно алат (жогорудагы сүрөттү караңыз).

Биз динамикалык маалыматтарды көрсөтүү үчүн диаграмма виджетин коштук. Төмөндөгү сүрөттө сиз насостун күйүп -өчкөнүн жана суунун тиешелүү деңгээлин көрө аласыз.

Эгерде сиз узак убакытты анализдесеңиз, анда чокуларды көрө аласыз - ошол кезде насос иштеп жаткан.

Cloud4RPi ошондой эле ар кандай тегиздөө деңгээлин коюуга мүмкүндүк берет.

6 -кадам: Бул иштейт

Image
Image

Ал иштейт! Башкаруу панели толугу менен төмөндө көрсөтүлгөндөй көрүнөт.

Азыркы учурда, биздин автоматтык насос бир нече жумадан бери иштеп жатат жана биз эмне кылышыбыз керек болсо, суу бөтөлкөлөрүн алмаштыруу. Биздин долбоордун толук коду GitHub репозиторийибизде жеткиликтүү.

Сунушталууда: