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

Μέθοδοι χρονισμού Arduino με Millis (): 4 βήματα
Μέθοδοι χρονισμού Arduino με Millis (): 4 βήματα

Βίντεο: Μέθοδοι χρονισμού Arduino με Millis (): 4 βήματα

Βίντεο: Μέθοδοι χρονισμού Arduino με Millis (): 4 βήματα
Βίντεο: ESP32 Tutorial 12 - WS2812 RGB Srip 4 Project with SunFounder's ESP32 IoT Learnig kit 2024, Ιούλιος
Anonim
Μέθοδοι χρονισμού Arduino With Millis ()
Μέθοδοι χρονισμού Arduino With Millis ()

Σε αυτό το άρθρο εισάγουμε το millis (). να το χρησιμοποιήσουμε για τη δημιουργία διαφόρων παραδειγμάτων χρονισμού.

Μίλις; Καμία σχέση με τα χείλη-αναζωογόνηση… ελπίζουμε ότι αναγνωρίσατε το milli ως το αριθμητικό πρόθεμα για το ένα χιλιοστό. που πολλαπλασιάζει μια μονάδα μέτρου επί 0,001 (ή δέκα στην ισχύ του αρνητικού 3).

Είναι ενδιαφέρον ότι τα συστήματά μας Arduino θα μετρήσουν τον αριθμό των χιλιοστών του δευτερολέπτου (χιλιάδες του δευτερολέπτου) από την έναρξη ενός σκίτσου μέχρι να φτάσει ο μέγιστος αριθμός που μπορεί να αποθηκευτεί στον μεταβλητό τύπο χωρίς υπογραφή (ακέραιος 32-bit [τέσσερα byte] -που κυμαίνεται από μηδέν έως (2^32) -1. (2^32) -1, ή 4294967295 χιλιοστά του δευτερολέπτου μετατρέπεται σε 49.71027-μονές ημέρες.

Ο μετρητής επανέρχεται όταν επαναφέρεται το Arduino, φτάνει στη μέγιστη τιμή ή ανεβαίνει ένα νέο σκίτσο. Για να λάβετε την τιμή του μετρητή σε μια συγκεκριμένη συγκυρία, απλώς καλέστε τη συνάρτηση - για παράδειγμα:

έναρξη = millis ();

Όπου η έναρξη είναι μια μη υπογεγραμμένη μεγάλη μεταβλητή. Εδώ είναι ένα πολύ απλό παράδειγμα για να σας δείξουμε millis () σε δράση:

/ * επίδειξη millis () */

ανυπόγραφο μακρύ ξεκίνημα, τελειωμένο, παρέλθει

void setup ()

{Serial.begin (9600); }

κενός βρόχος ()

{Serial.println ("Έναρξη …"); έναρξη = millis (); καθυστέρηση (1000)? τελειωμένο = millis (); Serial.println ("Τέλος"); πέρασε = τελείωσε-ξεκίνησε? Serial.print (παρέλθει); Serial.println ("παρέλθει χιλιοστά του δευτερολέπτου"); Serial.println (); καθυστέρηση (500)? }

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

Βήμα 1:

Εικόνα
Εικόνα

Για να το πούμε απλά, η λειτουργία millis χρησιμοποιεί έναν εσωτερικό μετρητή εντός του μικροελεγκτή ATmega στην καρδιά του Arduino σας. Αυτός ο μετρητής αυξάνει κάθε κύκλο ρολογιού - που συμβαίνει (στο τυπικό Arduino και συμβατά) με ταχύτητα ρολογιού 16 Mhz. Αυτή η ταχύτητα ελέγχεται από το κρύσταλλο στον πίνακα Arduino (το ασημένιο αντικείμενο με σφραγισμένο το T16.000 πάνω του).

Βήμα 2:

Εικόνα
Εικόνα

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

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

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

Από την άποψη του υλικού, θα έχουμε δύο κουμπιά-Έναρξη και Διακοπή-με τις πτυσσόμενες αντιστάσεις 10k ohm συνδεδεμένες με τις ψηφιακές ακίδες 2 και 3 αντίστοιχα. Όταν ο χρήστης πατήσει έναρξη, το σκίτσο θα σημειώσει την τιμή για millis - και μετά το πάτημα του stop, το σκίτσο θα σημειώσει ξανά την τιμή για millis, θα υπολογίσει και θα εμφανίσει τον χρόνο που έχει παρέλθει. Ο χρήστης μπορεί στη συνέχεια να πατήσει έναρξη για να επαναλάβει τη διαδικασία ή να σταματήσει για ενημερωμένα δεδομένα. Εδώ είναι το σκίτσο:

/* Υπερ-βασικό χρονόμετρο χρησιμοποιώντας millis (). */

ανυπόγραφο μακρύ ξεκίνημα, τελειωμένο, παρέλθει

void setup ()

{Serial.begin (9600); pinMode (2, ΕΙΣΟΔΟΣ); // κουμπί έναρξης pinMode (3, ΕΙΣΟΔΟΣ); // κουμπί διακοπής Serial.println ("Πατήστε 1 για έναρξη/επαναφορά, 2 για χρόνο που έχει παρέλθει"); }

void displayResult ()

{float h, m, s, ms; ανυπόγραφο από καιρό? πέρασε = τελείωσε-ξεκίνησε? h = int (παρέλθει/3600000); πάνω = πέρασε%3600000; m = int (πάνω/60000); πάνω = πάνω από%60000? s = int (πάνω/1000); ms = πάνω από%1000; Serial.print ("Ακατέργαστος χρόνος που πέρασε:"); Serial.println (παρέλθει); Serial.print ("Χρόνος που πέρασε:"); Serial.print (h, 0); Serial.print ("h"); Serial.print (m, 0); Serial.print ("m"); Serial.print (s, 0); Serial.print ("s"); Serial.print (ms, 0); Serial.println ("ms"); Serial.println (); }

κενός βρόχος ()

{if (digitalRead (2) == HIGH) {start = millis (); καθυστέρηση (200)? // για το debounce Serial.println ("Ξεκίνησε …"); } if (digitalRead (3) == HIGH) {finish = millis (); καθυστέρηση (200)? // για debounce displayResult (); }}

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

Βήμα 3: Ταχύμετρο…

Image
Image

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

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

Πρώτα απ 'όλα, ας επανεξετάσουμε τα απαραίτητα μαθηματικά. Θα πρέπει να γνωρίζετε την περιφέρεια του τροχού. Υλικό - θα χρειαστείτε έναν αισθητήρα. Για παράδειγμα - ένας διακόπτης καλαμιών και ένας μαγνήτης. Θεωρήστε ότι ο διακόπτης καλαμιού είναι ένα κανονικά ανοιχτό κουμπί και συνδέστε ως συνήθως με μια αντίσταση αναδίπλωσης 10k ohm.

Άλλοι μπορεί να χρησιμοποιούν έναν αισθητήρα εφέ αίθουσας-ο καθένας στον δικό του). Θυμηθείτε από την τάξη των μαθηματικών, για να υπολογίσετε την περιφέρεια - χρησιμοποιήστε τον τύπο: περιφέρεια = 2πr όπου r είναι η ακτίνα του κύκλου.

Τώρα που έχετε την περιφέρεια του τροχού, αυτή η τιμή μπορεί να θεωρηθεί ως η «σταθερή απόσταση» μας, και ως εκ τούτου η ταχύτητα μπορεί να υπολογιστεί μετρώντας τον χρόνο που έχει παρέλθει μεταξύ μιας πλήρους περιστροφής.

Ο αισθητήρας σας-μόλις τοποθετηθεί-θα πρέπει να λειτουργεί με την ίδια μέθοδο με ένα κανονικά ανοιχτό κουμπί που πιέζεται κάθε περιστροφή. Το σκίτσο μας θα μετρήσει τον χρόνο που μεσολαβεί μεταξύ κάθε παλμού από τον αισθητήρα.

Για να γίνει αυτό, το παράδειγμά μας θα συνδέσει την έξοδο του αισθητήρα με τον ψηφιακό ακροδέκτη 2 - καθώς θα ενεργοποιήσει μια διακοπή για τον υπολογισμό της ταχύτητας. Διαφορετικά, το σκίτσο θα εμφανίζει την ταχύτητα σε μια κανονική μονάδα LCD διεπαφής I2C. Η διεπαφή I2C προτείνεται καθώς αυτό απαιτεί μόνο 4 καλώδια από την πλακέτα Arduino στην οθόνη LCD - όσο λιγότερα καλώδια τόσο το καλύτερο.

Εδώ είναι το σκίτσο για τη μελέτη σας:

/*Βασικό ταχύμετρο με χρήση millis (). */

#include "Wire.h" // για LCD διαύλου I2C

#include "LiquidCrystal_I2C.h" // για μονάδα LCD διαύλου I2C - https://bit.ly/m7K5wt LiquidCrystal_I2C lcd (0x27, 16, 2); // ρυθμίστε τη διεύθυνση LCD σε 0x27 για οθόνη 16 χαρακτήρων και 2 γραμμών

float start, finish?

float παρέλθει, χρόνος? float circMetric = 1,2; // περιφέρεια τροχού σε σχέση με τη θέση του αισθητήρα (σε μέτρα) float circImperial; // χρησιμοποιώντας 1 χιλιόμετρο = 0,621371192 μίλια float speedk, speedm; // κατέχει υπολογισμένες τιμές ταχύτητας σε μετρικές και αυτοκρατορικές

void setup ()

{attachInterrupt (0, speedCalc, RISING); // διακοπή που καλείται όταν οι αισθητήρες στέλνουν ψηφιακό 2 ψηλά (κάθε περιστροφή τροχού) εκκίνηση = millis (); // setup LCD lcd.init (); // αρχικοποιήστε το lcd lcd.backlight (); // ενεργοποιήστε τον LCD φωτισμό lcd.clear (); lcd.println ("Φορέστε κράνος!"); καθυστέρηση (3000)? lcd.clear (); Serial.begin (115200); circImperial = circMetric*.62137; // μετατροπή μετρικής σε αυτοκρατορική για υπολογισμούς MPH}

void speedCalc ()

{elapsed = millis ()-έναρξη; έναρξη = millis (); speedk = (3600*circMetric)/παρέλθει? // km/h speedm = (3600*circImperial)/έχει παρέλθει. // Μίλια ανά ώρα }

κενός βρόχος ()

{lcd.setCursor (0, 0); lcd.print (int (speedk)); lcd.print ("km/h"); lcd.print (int (ταχύτητα)); lcd.print ("MPH"); lcd.setCursor (0, 1); lcd.print (int (παρέλθει)); lcd.print ("ms/rev"); καθυστέρηση (1000)? // προσαρμόστε για προσωπική προτίμηση για να ελαχιστοποιήσετε το τρεμόπαιγμα}

Δεν συμβαίνουν τόσα πολλά - κάθε φορά που ο τροχός ολοκληρώνει μία περιστροφή το σήμα από τον αισθητήρα θα πηγαίνει από χαμηλά σε υψηλά - προκαλώντας μια διακοπή που καλεί τη λειτουργία speedCalc ().

Αυτό απαιτεί μια ανάγνωση millis () και στη συνέχεια υπολογίζει τη διαφορά μεταξύ της τρέχουσας ένδειξης και της προηγούμενης ένδειξης - αυτή η τιμή γίνεται ο χρόνος για να καλυφθεί η απόσταση (η οποία είναι η περιφέρεια του τροχού σε σχέση με τον αισθητήρα - αποθηκευμένο στο

float circMetric = 1,2;

και μετριέται σε μέτρα). Υπολογίζει τελικά την ταχύτητα σε km/h και MPH. Μεταξύ διακοπών το σκίτσο εμφανίζει τα ενημερωμένα δεδομένα ταχύτητας στην οθόνη LCD καθώς και την ακατέργαστη τιμή χρόνου για κάθε περιστροφή για λόγους περιέργειας. Στην πραγματική ζωή δεν νομίζω ότι κάποιος θα τοποθετούσε LCD σε ποδήλατο, ίσως μια οθόνη LED να ήταν πιο σχετική.

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

Βήμα 4:

Αυτό συνοψίζει σχεδόν τη χρήση του millis () προς το παρόν. Υπάρχει επίσης το micros ()? συνάρτηση που μετράει μικροδευτερόλεπτα.

Ορίστε λοιπόν - μια άλλη πρακτική λειτουργία που μπορεί να επιτρέψει την επίλυση περισσότερων προβλημάτων μέσω του κόσμου του Arduino. Όπως πάντα, τώρα εξαρτάται από εσάς και τη φαντασία σας να βρείτε κάτι για να ελέγξετε ή να ξεσηκωθείτε.

Αυτή η ανάρτηση σας έφερε το pmdway.com - τα πάντα για κατασκευαστές και λάτρεις των ηλεκτρονικών ειδών, με δωρεάν παράδοση σε όλο τον κόσμο.

Συνιστάται: