Arduino καθυστέρηση Λειτουργία, και γιατί δεν πρέπει να το χρησιμοποιήσετε

Ενώ η καθυστέρηση () είναι βολική για βασικές διαδηλώσεις για το πώς λειτουργεί το Arduino, πραγματικά δεν πρέπει να το χρησιμοποιείτε στον πραγματικό κόσμο. Εδώ γιατί και τι πρέπει να χρησιμοποιήσετε αντ 'αυτού.

Ενώ η καθυστέρηση () είναι βολική για βασικές διαδηλώσεις για το πώς λειτουργεί το Arduino, πραγματικά δεν πρέπει να το χρησιμοποιείτε στον πραγματικό κόσμο.  Εδώ γιατί και τι πρέπει να χρησιμοποιήσετε αντ 'αυτού.
Διαφήμιση

Όταν ξεκινήσατε να μαθαίνετε πώς να αναπτύξετε Ξεκινώντας με το Arduino: Οδηγός για αρχάριους Ξεκινώντας με το Arduino: Ένας οδηγός για αρχάριους Το Arduino είναι μια πλατφόρμα πρωτοτύπου ηλεκτρονικών ανοικτών πηγών βασισμένη σε ευέλικτο και εύχρηστο υλικό και λογισμικό. Πρόκειται για καλλιτέχνες, σχεδιαστές, χομπίστες και όσους ενδιαφέρονται να δημιουργήσουν διαδραστικά αντικείμενα ή περιβάλλοντα. Διαβάστε περισσότερα για το Arduino Τι είναι το Arduino και τι μπορείτε να κάνετε με αυτό; Τι είναι το Arduino και τι μπορείτε να κάνετε με αυτό; Το Arduino είναι μια αξιοσημείωτη μικρή ηλεκτρονική συσκευή, αλλά αν δεν έχετε χρησιμοποιήσει ποτέ πριν, τι ακριβώς είναι και τι μπορείτε να κάνετε με ένα; Διαβάστε περισσότερα, ίσως χτίστηκε ένα προϊόν που λειτουργεί λίγο σαν αυτό:

Συνδεδεμένο με το Arduino σας θα είναι ένα ενιαίο φως LED. Αυτό θα σβήσει και θα σβήσει κάθε δευτερόλεπτο, και θα συνεχιστεί έως ότου απενεργοποιηθεί το Arduino. Πρόκειται για το πρόγραμμα "Hello World" του Arduino, και απεικονίζει τέλεια πώς μόνο μερικές γραμμές κώδικα μπορούν να δημιουργήσουν κάτι απτό.

οδήγησε αρδουνο

Είμαι επίσης πρόθυμος να στοιχηματίσετε ότι χρησιμοποιήσατε τη λειτουργία καθυστέρησης () για να ορίσετε τα χρονικά διαστήματα μεταξύ της ενεργοποίησης και απενεργοποίησης του φωτός. Αλλά εδώ είναι το πράγμα: ενώ η καθυστέρηση είναι βολική για βασικές διαδηλώσεις για το πώς λειτουργεί το Arduino, πραγματικά δεν πρέπει να το χρησιμοποιείτε στον πραγματικό κόσμο. Εδώ γιατί - και τι πρέπει να χρησιμοποιήσετε αντ 'αυτού.

Πώς λειτουργεί καθυστέρηση ()

Ο τρόπος λειτουργίας της λειτουργίας καθυστέρησης () είναι πολύ απλός. Δεσμεύει ένα ενιαίο ακέραιο Τα βασικά του προγραμματισμού υπολογιστών 101 - Μεταβλητές και τύποι δεδομένων Τα βασικά του προγραμματισμού υπολογιστών 101 - Μεταβλητές και τύποι δεδομένων Έχοντας εισαγάγει και μίλησε λίγο για τον αντικειμενοστραφή προγραμματισμό πριν και από πού προέρχεται το ομώνυμο, νόμιζα ότι ήρθε η ώρα να περάσουμε τα απόλυτα βασικά του προγραμματισμού με έναν μη γλωσσικό ειδικό τρόπο. Αυτό το ... Διαβάστε περισσότερα (ή αριθμός) επιχείρημα. Αυτός ο αριθμός αντιπροσωπεύει το χρόνο (μετρούμενο σε χιλιοστά του δευτερολέπτου), το πρόγραμμα πρέπει να περιμένει μέχρι να μεταβεί στην επόμενη γραμμή κώδικα.

Αλλά το πρόβλημα είναι ότι η λειτουργία καθυστέρησης () δεν είναι ένας καλός τρόπος για να κάνετε το πρόγραμμα σας να περιμένει, επειδή είναι αυτό που είναι γνωστό ως λειτουργία "αποκλεισμού".

Η διαφορά μεταξύ των λειτουργιών αποκλεισμού και μη αποκλεισμού

Για να καταδείξουμε γιατί οι λειτουργίες αποκλεισμού είναι κακές, θέλω να φανταστείτε δύο διαφορετικούς σεφ σε μια κουζίνα: Henry Blocking και Eduardo NonBlocking . Και οι δύο κάνουν την ίδια δουλειά, αλλά με άκρως διαφορετικούς τρόπους.

Όταν ο Henry κάνει το πρωινό, αρχίζει τοποθετώντας δύο στροφές ψωμιού στη φρυγανιέρα. Όταν τελικά πίνει, και το ψωμί βγαίνει από το χρυσό καφέ, ο Χένρι το βάζει σε ένα πιάτο και σπάει δύο αυγά σε ένα τηγάνι. Και πάλι, στέκεται δίπλα στο πετρέλαιο και τα ασπράδια αρχίζουν να σκληρύνουν. Όταν τελειώσουν, τα πιάζει και ξεκινά τηγανίζοντας δύο βούρτσες του μπέικον. Αφού είναι αρκετά τραγανό, τα βγάζει από το τηγάνι, τα βάζει στο πιάτο και αρχίζει να τρώει.

arduino-chef

Ο Eduardo λειτουργεί με έναν ελαφρώς διαφορετικό τρόπο. Ενώ το ψωμί του φρυγανίζει, έχει ήδη αρχίσει να τηγανίζει τα αυγά και το μπέικον του. Αντί να περιμένει κανείς ένα αντικείμενο να τελειώσει το μαγείρεμα πριν μετακινηθεί στην επόμενη, μαγειρεύει ταυτόχρονα πολλά αντικείμενα. Το τελικό αποτέλεσμα είναι ότι ο Eduardo παίρνει λιγότερο χρόνο για να κάνει το πρωινό από ό, τι ο Henry κάνει - και από τη στιγμή που τελειώνει ο Henry Blocking, το τοστ και τα αυγά έχουν κρυώσει.

Είναι μια ανόητη αναλογία, αλλά δείχνει το σημείο.

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

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

Ευτυχώς, η καθυστέρηση () δεν είναι ο μόνος τρόπος για να κάνετε το πρόγραμμά σας να περιμένει κατά την κωδικοποίηση για το Arduino.

Meet Millis ()

Η λειτουργία millis () εκτελεί μία μόνο εργασία. Όταν καλείται, επιστρέφει (ως μακρύ τύπο δεδομένων) τον αριθμό των χιλιοστών του δευτερολέπτου που έχουν παρέλθει από την πρώτη εκκίνηση του προγράμματος. Λοιπόν, γιατί είναι χρήσιμο;

Επειδή με τη χρήση λίγων απλών μαθηματικών, μπορείτε εύκολα να "χρονομετρήσετε" πτυχές του προγράμματός σας χωρίς να επηρεάσετε το πώς λειτουργεί. Τα παρακάτω είναι μια βασική επίδειξη του πώς λειτουργεί το millis (). Όπως θα δείτε, το πρόγραμμα θα ανάψει η λυχνία LED για 1000 χιλιοστά του δευτερολέπτου (ένα δευτερόλεπτο) και στη συνέχεια θα την απενεργοποιήσει. Αλλά βασικά, το κάνει με τρόπο που δεν εμποδίζει.

Τώρα ας δούμε πώς λειτουργεί με τον Arduino.

arduino-millis-παράδειγμα

Αυτό το πρόγραμμα - το οποίο βασίζεται σε μεγάλο βαθμό σε ένα από τα επίσημα έγγραφα Arduino - λειτουργεί με την αφαίρεση του προηγούμενου καταγεγραμμένου χρόνου από την τρέχουσα ώρα. Αν το υπόλοιπο (δηλαδή ο χρόνος που παρήλθε από την τελευταία καταγραφή του χρόνου) είναι μεγαλύτερο από το διάστημα (στην περίπτωση αυτή, 1000 χιλιοστά του δευτερολέπτου), το πρόγραμμα ενημερώνει τη μεταβλητή previousTime στην τρέχουσα ώρα και είτε ενεργοποιεί ή απενεργοποιεί τη λυχνία LED.

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

Απλό, έτσι δεν είναι; Σημειώστε πώς δημιουργήσαμε τη μεταβλητή currentTime ως μη υπογεγραμμένη . Μια μη τιμημένη αξία απλά σημαίνει ότι δεν μπορεί ποτέ να είναι αρνητική. το κάνουμε έτσι ώστε ο μέγιστος αριθμός που μπορούμε να αποθηκεύσουμε είναι μεγαλύτερος. Από προεπιλογή, οι μεταβλητές αριθμού υπογράφονται, πράγμα που σημαίνει ότι ένα "μπιτ" μνήμης για τη συγκεκριμένη μεταβλητή χρησιμοποιείται για να αποθηκεύει εάν η τιμή είναι θετική ή αρνητική. Με τον καθορισμό αυτό θα είναι μόνο θετικό, έχουμε ένα επιπλέον κομμάτι για να παίξει με.

Διακοπεί

Μέχρι τώρα έχουμε μάθει έναν τρόπο προσέγγισης του χρόνου στο πρόγραμμα Arduino, το οποίο είναι καλύτερο από την καθυστέρηση () . Αλλά υπάρχει ένας άλλος, πολύ καλύτερος τρόπος, αλλά πιο περίπλοκος: διακόπτει . Αυτά έχουν το πλεονέκτημα ότι σας επιτρέπουν να έχετε ακριβή χρόνο στο πρόγραμμα Arduino και να ανταποκρίνεστε γρήγορα σε μια εξωτερική είσοδο, αλλά με ασύγχρονο τρόπο.

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

Όταν μια διακοπή ενεργοποιείται, είτε σταματάει το πρόγραμμα είτε καλεί μια συνάρτηση, κοινώς γνωστή ως Διαχειριστής Διακοπής ή Ρουτίνα Υπηρεσίας Διακοπής . Μόλις ολοκληρωθεί αυτό το πρόγραμμα, τότε το πρόγραμμα επιστρέφει σε αυτό που πηγαίνει.

Το τσιπ AVR που τροφοδοτεί το Arduino υποστηρίζει μόνο διακοπές υλικού. Αυτά συμβαίνουν όταν ένας ακροδέκτης εισόδου μεταβαίνει από υψηλή σε χαμηλή ή όταν ενεργοποιείται από τους ενσωματωμένους χρονομετρητές του Arduino.

Ακούγεται κρυπτό. Μπερδεμένη, ακόμη και. Αλλά δεν είναι. Για να δείτε πώς λειτουργούν και να δείτε μερικά παραδείγματα από αυτά που χρησιμοποιούνται στον πραγματικό κόσμο, χτυπήστε την τεκμηρίωση Arduino.

Μην μπλοκάρετε

Η χρήση του millis () απαιτεί λίγο περισσότερη εργασία σε σύγκριση με τη χρήση καθυστέρησης () . Αλλά με εμπιστευθείτε, τα προγράμματά σας θα σας ευχαριστήσουν γι 'αυτό και δεν μπορείτε να κάνετε multitasking στο Arduino χωρίς αυτό.

Αν θέλετε να δείτε ένα παράδειγμα του millis () που χρησιμοποιείται σε ένα πραγματικό έργο Arduino, ελέγξτε το Arduino Night Light και Sunrise Alarm του James Bruce. Arduino Night Light και ηλιοθεραπεία Έργο Arduino Night Light και Sunrise Alarm Project Σήμερα, θα κάνουμε ένα ηλιακό ρολόι ηλιοβασιλέματος, το οποίο θα σας ξυπνήσει απαλά και αργά χωρίς να καταφύγετε σε μια επιθετική μηχανή θορύβου. Διαβάστε περισσότερα

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

Συντελεστές φωτογραφίας: Arduino (Daniel Spiess), σεφ (Ollie Svenson)

In this article