جدول المحتويات:

مضخة ماكينة القهوة الذكية يتحكم فيها Raspberry Pi & HC-SR04 مستشعر بالموجات فوق الصوتية و Cloud4RPi: 6 خطوات
مضخة ماكينة القهوة الذكية يتحكم فيها Raspberry Pi & HC-SR04 مستشعر بالموجات فوق الصوتية و Cloud4RPi: 6 خطوات

فيديو: مضخة ماكينة القهوة الذكية يتحكم فيها Raspberry Pi & HC-SR04 مستشعر بالموجات فوق الصوتية و Cloud4RPi: 6 خطوات

فيديو: مضخة ماكينة القهوة الذكية يتحكم فيها Raspberry Pi & HC-SR04 مستشعر بالموجات فوق الصوتية و Cloud4RPi: 6 خطوات
فيديو: 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: اختيار المعدات

اختيار المعدات
اختيار المعدات
اختيار المعدات
اختيار المعدات
اختيار المعدات
اختيار المعدات
اختيار المعدات
اختيار المعدات

المضخة

سيظهر بحث سريع على الويب العديد من نماذج المضخات الكهربائية المصممة لزجاجة المياه التي تختارها. عادة ما يتم التحكم في هذه المضخات بواسطة مفتاح تشغيل / إيقاف (على سبيل المثال ، Hot Frost A12 أو SMixx ХL-D2). ها هي المضخة التي اخترناها لمشروعنا.

جهاز التحكم

لقد جربنا العديد من الأجهزة ولكننا استقرنا على Raspberry Pi نظرًا للمزايا التالية:

  • يحتوي على GPIO الذي يسمح لنا بتوصيل مستشعر القرب
  • وهو يدعم لغة بايثون

قمنا بتثبيت إصدار جديد من Raspbian Buster Lite وكل ما هو مطلوب لتشغيل Python 3.

كيف نقوم بتبديل المضخة

للتحكم في الطاقة ، اخترنا مرحل الحالة الصلبة ذو الطاقة المتوسطة (12V / 2A) المناسب للتيار المتناوب. يربط التتابع المضخة بالمخرج ويتم التحكم فيه بواسطة دبوس Raspberry Pi الرقمي.

كيف نتحقق من مستوى الماء

كان من المهم بالنسبة لنا عدم تغيير بنية آلة القهوة ، لذلك قررنا استخدام مستشعر القرب بالموجات فوق الصوتية HC-SR04 لقياس مستوى الماء.

قمنا بطباعة ثلاثية الأبعاد لغطاء خزان مياه مخصص بفتحتين لبواعث المستشعر. وجدنا بسهولة مكتبة GitHub لجهاز الاستشعار ، وفي هذه المرحلة تم الانتهاء من جميع الاستعدادات.

الخطوة الثانية: تصميم النظام

تصميم النظام
تصميم النظام
تصميم النظام
تصميم النظام

منطق النظام

تم تصميم النظام مع مراعاة المنطق البسيط التالي:

  • يراقب النظام باستمرار المسافة بين المستشعر وسطح الماء.
  • عندما يتجاوز التغيير في المسافة قيمة عتبة ، يرسل النظام معلومات حول حالته إلى السحابة.
  • إذا تجاوزت المسافة الحد الأقصى للقيمة المسموح بها (الخزان فارغ) ، يقوم النظام بتنشيط المضخة وإيقاف تشغيلها بمجرد أن تكون المسافة أقل من الحد الأدنى للقيمة المسموح بها.
  • عندما تتغير حالة النظام (على سبيل المثال ، تنشط المضخة) ، فإنها تُعلم السحابة.

في حالة حدوث خطأ ، يتم إرسال إشعار إلى قناة Slack.

عندما تكون ماكينة القهوة في وضع الخمول ، يقوم النظام باختبار اتصال الخدمة السحابية ببيانات التشخيص مرة واحدة كل دقيقة. بالإضافة إلى ذلك ، يرسل حالته إلى السحابة كل 5 دقائق.

عندما تكون المضخة نشطة ، يرسل النظام البيانات بشكل متكرر ولكن ليس أكثر من مرة واحدة كل نصف ثانية.

def send (cloud، variables، dist، error_code = 0، force = False): pump_on = is_pump_on () percent = calc_water_level_percent (dist) variables ['Distance'] ['value'] = متغيرات dist ['WaterLevel'] [' value '] = متغيرات النسبة المئوية [' PumpRelay '] [' value '] = متغيرات pump_on [' Status '] [' value '] = calc_status (error_code، بالمائة، pump_on)

التيار = الوقت ()

global 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 لتجنب التعارضات.

عند بدء تشغيل البرنامج ، نسجل رد اتصال ونضبط الحالة الأولية على "إيقاف".

فيما يلي رمز الوظيفة التي تعمل على تبديل المضخة:

def toggle_pump (القيمة): 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 = F 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 global return pump_on

إذا تم اكتشاف GPIO.event_detected (GPIO_PUMP):

is_pouring = is_pump_on () #… log_debug ('[!] تم اكتشاف حدث المضخة:٪ s'٪ ('On' if is_pouring else 'Off')) إرسال (سحابة ، متغيرات ، مسافة ، قوة = صحيح)

قياس المسافة

من السهل جدًا قياس المسافة نحو سطح الماء باستخدام مستشعر القرب بالموجات فوق الصوتية. في مستودعنا ، شاركنا بعض نصوص Python التي تسمح لك باختبار جهاز استشعار.

في التطبيقات الحقيقية ، يمكن أن تتقلب قراءات أجهزة الاستشعار بسبب تأثير ارتداد المستشعر وتذبذبات الماء. في بعض الحالات ، قد تكون القراءات مفقودة تمامًا. قمنا بتطبيق فئة BounceFilter التي تجمع N من القيم الحديثة ، وتتجاهل القمم وتحسب متوسط القياسات المتبقية. يتم تنفيذ عملية القياس بواسطة الخوارزمية غير المتزامنة التالية.

# يحتفظ بقراءات قياسات المستشعر الأخيرة = BounceFilter (الحجم = 6 ، discard_count = 1)

Reading_complete = threading. Event ()

def wait_for_distance ():

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

إذا لم تكن read_complete. انتظر (MAX_READING_TIMEOUT):

log_info ("مهلة مستشعر القراءة") إرجاع بلا عودة readings.avg ()

def read_distance ():

جرب: value = hcsr04.raw_distance (sample_size = 5) rounded = القيمة إذا كانت القيمة لا شيء آخر round (القيمة ، 1) readings.add (تقريبًا) باستثناء الاستثناء على أنه خطأ: log_error ('خطأ داخلي:٪ s'٪ err) أخيرًا: reading_complete.set ()

يمكنك العثور على التنفيذ الكامل للفلتر في المصادر.

الخطوة الثالثة: التعامل مع حالات الطوارئ

التعامل مع حالات الطوارئ
التعامل مع حالات الطوارئ
التعامل مع حالات الطوارئ
التعامل مع حالات الطوارئ
التعامل مع حالات الطوارئ
التعامل مع حالات الطوارئ

ماذا لو احترق المستشعر أو سقط أو أشار إلى منطقة خاطئة؟ كنا بحاجة إلى طريقة للإبلاغ عن مثل هذه الحالات حتى نتمكن من اتخاذ إجراء يدوي.

إذا فشل المستشعر في توفير قراءات المسافة ، يرسل النظام الحالة المتغيرة إلى السحابة وينشئ إشعارًا مطابقًا.

المنطق موضح بالرمز أدناه.

المسافة = wait_for_distance () # اقرأ عمق المياه الحالي إذا كانت المسافة لا شيء: log_error ('خطأ مسافة!') notify_in_background (calc_alert (SENSOR_ERROR)) إرسال (سحابة ، متغيرات ، مسافة ، خطأ_رمز = SENSOR_ERROR ، القوة = صحيح)

لدينا نطاق مستوى الماء التشغيلي الذي يجب الحفاظ عليه عندما يكون المستشعر في مكانه. نحن نختبر ما إذا كان مستوى المياه الحالي يقع في هذا النطاق:

# المسافة من المستشعر إلى مستوى الماء # بناءً على خزان مياه ماكينة القهوة MIN_DISTANCE = 2 # سم MAX_DISTANCE = 8 # سم

# المسافة خارج النطاق المتوقع: لا تبدأ السكب

إذا كانت المسافة> MAX_DISTANCE * 2: خطأ في السجل ("المسافة خارج النطاق:٪.2f '٪ مسافة) تابع

نقوم بإيقاف تشغيل المضخة إذا كانت نشطة عند حدوث خطأ.

إذا is_pump_on () و prev_distance <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('[!] توقف طارئ للمضخة. لا توجد إشارة من مستشعر المسافة')

toggle_pump (STOP_PUMP)

نقوم أيضًا بمعالجة الحالة عند نفاد الماء من الزجاجة. نتحقق مما إذا كان مستوى الماء لا يتغير عند تشغيل المضخة. إذا كان الأمر كذلك ، فإن النظام ينتظر لمدة 5 ثوانٍ ثم يتحقق مما إذا كانت المضخة قد توقفت. إذا لم يحدث ذلك ، فسيقوم النظام بإيقاف تشغيل المضخة في حالات الطوارئ ويرسل إشعارًا بالخطأ.

PUMP_STOP_TIMEOUT = 5 # ثوانٍ

def set_em Emergency_stop_time (الآن ، is_pouring):

global Emergency_stop_time

def check_water_source_empty (الآن):

العودة Emergency_stop_time والآن> Emergency_stop_time

# --------- الحلقة الرئيسية -----------

إذا تم اكتشاف GPIO.event_detected (GPIO_PUMP): is_pouring = is_pump_on () set_em Emergency_stop_time (الآن ، is_pouring) #…

مضخة عالمية معطلة

إذا 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 coffee-pump - منذ اليوم

نشر:

rsync -av coffee-pump-setup Makefile *.sh pi@XX. XX. XXX. XXX: ~ /

يمكنك العثور على هذا الملف وجميع البرامج النصية المطلوبة في مستودعنا.

الخطوة 5: مراقبة السحابة

مراقبة السحابة
مراقبة السحابة
مراقبة السحابة
مراقبة السحابة
مراقبة السحابة
مراقبة السحابة
مراقبة السحابة
مراقبة السحابة

استخدمنا Cloud4RPi لتنفيذ لوحة تحكم. أضفنا أولاً عناصر واجهة مستخدم للإشارة إلى المعلمات الأساسية للأنظمة.

بالمناسبة ، يمكن لعنصر واجهة مستخدم متغير الحالة استخدام أنظمة ألوان مختلفة بناءً على قيمته (انظر الصورة أعلاه).

أضفنا أداة الرسم البياني لعرض البيانات الديناميكية. في الصورة أدناه ، يمكنك رؤية لحظة تشغيل المضخة وإيقاف تشغيلها ومستويات المياه ذات الصلة.

إذا قمت بتحليل فترة زمنية أطول ، يمكنك رؤية القمم - وذلك عندما كانت المضخة تعمل.

يتيح لك Cloud4RPi أيضًا تعيين مستويات تجانس مختلفة.

الخطوة 6: إنها تعمل

Image
Image

إنها تعمل! تبدو لوحة التحكم بالكامل كما هو موضح أدناه.

حاليًا ، تعمل المضخة الأوتوماتيكية الخاصة بنا منذ عدة أسابيع وكل ما يتعين علينا القيام به هو استبدال زجاجات المياه. الكود الكامل لمشروعنا متاح في مستودع GitHub الخاص بنا.

موصى به: