תוכן עניינים:

משאבת מכונת קפה חכמה הנשלטת על ידי Raspberry Pi ו- HC-SR04 חיישן אולטרסאונד ו- Cloud4RPi: 6 שלבים
משאבת מכונת קפה חכמה הנשלטת על ידי Raspberry Pi ו- HC-SR04 חיישן אולטרסאונד ו- Cloud4RPi: 6 שלבים

וִידֵאוֹ: משאבת מכונת קפה חכמה הנשלטת על ידי Raspberry Pi ו- HC-SR04 חיישן אולטרסאונד ו- Cloud4RPi: 6 שלבים

וִידֵאוֹ: משאבת מכונת קפה חכמה הנשלטת על ידי Raspberry Pi ו- HC-SR04 חיישן אולטרסאונד ו- Cloud4RPi: 6 שלבים
וִידֵאוֹ: Part 3 - The House of the Seven Gables Audiobook by Nathaniel Hawthorne (Chs 8-11) 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) המתאים לזרם חילופין. הממסר מחבר את המשאבה לשקע ונשלט על ידי הפין הדיגיטלי של הפטל פטל.

כיצד אנו בודקים את מפלס המים

היה חשוב לנו לא לשנות את מבנה מכונת הקפה, ולכן החלטנו להשתמש בחיישן הקרבה האולטראסוני HC-SR04 למדידת מפלס המים.

הדפסנו תלת מימד מכסה של מיכל מים מותאם אישית עם שני חורים עבור פולט החיישן. מצאנו בקלות ספריית GitHub לחיישן. בשלב זה כל ההכנות הסתיימו.

שלב 2: תכנון המערכת

תכנון המערכת
תכנון המערכת
תכנון המערכת
תכנון המערכת

ההיגיון של המערכת

המערכת מתוכננת תוך מחשבה על ההיגיון הפשוט הבא:

  • המערכת עוקבת כל הזמן אחר המרחק בין החיישן למשטח המים.
  • בכל פעם ששינוי המרחק חורג מערך הסף, המערכת שולחת מידע על מצבה לענן.
  • אם המרחק חורג מהערך המרבי המותר (המיכל ריק), המערכת מפעילה את המשאבה ומכבה אותה ברגע שהמרחק קטן מהערך המינימלי המותר.
  • בכל פעם שמצב המערכת משתנה (למשל, המשאבה מופעלת), היא מודיעה לענן.

במקרה של שגיאה, הודעה נשלחת לערוץ Slack.

כאשר מכונת הקפה לא פעילה, המערכת מצרפת את שירות הענן עם נתוני אבחון אחת לדקה. בנוסף, הוא שולח את מצבו לענן כל 5 דקות.

כאשר המשאבה פעילה, המערכת שולחת נתונים בתדירות גבוהה יותר אך לא יותר מפעם אחת בכל חצי שנייה.

שלח def (ענן, משתנים, dist, error_code = 0, force = False): pump_on = is_pump_on () אחוזים = calc_water_level_percent (dist) משתנים ['Distance'] ['value'] = dist משתנים ['WaterLevel'] [' ערך '] = משתני אחוזים [' PumpRelay '] [' value '] = משתנים_משאבה [' סטטוס '] [' ערך '] = calc_status (קוד שגיאה, אחוז, pump_on)

הנוכחי = זמן ()

זמן אחרון_שלוח_עולמי עולמי אם כוח או נוכחי - אחרון_שלוח_זמן> MIN_SEND_INTERVAL: קריאות = ענן.קריא_דאטה () ענן.פרסום_דאטה (קריאות) אחרון_שלוח_זמן = נוכחי

עבודה עם המשאבה

אנו מגדירים את הקבועים הבאים כבסיס להיגיון פעולת המשאבה.

# סיכות GPIO (BCM) GPIO_PUMP = 4 GPIO_TRIGGER = 17 GPIO_ECHO = 27

# משאבה

START_PUMP = STOP_PUMP = 1 PUMP_BOUNCE_TIME = 50 # אלפיות השנייה PUMP_STOP_TIMEOUT = 5 # שניות

חשוב: אם אתה מתכוון להשתמש בפין 4, אל תשכח לבטל את האפשרות 1-Wire raspi-config כדי למנוע התנגשויות.

בעת הפעלת התוכנית, אנו רושמים התקשרות חזרה ומגדירים את המצב ההתחלתי כבוי.

להלן הקוד לפונקציה המחליפה את המשאבה:

def toggle_pump (ערך): אם pump_disabled: return if is_pump_on ()! = value: log_debug ("[x] % s" % ('START' אם ערך אחר 'STOP')) GPIO.setup (GPIO_PUMP, GPIO. OUT) פלט GPIO.output (GPIO_PUMP, ערך) # התחל/הפסק לשפוך

כפי שהוגדר בקוד ההפעלה למעלה, כאשר הממסר מופעל, החזרה הבאה נקראת:

pump_on = שגיאה שגויה 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' % ('On' אם is_pouring אחר 'כבוי')) שלח (ענן, משתנים, מרחק, כוח = נכון)

מדידת המרחק

די קל למדוד את המרחק לעבר פני המים באמצעות חיישן קרבה קולי. במאגר שלנו שיתפנו כמה סקריפטים של פייתון המאפשרים לך לבדוק חיישן.

ביישומים אמיתיים, קריאות החיישנים יכולות להשתנות בגלל האפקט הקופצני של החיישן ותנודות המים. במקרים מסוימים, הקריאות עלולות להיות חסרות לחלוטין. יישמנו מחלקה 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 ()

אם לא קריאת_השלמה.המתנה (MAX_READING_TIMEOUT):

log_info ('פסק זמן של חיישן קריאה') החזרה ללא החזרה קריאות. avg ()

def read_distance ():

נסה: value = hcsr04.raw_distance (sample_size = 5) מעוגל = ערך אם הערך הוא אף אחד אחר עגול (ערך, 1) קריאות. מוסיף (מעוגל) למעט חריגה כשגיאה: log_error ('שגיאה פנימית: % s' % שגיאה) סוף סוף: reading_complete.set ()

אתה יכול למצוא את היישום המלא של המסנן במקורות.

שלב 3: טיפול במצבי חירום

טיפול במצבי חירום
טיפול במצבי חירום
טיפול במצבי חירום
טיפול במצבי חירום
טיפול במצבי חירום
טיפול במצבי חירום

מה אם החיישן נשרף, או נופל או מצביע על אזור שגוי? היינו צריכים דרך לדווח על מקרים כאלה כדי שנוכל לנקוט פעולה ידנית.

אם החיישן אינו מסוגל לספק קריאות מרחק, המערכת שולחת את הסטטוס שהשתנה לענן ומייצרת הודעה מתאימה.

ההיגיון מודגם על ידי הקוד שלהלן.

distance = wait_for_distance () # קרא את עומק המים הנוכחי אם המרחק הוא ללא: log_error ('error distance!') notify_in_background (calc_alert (SENSOR_ERROR)) send (ענן, משתנים, מרחק, error_code = SENSOR_ERROR, force = True)

יש לנו טווח מפלס מים תפעולי שצריך לשמור עליו כשהחיישן במקומו. אנו בודקים אם מפלס המים הנוכחי נופל בטווח זה:

# מרחק מהחיישן למפלס המים # מבוסס על מיכל המים של מכונת הקפה MIN_DISTANCE = 2 # cm MAX_DISTANCE = 8 # cm

# המרחק הוא מחוץ לטווח הצפוי: אין להתחיל לשפוך

אם המרחק> MAX_DISTANCE * 2: log_error ('המרחק הוא מחוץ לטווח: המרחק %.2f' %) המשך

אנו מכבים את המשאבה אם היא הייתה פעילה כאשר אירעה שגיאה.

if is_pump_on () ו- dist_distance <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('[!] עצירת חירום של המשאבה. אין אות מחיישן מרחק')

משאבת החלפה (STOP_PUMP)

אנו מעבדים את התיק גם כאשר לבקבוק נגמרים המים. אנו בודקים אם מפלס המים אינו משתנה כאשר המשאבה פועלת. אם כן, המערכת ממתינה 5 שניות ולאחר מכן בודקת אם המשאבה כבויה. אם לא, המערכת מיישמת כיבוי משאבת חירום ושולחת הודעת שגיאה.

PUMP_STOP_TIMEOUT = 5 # secsemergency_stop_time = אין

def set_emergency_stop_time (עכשיו, is_pouring):

global emergency_stop_time emergency_stop_time = עכשיו + PUMP_STOP_TIMEOUT אם / is_ זרימה אחרת אין

def check_water_source_empty (עכשיו):

החזר שעת חירום_עצירה ועכשיו> שעת חירום_זמן

# --------- לולאה ראשית -----------

אם GPIO.event_detected (GPIO_PUMP): is_pouring = is_pump_on () set_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 המסייע בפריסה, הפעלת השירות וצפייה ביומנים.

.פוני: התקן יומן סטטוס הפעלה התחלה עצור פריסה MAIN_FILE: = קפה-משאבה/main.py SERVICE_INSTALL_SCRIPT: = service_install.sh SERVICE_NAME: = קפה-משאבה.שירות

להתקין:

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)

עֵץ:

sudo journalctl -u קפה -משאבה -מאז היום

לפרוס:

rsync -av הגדרת חיישן משאבת קפה Makefile *.sh pi@XX. XX. XXX. XXX: ~/

תוכל למצוא את הקובץ הזה ואת כל הסקריפטים הנדרשים במאגר שלנו.

שלב 5: ניטור ענן

ניטור ענן
ניטור ענן
ניטור ענן
ניטור ענן
ניטור ענן
ניטור ענן
ניטור ענן
ניטור ענן

השתמשנו ב- Cloud4RPi ליישום לוח בקרה. תחילה הוספנו ווידג'טים לציון הפרמטרים החיוניים של המערכות.

אגב, הווידג'ט למשתנה STATUS יכול להשתמש בסכמות צבע שונות בהתבסס על הערך שלו (ראו את התמונה למעלה).

הוספנו ווידג'ט תרשים להצגת נתונים דינאמיים. בתמונה למטה ניתן לראות את הרגע שבו המשאבה מופעלת וכיבוי ורמות המים בהתאמה.

אם תנתח טווח זמן ארוך יותר, תוכל לראות פסגות - זה היה הזמן שבו המשאבה פעלה.

Cloud4RPi גם מאפשר לך להגדיר רמות החלקה שונות.

שלב 6: זה עובד

Image
Image

זה עובד! לוח הבקרה בשלמותו נראה כפי שמוצג להלן.

נכון לעכשיו, המשאבה האוטומטית שלנו פועלת כבר מספר שבועות וכל שעלינו לעשות הוא להחליף בקבוקי מים. הקוד המלא לפרויקט שלנו זמין במאגר GitHub שלנו.

מוּמלָץ: