Πίνακας περιεχομένων:

Αντλία Smart Coffee Machine Controlled by Raspberry Pi & HC-SR04 Ultrasonic Sensor and Cloud4RPi: 6 Steps
Αντλία Smart Coffee Machine Controlled by Raspberry Pi & HC-SR04 Ultrasonic Sensor and Cloud4RPi: 6 Steps

Βίντεο: Αντλία Smart Coffee Machine Controlled by Raspberry Pi & HC-SR04 Ultrasonic Sensor and Cloud4RPi: 6 Steps

Βίντεο: Αντλία Smart Coffee Machine Controlled by Raspberry Pi & HC-SR04 Ultrasonic Sensor and Cloud4RPi: 6 Steps
Βίντεο: Smart Coffee Machine Pump Controlled by Raspberry Pi & HC-SR04 Ultrasonic Sensor 2024, Νοέμβριος
Anonim
Έξυπνη αντλία μηχανής καφέ Ελεγχόμενη από Raspberry Pi & HC-SR04 Ultrasonic Sensor and Cloud4RPi
Έξυπνη αντλία μηχανής καφέ Ελεγχόμενη από Raspberry Pi & HC-SR04 Ultrasonic Sensor and Cloud4RPi

Θεωρητικά, κάθε φορά που πηγαίνετε στην καφετιέρα για το πρωινό σας φλιτζάνι, υπάρχει μόνο μία στις είκοσι πιθανότητες να γεμίσετε τη δεξαμενή νερού. Στην πράξη, ωστόσο, φαίνεται ότι το μηχάνημα βρίσκει με κάποιο τρόπο τον τρόπο να σας βάζει πάντα αυτήν την αγγαρεία. Όσο περισσότερο θέλετε καφέ, τόσο πιο πιθανό είναι να λάβετε το επίφοβο μήνυμα «γεμίστε τη δεξαμενή νερού». Οι συνάδελφοί μου αισθάνονται το ίδιο για αυτό. Όντας οι σπασίκλες που είμαστε, αποφασίσαμε να εφαρμόσουμε την τεχνολογία που θα έθετε τέλος σε αυτό.

Προμήθειες

Ο εξοπλισμός μας

Έχουμε μια μηχανή καφέ SAECO Aulika Focus. Μέχρι σήμερα, χρησιμοποιούσαμε μια αντλία χειρός για να γεμίσουμε τη δεξαμενή νερού του μηχανήματος από μια τυπική φιάλη νερού 5 γαλόνια (19L).

Οι Στόχοι μας

  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.

Πώς ελέγχουμε τη στάθμη του νερού

Itταν σημαντικό για εμάς να μην αλλάξουμε την κατασκευή της καφετιέρας, οπότε αποφασίσαμε να χρησιμοποιήσουμε τον αισθητήρα εγγύτητας υπερήχων HC-SR04 για τη μέτρηση της στάθμης του νερού.

Εκτυπώσαμε τρισδιάστατα ένα προσαρμοσμένο κάλυμμα δεξαμενής νερού με δύο οπές για τους εκπομπούς του αισθητήρα. Βρήκαμε εύκολα μια βιβλιοθήκη GitHub για τον αισθητήρα. Σε αυτό το σημείο ολοκληρώθηκαν όλες οι προετοιμασίες.

Βήμα 2: Σχεδιασμός του συστήματος

Σχεδιασμός του Συστήματος
Σχεδιασμός του Συστήματος
Σχεδιασμός του Συστήματος
Σχεδιασμός του Συστήματος

Λογική συστήματος

Το σύστημα έχει σχεδιαστεί με βάση την ακόλουθη απλή λογική:

  • Το σύστημα παρακολουθεί συνεχώς την απόσταση μεταξύ του αισθητήρα και της επιφάνειας του νερού.
  • Κάθε φορά που μια αλλαγή στην απόσταση υπερβαίνει μια τιμή κατωφλίου, το σύστημα στέλνει πληροφορίες σχετικά με την κατάστασή του στο σύννεφο.
  • Εάν η απόσταση υπερβεί τη μέγιστη επιτρεπόμενη τιμή (η δεξαμενή είναι άδεια), το σύστημα ενεργοποιεί την αντλία και την απενεργοποιεί μόλις η απόσταση είναι μικρότερη από την ελάχιστη επιτρεπόμενη τιμή.
  • Κάθε φορά που αλλάζει η κατάσταση του συστήματος (για παράδειγμα, η αντλία ενεργοποιείται), ενημερώνει το σύννεφο.

Σε περίπτωση σφάλματος, μια ειδοποίηση αποστέλλεται σε ένα κανάλι Slack.

Όταν η καφετιέρα είναι αδρανής, το σύστημα σαρώνει την υπηρεσία cloud με διαγνωστικά δεδομένα μία φορά κάθε λεπτό. Επιπλέον, στέλνει την κατάστασή του στο σύννεφο κάθε 5 λεπτά.

Όταν η αντλία είναι ενεργή, το σύστημα στέλνει δεδομένα πιο συχνά αλλά όχι περισσότερο από μία φορά κάθε μισό δευτερόλεπτο.

def send (σύννεφο, μεταβλητές, dist, error_code = 0, force = False): pump_on = is_pump_on () ποσοστά = calc_water_level_percent (dist) μεταβλητές ['Distance'] ['value'] = dist μεταβλητές ['WaterLevel'] [' αξία '] = τοις εκατό μεταβλητές [' PumpRelay '] [' value '] = pump_on μεταβλητές [' Status '] [' value '] = calc_status (κωδικός σφάλματος, ποσοστό, pump_on)

ρεύμα = χρόνος ()

καθολική last_sending_time αν είναι δύναμη ή τρέχουσα - last_sending_time> MIN_SEND_INTERVAL: readings = cloud.read_data () cloud.publish_data (readings) last_sending_time = current

Συνεργασία με την αντλία

Ορίζουμε τις ακόλουθες σταθερές ως βάση για τη λογική λειτουργίας της αντλίας.

# Καρφίτσες 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): καθολική pump_on pump_on = GPIO.input (GPIO_PUMP) log_debug ("Ο ρελέ αντλίας άλλαξε σε % d" % pump_on)

Στην επανάκληση, αποθηκεύουμε την τρέχουσα κατάσταση της αντλίας σε μια μεταβλητή. Στον κύριο βρόχο της εφαρμογής, μπορούμε να εντοπίσουμε τη στιγμή που η αντλία αλλάζει όπως φαίνεται παρακάτω:

def is_pump_on (): global pump_on return pump_on

αν GPIO.event_detected (GPIO_PUMP):

is_pouring = is_pump_on () #… log_debug ('[!] Εντοπίστηκε συμβάν αντλίας: % s' % ('On' if is_pouring else 'Off')) αποστολή (σύννεφο, μεταβλητές, απόσταση, δύναμη = True)

Μέτρηση της Απόστασης

Είναι πολύ εύκολο να μετρήσετε την απόσταση προς την επιφάνεια του νερού χρησιμοποιώντας έναν υπερηχητικό αισθητήρα εγγύτητας. Στο αποθετήριο μας, μοιραστήκαμε δύο σενάρια python που σας επιτρέπουν να δοκιμάσετε έναν αισθητήρα.

Σε πραγματικές εφαρμογές, οι ενδείξεις των αισθητήρων μπορεί να παρουσιάζουν διακυμάνσεις λόγω της επίδρασης του αισθητήρα και των ταλαντώσεων του νερού. Σε ορισμένες περιπτώσεις, οι ενδείξεις μπορεί να λείπουν εντελώς. Εφαρμόσαμε μια κλάση BounceFilter που συγκεντρώνει Ν πρόσφατες τιμές, απορρίπτει κορυφές και υπολογίζει τον μέσο όρο των υπολειπόμενων μετρήσεων. Η διαδικασία μέτρησης υλοποιείται με τον ακόλουθο ασύγχρονο αλγόριθμο.

# Διατηρεί τις τελευταίες μετρήσεις αισθητήρων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 ()

αν δεν διαβάζετε_συμπλήρωσε. περιμένετε (MAX_READING_TIMEOUT):

log_info («Χρονικό όριο ανάγνωσης αισθητήρα») επιστροφή Καμία επιστροφή ανάγνωσης.avg ()

def read_distance ():

δοκιμάστε: value = hcsr04.raw_distance (sample_size = 5) στρογγυλοποιημένη = τιμή αν η τιμή δεν είναι Κανένα άλλο στρογγυλό (τιμή, 1) readings.add (στρογγυλεμένο) εκτός Εξαίρεση ως σφάλμα: log_error ('Εσωτερικό σφάλμα: % s' % λάθος) τελικά: read_complete.set ()

Μπορείτε να βρείτε την πλήρη εφαρμογή του φίλτρου στις πηγές.

Βήμα 3: Χειρισμός καταστάσεων έκτακτης ανάγκης

Χειρισμός καταστάσεων έκτακτης ανάγκης
Χειρισμός καταστάσεων έκτακτης ανάγκης
Χειρισμός καταστάσεων έκτακτης ανάγκης
Χειρισμός καταστάσεων έκτακτης ανάγκης
Χειρισμός καταστάσεων έκτακτης ανάγκης
Χειρισμός καταστάσεων έκτακτης ανάγκης

Τι γίνεται αν ο αισθητήρας κάηκε ή έπεσε ή δείχνει λάθος περιοχή; Χρειαζόμασταν έναν τρόπο για να αναφέρουμε τέτοιες περιπτώσεις, ώστε να μπορέσουμε να αναλάβουμε χειρωνακτικές ενέργειες.

Εάν ο αισθητήρας δεν παρέχει μετρήσεις απόστασης, το σύστημα στέλνει την αλλαγή της κατάστασης στο σύννεφο και παράγει μια αντίστοιχη ειδοποίηση.

Η λογική απεικονίζεται με τον παρακάτω κώδικα.

απόσταση = αναμονή_απόστασης () # Διαβάστε το τρέχον βάθος νερού εάν η απόσταση δεν είναι: 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' % απόσταση) συνεχίζεται

Απενεργοποιούμε την αντλία εάν ήταν ενεργή όταν παρουσιάστηκε σφάλμα.

εάν είναι_pump_on () και prev_distance <STOP_PUMP_DISTANCE + DISTANCE_DELTA: log_error ('[!] Διακοπή έκτακτης ανάγκης της αντλίας. Κανένα σήμα από αισθητήρα απόστασης')

εναλλαγή_αντλίας (STOP_PUMP)

Επεξεργαζόμαστε επίσης την περίπτωση όταν το μπουκάλι τελειώσει με νερό. Ελέγχουμε εάν η στάθμη του νερού δεν αλλάζει όταν λειτουργεί η αντλία. Εάν ναι, το σύστημα περιμένει για 5 δευτερόλεπτα και στη συνέχεια ελέγχει εάν η αντλία έχει απενεργοποιηθεί. Εάν δεν έχει, τότε το σύστημα υλοποιεί διακοπή λειτουργίας της αντλίας έκτακτης ανάγκης και στέλνει ειδοποίηση σφάλματος.

PUMP_STOP_TIMEOUT = 5 # secsemergency_stop_time = Κανένα

def set_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_emergency_stop_time (now, is_pouring) #…

καθολική αντλία_ απενεργοποιημένη

εάν check_water_source_empty (τώρα): log_error ('[!] Διακοπή έκτακτης ανάγκης της αντλίας. / Η πηγή νερού είναι κενή') toggle_pump (STOP_PUMP) pump_disabled = True

Πιο πάνω είναι ένα παράδειγμα καταγραφής μηνυμάτων που δημιουργήθηκε κατά τη διάρκεια διακοπής έκτακτης ανάγκης.

Βήμα 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 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 για την εφαρμογή ενός πίνακα ελέγχου. Προσθέσαμε πρώτα widget για να υποδείξουμε τις βασικές παραμέτρους του συστήματος.

Παρεμπιπτόντως, το γραφικό στοιχείο για τη μεταβλητή STATUS μπορεί να χρησιμοποιεί διαφορετικά χρώματα με βάση την τιμή του (δείτε την παραπάνω εικόνα).

Προσθέσαμε ένα γραφικό στοιχείο γραφικών για την εμφάνιση δυναμικών δεδομένων. Στην παρακάτω εικόνα μπορείτε να δείτε τη στιγμή που η αντλία ενεργοποιήθηκε και απενεργοποιήθηκε και τα αντίστοιχα επίπεδα νερού.

Αν αναλύσετε μεγαλύτερο χρονικό διάστημα, μπορείτε να δείτε κορυφές - τότε ήταν που λειτουργούσε η αντλία.

Το Cloud4RPi σας επιτρέπει επίσης να ορίσετε διαφορετικά επίπεδα εξομάλυνσης.

Βήμα 6: Λειτουργεί

Image
Image

Δουλεύει! Ο πίνακας ελέγχου στο σύνολό του φαίνεται όπως φαίνεται παρακάτω.

Επί του παρόντος, η αυτόματη αντλία μας λειτουργεί εδώ και αρκετές εβδομάδες και το μόνο που χρειαζόταν να κάνουμε είναι να αντικαταστήσουμε τα μπουκάλια νερού. Ο πλήρης κωδικός για το έργο μας είναι διαθέσιμος στο αποθετήριο GitHub.

Συνιστάται: