Πίνακας περιεχομένων:
- Προμήθειες
- Βήμα 1: Επιλογή εξοπλισμού
- Βήμα 2: Σχεδιασμός του συστήματος
- Βήμα 3: Χειρισμός καταστάσεων έκτακτης ανάγκης
- Βήμα 4: Εκτέλεση του συστήματος 24/7
- Βήμα 5: Παρακολούθηση νέφους
- Βήμα 6: Λειτουργεί
Βίντεο: Αντλία Smart Coffee Machine Controlled by Raspberry Pi & HC-SR04 Ultrasonic Sensor and Cloud4RPi: 6 Steps
2024 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2024-01-30 08:34
Θεωρητικά, κάθε φορά που πηγαίνετε στην καφετιέρα για το πρωινό σας φλιτζάνι, υπάρχει μόνο μία στις είκοσι πιθανότητες να γεμίσετε τη δεξαμενή νερού. Στην πράξη, ωστόσο, φαίνεται ότι το μηχάνημα βρίσκει με κάποιο τρόπο τον τρόπο να σας βάζει πάντα αυτήν την αγγαρεία. Όσο περισσότερο θέλετε καφέ, τόσο πιο πιθανό είναι να λάβετε το επίφοβο μήνυμα «γεμίστε τη δεξαμενή νερού». Οι συνάδελφοί μου αισθάνονται το ίδιο για αυτό. Όντας οι σπασίκλες που είμαστε, αποφασίσαμε να εφαρμόσουμε την τεχνολογία που θα έθετε τέλος σε αυτό.
Προμήθειες
Ο εξοπλισμός μας
Έχουμε μια μηχανή καφέ SAECO Aulika Focus. Μέχρι σήμερα, χρησιμοποιούσαμε μια αντλία χειρός για να γεμίσουμε τη δεξαμενή νερού του μηχανήματος από μια τυπική φιάλη νερού 5 γαλόνια (19L).
Οι Στόχοι μας
- Χρησιμοποιήστε μια ηλεκτρική αντλία που οδηγείται από κάποιο είδος ελεγκτή ή μικροϋπολογιστή μέσω ρελέ.
- Έχετε έναν τρόπο να μετρήσετε τη στάθμη του νερού στη δεξαμενή της καφετιέρας, ώστε το σύστημά μας να ξέρει πότε να το ξαναγεμίσει.
- Διαθέτει μέσα για τον έλεγχο του συστήματος, κατά προτίμηση σε πραγματικό χρόνο από κινητή συσκευή.
- Λάβετε ειδοποιήσεις (μέσω του 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
Ο κωδικός στη συσκευή έχει εντοπιστεί σφάλματα και λειτουργεί χωρίς προβλήματα. Το ξεκινήσαμε ως υπηρεσία, οπότε επανεκκινείται εάν γίνει επανεκκίνηση του 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: Λειτουργεί
Δουλεύει! Ο πίνακας ελέγχου στο σύνολό του φαίνεται όπως φαίνεται παρακάτω.
Επί του παρόντος, η αυτόματη αντλία μας λειτουργεί εδώ και αρκετές εβδομάδες και το μόνο που χρειαζόταν να κάνουμε είναι να αντικαταστήσουμε τα μπουκάλια νερού. Ο πλήρης κωδικός για το έργο μας είναι διαθέσιμος στο αποθετήριο GitHub.
Συνιστάται:
DIY περισταλτική αντλία: 5 βήματα (με εικόνες)
DIY περισταλτική αντλία: Σε αυτό το έργο θα ρίξουμε μια ματιά στις περισταλτικές αντλίες και θα μάθουμε αν έχει νόημα να κάνουμε DIY τη δική μας έκδοση ή αν πρέπει απλώς να παραμείνουμε στην εμπορική επιλογή αγοράς. Στην πορεία θα δημιουργήσουμε ένα στέρνο οδηγού stepper
Alexa Voice Controlled Raspberry Pi Drone With IoT and AWS: 6 Steps (with Pictures)
Alexa Voice Controlled Raspberry Pi Drone With IoT and AWS: Γεια! Με λένε Αρμάαν. Είμαι ένα αγόρι 13 ετών από τη Μασαχουσέτη. Αυτό το σεμινάριο δείχνει, όπως μπορείτε να συμπεράνετε από τον τίτλο, πώς να φτιάξετε ένα Raspberry Pi Drone. Αυτό το πρωτότυπο καταδεικνύει τον τρόπο με τον οποίο εξελίσσονται τα drones και επίσης πόσο μεγάλο ρόλο μπορούν να παίξουν στην
Hardware and Software Hack Smart Devices, Tuya and Broadlink LEDbulb, Sonoff, BSD33 Smart Plug: 7 Βήματα
Hardware and Software Hack Smart Devices, Tuya and Broadlink LEDbulb, Sonoff, BSD33 Smart Plug: Σε αυτό το Instructable σας δείχνω πώς έλαμψα αρκετές έξυπνες συσκευές με το δικό μου υλικολογισμικό, ώστε να μπορώ να τις ελέγχω με MQTT μέσω της ρύθμισης Openhab. Θα προσθέσω νέες συσκευές όταν τις χάκαρα. Φυσικά υπάρχουν και άλλες μέθοδοι που βασίζονται σε λογισμικό για να αναβοσβήνει η προσαρμοσμένη
Μαγνητικά συνδεδεμένη αντλία νερού: 10 βήματα (με εικόνες)
Μαγνητικά συνδεδεμένη αντλία νερού: Σε αυτό το ΟΔΗΓΙΟ θα εξηγήσω πώς έφτιαξα μια αντλία νερού με μαγνητική σύζευξη. Σε αυτήν την αντλία νερού δεν υπάρχει μηχανική σύνδεση μεταξύ της πτερωτής και του άξονα του ηλεκτροκινητήρα που την κάνει να λειτουργεί. Πώς όμως επιτυγχάνεται αυτό και
Ultimate Dry Ice Fog Machine - Bluetooth Controlled, Battery Powered and 3D Printed .: 22 Steps (with Pictures)
Ultimate Dry Ice Fog Machine - Bluetooth Controlled, Battery Powered and 3D Printed: Χρειάστηκα πρόσφατα μια μηχανή Dry Ice για κάποια θεατρικά εφέ για μια τοπική παράσταση. Ο προϋπολογισμός μας δεν θα επεκταθεί στην πρόσληψη σε επαγγελματία, οπότε αυτό είναι που έφτιαξα. Είναι κυρίως τρισδιάστατη εκτύπωση, που ελέγχεται εξ αποστάσεως μέσω bluetooth, μπαταρία