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

Χρήση μονάδων ρολογιού πραγματικού χρόνου DS1307 και DS3231 με Arduino: 3 βήματα
Χρήση μονάδων ρολογιού πραγματικού χρόνου DS1307 και DS3231 με Arduino: 3 βήματα

Βίντεο: Χρήση μονάδων ρολογιού πραγματικού χρόνου DS1307 και DS3231 με Arduino: 3 βήματα

Βίντεο: Χρήση μονάδων ρολογιού πραγματικού χρόνου DS1307 και DS3231 με Arduino: 3 βήματα
Βίντεο: Using Digispark Attiny85 Mini Arduino boards: Lesson 108 2024, Νοέμβριος
Anonim
Χρήση μονάδων ρολογιού πραγματικού χρόνου DS1307 και DS3231 με Arduino
Χρήση μονάδων ρολογιού πραγματικού χρόνου DS1307 και DS3231 με Arduino
Χρήση μονάδων ρολογιού πραγματικού χρόνου DS1307 και DS3231 με Arduino
Χρήση μονάδων ρολογιού πραγματικού χρόνου DS1307 και DS3231 με Arduino

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

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

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

Είναι καλή ιδέα να αγοράσετε μια νέα μπαταρία CR2032 και να την προσαρμόσετε στη μονάδα. Μαζί με την παρακολούθηση της ώρας και της ημερομηνίας, αυτές οι μονάδες διαθέτουν επίσης ένα μικρό EEPROM, μια λειτουργία συναγερμού (μόνο DS3231) και τη δυνατότητα δημιουργίας τετραγωνικού κύματος διαφόρων συχνοτήτων-όλα αυτά θα αποτελέσουν το αντικείμενο ενός δεύτερου σεμιναρίου.

Βήμα 1: Σύνδεση της μονάδας σας σε ένα Arduino

Και οι δύο μονάδες χρησιμοποιούν το δίαυλο I2C, το οποίο κάνει τη σύνδεση πολύ εύκολη.

Πρώτα θα πρέπει να προσδιορίσετε ποιες ακίδες στο Arduino ή συμβατές πλακέτες σας χρησιμοποιούνται για το δίαυλο I2C - αυτές θα είναι γνωστές ως SDA (ή δεδομένα) και SCL (ή ρολόι). Σε Arduino Uno ή συμβατούς πίνακες, αυτές οι ακίδες είναι A4 και A5 για δεδομένα και ρολόι. Στο Arduino Mega οι ακίδες είναι D20 και D21 για δεδομένα και ρολόι. Και αν χρησιμοποιείτε συμβατό Pro Mini, οι ακίδες είναι A4 και A5 για δεδομένα και ρολόι, τα οποία είναι παράλληλα με τις κύριες ακίδες.

Μονάδα DS1307

Εάν διαθέτετε τη μονάδα DS1307, θα χρειαστεί να κολλήσετε τα καλώδια στον πίνακα ή να κολλήσετε σε μερικές εσωτερικές ακίδες κεφαλίδας, ώστε να μπορείτε να χρησιμοποιήσετε καλώδια βραχυκυκλωτήρων. Στη συνέχεια, συνδέστε τους ακροδέκτες SCL και SDA στο Arduino σας και τον πείρο Vcc στον πείρο 5V και τον GND στο GND.

Μονάδα DS3231

Η σύνδεση αυτής της μονάδας είναι εύκολη καθώς οι καρφίτσες κεφαλίδας είναι εγκατεστημένες στον πίνακα στο εργοστάσιο. Μπορείτε απλά να τρέξετε ξανά καλώδια από jumper από SCL και SDA στο Arduino και ξανά από τις καρφίτσες Vcc και GND της μονάδας στις 5V ή 3.3. V και GND της πλακέτας σας. Ωστόσο, αυτά αντιγράφονται στην άλλη πλευρά για συγκόλληση των καλωδίων σας. Και οι δύο αυτές μονάδες έχουν τις απαιτούμενες αντιστάσεις έλξης, οπότε δεν χρειάζεται να προσθέσετε τις δικές σας. Όπως όλες οι συσκευές που είναι συνδεδεμένες στο δίαυλο I2C, προσπαθήστε να διατηρήσετε το μήκος των καλωδίων SDA και SCL στο ελάχιστο.

Βήμα 2: Ανάγνωση και εγγραφή του χρόνου από την ενότητα RTC

Μόλις συνδέσετε τη μονάδα RTC. εισαγάγετε και ανεβάστε το παρακάτω σκίτσο. Αν και οι σημειώσεις και οι λειτουργίες στο σκίτσο αναφέρονται μόνο στο DS3231, ο κώδικας λειτουργεί επίσης με το DS1307.

#include "Wire.h" #define DS3231_I2C_ADDRESS 0x68 // Μετατρέψτε τους κανονικούς δεκαδικούς αριθμούς σε δυαδικό κωδικοποιημένο δεκαδικό byte decToBcd (byte val) {return ((val/10*16) + (val%10)); } // Μετατροπή δυαδικών κωδικοποιημένων δεκαδικών σε κανονικούς δεκαδικούς αριθμούς byte bcdToDec (byte val) {return ((val/16*10) + (val%16)); } void setup () {Wire.begin (); Serial.begin (9600); // ορίστε την αρχική ώρα εδώ: // DS3231 δευτερόλεπτα, λεπτά, ώρες, ημέρα, ημερομηνία, μήνας, έτος // setDS3231 ώρα (30, 42, 21, 4, 26, 11, 14). } void setDS3231time (byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) {// ορίζει δεδομένα ώρας και ημερομηνίας σε DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // ορίστε την επόμενη είσοδο για να ξεκινήσει στο δευτερόλεπτο καταχώριση Wire.write (decToBcd (δεύτερο)); // ρύθμιση δευτερολέπτων Wire.write (decToBcd (λεπτό)); // ορίστε λεπτά Wire.write (decToBcd (ώρα)); // καθορισμός ωρών Wire.write (decToBcd (dayOfWeek)); // καθορισμένη ημέρα της εβδομάδας (1 = Κυριακή, 7 = Σάββατο) Wire.write (decToBcd (dayOfMonth)); // καθορισμός ημερομηνίας (1 έως 31) Wire.write (decToBcd (μήνας)); // καθορισμός μήνα Wire.write (decToBcd (έτος)); // καθορισμένο έτος (0 έως 99) Wire.endTransmission (); } void readDS3231time (byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) {Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // ορίστε τον δείκτη μητρώου DS3231 σε 00h Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); // ζητήστε επτά byte δεδομένων από το DS3231 ξεκινώντας από τον καταχωρητή 00h *second = bcdToDec (Wire.read () & 0x7f); *λεπτό = bcdToDec (Wire.read ()); *ώρα = bcdToDec (Wire.read () & 0x3f); *dayOfWeek = bcdToDec (Wire.read ()); *dayOfMonth = bcdToDec (Wire.read ()); *μήνας = bcdToDec (Wire.read ()); *έτος = bcdToDec (Wire.read ()); } void displayTime () {byte δευτερόλεπτο, λεπτό, ώρα, dayOfWeek, dayOfMonth, μήνας, έτος. // ανάκτηση δεδομένων από το DS3231 readDS3231time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year); // να το στείλετε στη σειριακή οθόνη Serial.print (ώρα, DEC). // μετατρέψτε τη μεταβλητή byte σε δεκαδικό αριθμό όταν εμφανίζεται Serial.print (":"); if (λεπτό <10) {Serial.print ("0"); } Serial.print (λεπτό, DEC); Serial.print (":"); if (δεύτερο <10) {Serial.print ("0"); } Serial.print (δεύτερο, DEC); Serial.print (""); Serial.print (dayOfMonth, DEC); Serial.print ("/"); Serial.print (μήνας, DEC) Serial.print ("/"); Serial.print (έτος, DEC) Serial.print ("Ημέρα της εβδομάδας:"); switch (dayOfWeek) {case 1: Serial.println ("Sunday"); Διακοπή; περίπτωση 2: Serial.println ("Δευτέρα"); Διακοπή; περίπτωση 3: Serial.println ("Τρίτη"); Διακοπή; περίπτωση 4: Serial.println ("Τετάρτη"); Διακοπή; περίπτωση 5: Serial.println ("Πέμπτη"); Διακοπή; περίπτωση 6: Serial.println ("Παρασκευή"); Διακοπή; περίπτωση 7: Serial.println ("Σάββατο"); Διακοπή; }} void loop () {displayTime (); // Εμφάνιση δεδομένων ρολογιού σε πραγματικό χρόνο στη Σειριακή οθόνη, καθυστέρηση (1000). // κάθε δευτερόλεπτο }

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

Περιλαμβάνει πρώτα τη βιβλιοθήκη Wire, η οποία χρησιμοποιείται για επικοινωνία διαύλου I2C, ακολουθούμενη από τον καθορισμό της διεύθυνσης διαύλου για το RTC ως 0x68. Ακολουθούν δύο συναρτήσεις που μετατρέπουν τους δεκαδικούς αριθμούς σε BCD (δεκαδικό με δυαδική κωδικοποίηση) και αντίστροφα. Αυτά είναι απαραίτητα καθώς τα IC RTC λειτουργούν σε BCD και όχι δεκαδικά.

Η λειτουργία setDS3231time () χρησιμοποιείται για τη ρύθμιση του ρολογιού. Η χρήση του είναι πολύ εύκολη, απλώς εισάγετε τις τιμές από έτος σε έτος και το RTC θα ξεκινήσει από εκείνη τη στιγμή. Για παράδειγμα, εάν θέλετε να ορίσετε την ακόλουθη ημερομηνία και ώρα - Τετάρτη 26 Νοεμβρίου 2014 και 21:42 μ.μ. και 30 δευτερόλεπτα - θα χρησιμοποιούσατε:

setDS3231 ώρα (30, 42, 21, 4, 26, 11, 14);

Βήμα 3:

Σημειώστε ότι η ώρα ορίζεται χρησιμοποιώντας 24ωρη ώρα και η τέταρτη παράμετρος είναι η «ημέρα της εβδομάδας». Αυτό κυμαίνεται μεταξύ 1 και 7 που είναι Κυριακή έως Σάββατο αντίστοιχα. Αυτές οι παράμετροι είναι τιμές byte εάν υποβάλλετε τις δικές σας μεταβλητές.

Μόλις εκτελέσετε τη λειτουργία μια φορά, είναι συνετό να το προσθέσετε με πρόθεμα // και να ανεβάσετε ξανά τον κώδικά σας, ώστε να μην επαναφέρει τον χρόνο μετά την αλλαγή του κύκλου λειτουργίας ή την επαναφορά μικροελεγκτή. Η ανάγνωση του χρόνου από το RTC σας είναι εξίσου απλή, στην πραγματικότητα η διαδικασία μπορεί να ακολουθηθεί τακτοποιημένα μέσα στη λειτουργία displayTime (). Θα χρειαστεί να ορίσετε επτά μεταβλητές byte για να αποθηκεύσετε τα δεδομένα από το RTC και αυτές στη συνέχεια εισάγονται στη συνάρτηση readDS3231time (). Για παράδειγμα, εάν οι μεταβλητές σας είναι:

byte δευτερόλεπτο, λεπτό, ώρα, dayOfWeek, dayOfMonth, μήνας, έτος?

… Θα τα ανανεώσετε με τα τρέχοντα δεδομένα από το RTC χρησιμοποιώντας:

readDS3232time (& second, & minute, & hour, & dayOfWeek, & dayOfMonth, & month, & year);

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

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

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

Μπορείτε να μάθετε περισσότερα για τα συγκεκριμένα IC ρολογιών πραγματικού χρόνου από τον ιστότοπο του κατασκευαστή-DS1307 και DS3231.

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

Συνιστάται: