Съдържание:

Интелигентна помпа за кафе машина, контролирана от Raspberry Pi & HC-SR04 ултразвуков сензор и Cloud4RPi: 6 стъпки
Интелигентна помпа за кафе машина, контролирана от Raspberry Pi & HC-SR04 ултразвуков сензор и Cloud4RPi: 6 стъпки

Видео: Интелигентна помпа за кафе машина, контролирана от Raspberry Pi & HC-SR04 ултразвуков сензор и Cloud4RPi: 6 стъпки

Видео: Интелигентна помпа за кафе машина, контролирана от Raspberry Pi & HC-SR04 ултразвуков сензор и Cloud4RPi: 6 стъпки
Видео: Кубический кооператив с анализом матрицы ► 1 Прохождение Left 4 dead 2 2024, Юли
Anonim
Интелигентна помпа за кафе машина, контролирана от Raspberry Pi & HC-SR04 ултразвуков сензор и Cloud4RPi
Интелигентна помпа за кафе машина, контролирана от Raspberry Pi & HC-SR04 ултразвуков сензор и Cloud4RPi

На теория всеки път, когато отидете до кафемашината за сутрешната си чаша, има само един на двадесет шанс да напълните резервоара за вода. На практика обаче изглежда, че машината по някакъв начин намира начин винаги да ви постави тази работа. Колкото повече искате кафе, толкова по -голяма е вероятността да получите страшното съобщение „напълнете резервоара за вода“. Моите колеги чувстват същото по този въпрос. Тъй като сме глупаци, ние решихме да внедрим технологията, която ще сложи край на това.

Консумативи

Нашето оборудване

Разполагаме с кафе машина SAECO Aulika Focus. До този ден използвахме ръчна помпа, за да напълним резервоара за вода на машината от стандартна бутилка за вода от 5 галона (19 литра).

Нашите цели

  1. Използвайте електрическа помпа, задвижвана от някакъв вид контролер или микрокомпютър чрез реле.
  2. Имайте начин да измерите нивото на водата в резервоара на кафе машината, така че нашата система да знае кога да го напълни отново.
  3. Разполагайте със средства за управление на системата, за предпочитане в реално време от мобилно устройство.
  4. Получавайте известия (чрез Slack или подобна услуга), ако нещо се обърка със системата.

Стъпка 1: Избор на оборудване

Избор на оборудване
Избор на оборудване
Избор на оборудване
Избор на оборудване
Избор на оборудване
Избор на оборудване
Избор на оборудване
Избор на оборудване

Помпата

Бързо търсене в мрежата ще покаже няколко модела електрически помпи, предназначени за избраната от вас бутилка с вода. Такива помпи обикновено се управляват от ключ за включване/изключване (например Hot Frost A12 или SMixx ХL-D2). Ето помпата, която избрахме за нашия проект.

Устройството на контролера

Опитахме няколко устройства, но се спряхме на Raspberry Pi поради следните предимства:

  • Той има GPIO, който ни позволява да свържем сензор за близост
  • Той поддържа Python

Инсталирахме нова версия на Raspbian Buster Lite и всичко необходимо за стартиране на Python 3.

Как превключваме помпата

За да контролираме мощността, избрахме твърдо реле със средна мощност (12V/2A), подходящо за променлив ток. Релето свързва помпата към изхода и се управлява от цифровия щифт на Raspberry Pi.

Как проверяваме нивото на водата

За нас беше важно да не променяме конструкцията на кафе машината, затова решихме да използваме ултразвуков сензор за близост HC-SR04 за измерване на нивото на водата.

Ние отпечатахме 3d калъф за резервоар за вода с два отвора за излъчвателите на сензора. Лесно намерихме библиотека 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 променливи ['WaterLevel'] [' стойност '] = процентни променливи [' PumpRelay '] [' стойност '] = променливи помпа_на [' Състояние '] [' стойност '] = изчисляване_състояние (код на грешка, процент, помпа_на)

текущ = време ()

глобална last_sending_time if force or current - 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, за да избегнете конфликти.

При стартиране на програмата регистрираме обратно повикване и задаваме първоначалното състояние на OFF.

Ето кода за функцията, която превключва помпата:

def toggle_pump (value): if pump_disabled: return if is_pump_on ()! = value: log_debug ("[x] % s" % ('START' if value else '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 (): глобална pump_on връщане pump_on

ако GPIO.event_detected (GPIO_PUMP):

is_pouring = is_pump_on () #… log_debug ('[!] Открито събитие на помпата: % s' % ('On', ако is_pouring else 'Off')) send (облак, променливи, разстояние, сила = True)

Измерване на разстоянието

Доста лесно е да се измери разстоянието до водната повърхност с помощта на ултразвуков сензор за близост. В нашето хранилище споделихме няколко скрипта на python, които ви позволяват да тествате сензор.

В реални приложения показанията на сензора могат да се колебаят поради подскачащия ефект на сензора и трептенията на водата. В някои случаи показанията могат да липсват напълно. Ние внедрихме 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 ('Време за изчакване на сензора за четене') връщане Няма връщане readings.avg ()

def read_distance ():

опитайте: стойност = hcsr04.raw_distance (sample_size = 5) закръглена = стойност, ако стойността е None else кръгла (стойност, 1) readings.add (закръглена) с изключение на Exception as err: log_error ('Вътрешна грешка: % s' % err) накрая: reading_complete.set ()

Можете да намерите пълното изпълнение на филтъра в източниците.

Стъпка 3: Решаване на извънредни ситуации

Решаване на извънредни ситуации
Решаване на извънредни ситуации
Решаване на извънредни ситуации
Решаване на извънредни ситуации
Решаване на извънредни ситуации
Решаване на извънредни ситуации

Ами ако сензорът е изгорял или е паднал или сочи към грешна област? Трябваше ни начин да съобщим за такива случаи, за да можем да предприемем ръчни действия.

Ако сензорът не успее да предостави показания за разстояние, системата изпраща промененото състояние на облака и генерира съответно известие.

Логиката е илюстрирана от кода по -долу.

distance = wait_for_distance () # Прочетете текущата дълбочина на водата, ако разстоянието е None: log_error ('Distance error!') notify_in_background (calc_alert (SENSOR_ERROR)) send (cloud, variables, distance, error_code = SENSOR_ERROR, force = True)

Имаме работен диапазон на нивото на водата, който трябва да се поддържа, когато сензорът е на мястото си. Тестваме дали текущото ниво на водата попада в този диапазон:

# Разстояние от сензора до нивото на водата # въз основа на резервоара за вода на кафемашината MIN_DISTANCE = 2 # cm MAX_DISTANCE = 8 # cm

# Разстоянието е извън очаквания диапазон: не започвайте да наливате

ако разстояние> 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 # secsemergency_stop_time = Няма

def set_emergency_stop_time (сега, is_pouring):

глобална авария_стоп_време аварийна_становка_време = сега + PUMP_STOP_TIMEOUT, ако / е_ излива друго Няма

def check_water_source_empty (сега):

върнете аварийно_стоп_време и сега> аварийно_стоп_време

# --------- основен цикъл -----------

ако GPIO.event_detected (GPIO_PUMP): is_pouring = is_pump_on () set_emergency_stop_time (сега, is_pouring) #…

глобално pump_disabled

ако check_water_source_empty (сега): log_error ('[!] Аварийно спиране на помпата. / Източникът на вода е празен') toggle_pump (STOP_PUMP) pump_disabled = Вярно

По -горе е пример за дневник на съобщения, генериран по време на аварийно спиране.

Стъпка 4: Стартирайте системата денонощно

Стартиране на системата 24/7
Стартиране на системата 24/7

Кодът на устройството е отстранен и работи без проблеми. Стартирахме го като услуга, така че той се рестартира, ако Raspberry Pi се рестартира. За удобство създадохме Makefile, който помага при внедряване, стартиране на услугата и преглед на дневници.

. PHONY: инсталирайте стартиране старт стоп дневник на състоянието разполагане MAIN_FILE: = кафе-помпа/main.py SERVICE_INSTALL_SCRIPT: = service_install.sh SERVICE_NAME: = кафе-помпа.service

Инсталирай:

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

бягай:

sudo python3 $ (MAIN_FILE)

старт:

sudo systemctl start $ (SERVICE_NAME)

състояние:

състояние на sudo systemctl $ (SERVICE_NAME)

Спри се:

sudo systemctl stop $ (SERVICE_NAME)

дневник:

sudo journalctl -u кафе -помпа --от днес

разгръщам:

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

Можете да намерите този файл и всички необходими скриптове в нашето хранилище.

Стъпка 5: Облачен мониторинг

Облачен мониторинг
Облачен мониторинг
Облачен мониторинг
Облачен мониторинг
Облачен мониторинг
Облачен мониторинг
Облачен мониторинг
Облачен мониторинг

Използвахме Cloud4RPi за внедряване на контролен панел. Първо добавихме джаджи, за да посочим основните параметри на системата.

Между другото, джаджата за променливата STATUS може да използва различни цветови схеми въз основа на нейната стойност (вижте изображението по -горе).

Добавихме джаджа за диаграма за показване на динамични данни. На изображението по -долу можете да видите момента на включване и изключване на помпата и съответните нива на водата.

Ако анализирате по -дълъг период от време, можете да видите пикове - тогава помпата работеше.

Cloud4RPi също ви позволява да задавате различни нива на изглаждане.

Стъпка 6: Работи

Image
Image

Работи! Контролният панел в своята цялост изглежда, както е показано по -долу.

В момента нашата автоматична помпа работи от няколко седмици и всичко, което трябва да направим, е да сменим бутилките с вода. Пълният код за нашия проект е достъпен в нашето хранилище на GitHub.

Препоръчано: