فهرست مطالب:
- تدارکات
- مرحله 1: انتخاب تجهیزات
- مرحله 2: طراحی سیستم
- مرحله 3: رسیدگی به شرایط اضطراری
- مرحله 4: اجرای سیستم 24/7
- مرحله 5: نظارت بر ابر
- مرحله 6: کار می کند
تصویری: پمپ دستگاه قهوه هوشمند کنترل شده توسط Raspberry Pi & HC-SR04 Ultrasonic Sensor و Cloud4RPi: 6 مرحله
2024 نویسنده: John Day | [email protected]. آخرین اصلاح شده: 2024-01-30 08:54
از نظر تئوری ، هر بار که برای فنجان صبح خود به دستگاه قهوه می روید ، فقط یک بار در بیست فرصت دارید که مخزن آب را پر کنید. با این حال ، در عمل ، به نظر می رسد که دستگاه به نحوی راهی پیدا می کند که همیشه این کار را بر عهده شما بگذارد. هرچه بیشتر قهوه بخواهید ، احتمال دریافت پیام ترسناک "پر کردن مخزن آب" بیشتر می شود. همکاران من نیز در این مورد احساس مشابهی دارند. با توجه به این که ما آدم های بی نظیری هستیم ، تصمیم گرفتیم از فناوری استفاده کنیم که به این امر پایان می دهد.
تدارکات
تجهیزات ما
ما دستگاه قهوه ساز SAECO Aulika Focus داریم. تا به امروز ، ما از یک پمپ دستی برای پر کردن مخزن آب دستگاه از یک بطری آب استاندارد 5 گالن (19 لیتر) استفاده می کردیم.
اهداف ما
- از پمپ الکتریکی استفاده کنید که توسط نوعی کنترلر یا میکرو کامپیوتر از طریق رله هدایت می شود.
- راهی برای اندازه گیری سطح آب در مخزن دستگاه قهوه داشته باشید تا سیستم ما بداند چه موقع باید آن را دوباره پر کند.
- وسایلی برای کنترل سیستم ، ترجیحاً در زمان واقعی از طریق دستگاه تلفن همراه داشته باشید.
- در صورت خرابی سیستم ، اعلان ها (از طریق Slack یا سرویس مشابه) دریافت کنید.
مرحله 1: انتخاب تجهیزات
پمپ
یک جستجوی سریع در اینترنت چندین مدل پمپ الکتریکی را نشان می دهد که برای بطری آب دلخواه شما طراحی شده اند. چنین پمپ هایی معمولاً توسط یک کلید ON/OFF (به عنوان مثال Hot Frost A12 یا SMixx ХL-D2) کنترل می شوند. در اینجا پمپی است که ما برای پروژه خود انتخاب کردیم.
دستگاه کنترل کننده
ما چندین دستگاه را امتحان کردیم اما به دلیل مزایای زیر از رزبری پای استفاده کردیم:
- دارای GPIO است که به ما اجازه می دهد سنسور مجاورت را متصل کنیم
- از پایتون پشتیبانی می کند
ما نسخه جدیدی از Raspbian Buster Lite و همه چیز مورد نیاز برای اجرای پایتون 3 را نصب کردیم.
نحوه تعویض پمپ
برای کنترل قدرت ، ما یک رله حالت متوسط (12 ولت/2 آمپر) قدرت متوسط برای جریان متناوب انتخاب کردیم. رله پمپ را به پریز متصل کرده و توسط پین دیجیتال رزبری پای کنترل می شود.
چگونه سطح آب را بررسی می کنیم
برای ما مهم بود که ساختار دستگاه قهوه را تغییر ندهیم ، بنابراین تصمیم گرفتیم از سنسور مجاورت اولتراسونیک HC-SR04 برای اندازه گیری سطح آب استفاده کنیم.
ما یک جلد مخزن آب سفارشی با دو سوراخ برای ساطع کننده های سنسور به صورت سه بعدی چاپ کردیم. ما به راحتی یک کتابخانه GitHub برای سنسور پیدا کردیم. در این مرحله همه آماده سازی ها به پایان رسید.
مرحله 2: طراحی سیستم
منطق سیستم
سیستم با منطق ساده زیر طراحی شده است:
- این سیستم به طور مداوم فاصله بین سنسور و سطح آب را کنترل می کند.
- هر زمان که تغییر فاصله از مقدار آستانه فراتر رود ، سیستم اطلاعات مربوط به وضعیت خود را به ابر ارسال می کند.
- اگر فاصله بیش از حداکثر مقدار مجاز باشد (مخزن خالی است) ، سیستم پمپ را فعال کرده و هنگامی که فاصله کمتر از حداقل مقدار مجاز است ، آن را خاموش می کند.
- هر زمان که وضعیت سیستم تغییر می کند (به عنوان مثال ، پمپ فعال می شود) ، ابر را مطلع می کند.
در صورت بروز خطا ، اعلان به کانال Slack ارسال می شود.
وقتی دستگاه قهوه خالی است ، سیستم هر دقیقه یکبار سرویس ابری را با داده های تشخیصی پینگ می کند. علاوه بر این ، هر 5 دقیقه حالت خود را به ابر ارسال می کند.
هنگامی که پمپ فعال است ، سیستم داده ها را مکرر ارسال می کند اما نه بیشتر از یک بار در هر نیم ثانیه.
def send (cloud، variables، dist، error_code = 0، force = False): pump_on = is_pump_on () درصد = calc_water_level_percent (dist) متغیرها ['Distance'] ['value'] = dist variables ['WaterLevel'] [' value '] = درصد متغیرها [' PumpRelay '] [' value '] = پمپ متغیرها [' Status '] [' value '] = calc_status (کد خطا ، درصد ، pump_on)
جاری = زمان ()
جهانی last_sending_time if force یا 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 # ثانیه
مهم: اگر می خواهید از پین 4 استفاده کنید ، فراموش نکنید که گزینه 1-Wire raspi-config را برای جلوگیری از درگیری غیرفعال کنید.
در هنگام راه اندازی برنامه ، ما یک تماس تلفنی ثبت می کنیم و حالت اولیه را روی OFF تنظیم می کنیم.
در اینجا کد عملکردی که پمپ را تغییر می دهد آورده شده است:
def toggle_pump (value): if pump_disabled: بازگشت اگر 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 = pump_relay_handle (pin): pump_on global pump_on = GPIO.input (GPIO_PUMP) log_debug ("رله پمپ به٪ d تغییر کرد"٪ pump_on)
در تماس برگشتی ، وضعیت فعلی پمپ را در یک متغیر ذخیره می کنیم. در حلقه اصلی برنامه ، می توانیم لحظه ای را که پمپ به حالت زیر تغییر می کند ، تشخیص دهیم:
def is_pump_on (): پمپ global_on pump_on برگشتی
اگر GPIO.event_detected (GPIO_PUMP):
is_pouring = is_pump_on () #… log_debug ('[!] رویداد پمپ شناسایی شد:٪ s'٪ ('On' if ispoping else 'Off')) ارسال (ابر ، متغیرها ، فاصله ، نیرو = درست)
اندازه گیری فاصله
اندازه گیری فاصله تا سطح آب با استفاده از سنسور مجاورت اولتراسونیک بسیار آسان است. در مخزن ما ، چند اسکریپت پایتون را به اشتراک گذاشتیم که به شما امکان می دهد یک سنسور را آزمایش کنید.
در کاربردهای واقعی ، قرائت سنسورها می تواند به دلیل اثر پرش سنسور و نوسانات آب در نوسان باشد. در برخی موارد ، خواندن ها می توانند به طور کامل از بین بروند. ما یک کلاس BounceFilter را پیاده سازی کردیم که N مقادیر اخیر را جمع آوری می کند ، قله ها را کنار می گذارد و میانگین اندازه گیری های باقی مانده را محاسبه می کند. فرایند اندازه گیری با الگوریتم ناهمزمان زیر پیاده سازی می شود.
# آخرین اندازه گیری های سنسور را حفظ می کند readings = BounceFilter (اندازه = 6 ، discard_count = 1)
read_complete = threading. Event ()
def wait_for_distance ():
read_complete.clear () thread = threading. Thread (target = read_distance) thread.start ()
اگر نه read_complete. صبر کنید (MAX_READING_TIMEOUT):
log_info ("زمان خواندن سنسور خواندن") بازگشت هیچ readings.avg ()
def read_distance ():
try: value = hcsr04.raw_distance (sample_size = 5) rounded = value if value is None else round (value، 1) readings.add (rounded) Exception as err: log_error ('error داخلی:٪ s'٪ err) در نهایت: 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 # 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 (در حال حاضر ، ریختن):
global_stop_time Emergency_stop_time = اکنون + PUMP_STOP_TIMEOUT در صورت / ریزش دیگر هیچ
def check_water_source_empty (در حال حاضر):
زمان اضطراری_ توقف_و اکنون و زمان> اضطراری_زمان توقف
# --------- حلقه اصلی -----------
اگر GPIO.event_detected (GPIO_PUMP): is_pouring = is_pump_on () set_emergency_stop_time (now، is_pouring) #…
پمپ جهانی غیر فعال شده است
if check_water_source_empty (now): log_error ('[!] توقف اضطراری پمپ. / منبع آب خالی است') toggle_pump (STOP_PUMP) pump_disabled = درست
در بالا نمونه ای از گزارش پیام ایجاد شده در هنگام توقف اضطراری است.
مرحله 4: اجرای سیستم 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 وضعیت $ (SERVICE_NAME)
متوقف کردن:
sudo systemctl stop $ (SERVICE_NAME)
log:
sudo journalctl -u قهوه پمپ -از امروز
استقرار:
rsync -av coffee-pump sensor-setup Makefile *.sh pi@XX. XX. XXX. XXX: ~/
می توانید این فایل و همه اسکریپت های مورد نیاز را در مخزن ما پیدا کنید.
مرحله 5: نظارت بر ابر
ما از Cloud4RPi برای پیاده سازی کنترل پنل استفاده کردیم. ما ابتدا ابزارک هایی را برای نشان دادن پارامترهای اساسی سیستم اضافه کردیم.
به هر حال ، ویجت متغیر STATUS می تواند از رنگ های مختلف بر اساس مقدار آن استفاده کند (تصویر بالا را ببینید).
ویجت نمودار را برای نمایش داده های پویا اضافه کردیم. در تصویر زیر می توانید لحظه روشن و خاموش شدن پمپ و سطح آب مربوطه را مشاهده کنید.
اگر بازه زمانی بیشتری را تجزیه و تحلیل کنید ، می توانید قله ها را ببینید - آن زمان پمپ در حال کار بود.
Cloud4RPi همچنین به شما امکان می دهد سطوح مختلف هموارسازی را تنظیم کنید.
مرحله 6: کار می کند
کار می کند! صفحه کنترل به طور کامل مانند شکل زیر است.
در حال حاضر ، پمپ اتوماتیک ما چند هفته است که کار می کند و تنها کاری که باید انجام دهیم این است که بطری های آب را تعویض کنیم. کد کامل پروژه ما در مخزن GitHub ما موجود است.
توصیه شده:
لامپ LED هوشمند کنترل شده توسط تلفن هوشمند: 7 مرحله
لامپ LED هوشمند هوشمند با کنترل بلوتوث: من همیشه رویای کنترل وسایل روشنایی خود را دارم. سپس شخصی یک لامپ LED باورنکردنی رنگارنگ ساخت. من اخیراً در یوتیوب با یک چراغ LED توسط Joseph Casha برخورد کردم. با الهام از آن ، تصمیم گرفتم چندین عملکرد را در حین حفظ مخفی کردن اضافه کنم
دزدگیر کنترل شده توسط ویروس کرونا توسط اینترنت: 6 مرحله
دزدگیر کنترل شده از طریق ویروس کرونا توسط اینترنت: بیایید به طور جمعی با زدن سیلی به ویروس کرونا از طریق اینترنت ، ناامیدی های خود را تخلیه کنیم! فقط برای واضح تر نشان دادن این پروژه به منظور تسکین طنز در این دوران است ، به این معنی نیست که از شدت آن غافل نشوید. وضعیت فعلی
ESP8266 RGB LED STRIP WIFI کنترل - NODEMCU به عنوان یک کنترل از راه دور IR برای نوار LED کنترل شده بر روی Wifi - کنترل تلفن هوشمند RGB LED STRIP: 4 مرحله
ESP8266 RGB LED STRIP WIFI کنترل | NODEMCU به عنوان یک کنترل از راه دور IR برای نوار LED کنترل شده بر روی Wifi | RGB LED STRIP Smartphone Control: سلام بچه ها در این آموزش می آموزیم که چگونه از nodemcu یا esp8266 به عنوان ریموت IR برای کنترل نوار LED RGB استفاده کنید و Nodemcu توسط تلفن هوشمند از طریق وای فای کنترل می شود. بنابراین اساساً می توانید RGB LED STRIP را با تلفن هوشمند خود کنترل کنید
قهوه سوخاری DIY کنترل شده توسط آردوینو: 13 مرحله (همراه با تصاویر)
قهوه بری DIY کنترل شده توسط آردوینو: در این دستورالعمل نگاهی خواهیم داشت به اصلاح یک دستگاه پاپ کورن هوای گرم تا آن را به یک قهوه ساز خانگی تمام اتوماتیک و کنترل دما تبدیل کند. پخت قهوه در خانه به طرز شگفت آوری ساده است و حتی چیزی به اندازه سرخ کردن
سبد خرید هوشمند کنترل شده توسط تلفن هوشمند: 7 مرحله
سبد خرید هوشمند کنترل شده توسط تلفن های هوشمند: بازدید از مراکز تجاری می تواند سرگرم کننده باشد. اما کشیدن سبد خرید همراه با پر کردن آن چیزی است که کاملاً آزاردهنده است. درد هل دادن آن در آن راهروهای باریک ، ایجاد آن پیچ های تند! بنابراین ، در اینجا (به نوعی) پیشنهادی است که می توانید