Πίνακας περιεχομένων:
- Βήμα 1: Σύνδεση της μονάδας σας σε ένα Arduino
- Βήμα 2: Ανάγνωση και εγγραφή του χρόνου από την ενότητα RTC
- Βήμα 3:
Βίντεο: Χρήση μονάδων ρολογιού πραγματικού χρόνου DS1307 και DS3231 με Arduino: 3 βήματα
2024 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2024-01-30 08:34
Συνεχίζουμε να λαμβάνουμε αιτήματα για τον τρόπο χρήσης των μονάδων ρολογιού πραγματικού χρόνου 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 - τα πάντα για κατασκευαστές και λάτρεις των ηλεκτρονικών ειδών, με δωρεάν παράδοση σε όλο τον κόσμο.
Συνιστάται:
Ρολόι πραγματικού χρόνου με χρήση AT89s52: 3 βήματα
Real TIme Clock Using AT89s52: WELCOME BACK, Αυτό είναι το shubham Trivedi και σήμερα θα σχεδιάσω το ρολόι πραγματικού χρόνου χρησιμοποιώντας τον μικροελεγκτή At89s52. Ο μικροελεγκτής AT89S52 είναι η καρδιά αυτού του έργου. Το DS1307 IC χρησιμοποιείται ως RTC. Αυτό το IC DS1307 απαιτούσε διεπαφή I2C, αλλά 89
SCARA Robot: Learning About Foward and Inverse Kinematics !!! (Plot Twist Μάθετε πώς να δημιουργείτε μια διεπαφή πραγματικού χρόνου στο ARDUINO χρησιμοποιώντας την ΕΠΕΞΕΡΓΑΣΙΑ !!!!): 5 βήματα (με εικόνες)
SCARA Robot: Learning About Foward and Inverse Kinematics !!! (Plot Twist Μάθετε πώς να δημιουργείτε μια διεπαφή πραγματικού χρόνου στο ARDUINO χρησιμοποιώντας την ΕΠΕΞΕΡΓΑΣΙΑ !!!!): Ένα ρομπότ SCARA είναι ένα πολύ δημοφιλές μηχάνημα στον κόσμο της βιομηχανίας. Το όνομα σημαίνει τόσο Selective Compliant Assembly Robot Arm είτε Selective Compliant Articulated Robot Arm. Είναι βασικά ένα ρομπότ τριών βαθμών ελευθερίας, που είναι τα δύο πρώτα διανομή
DS1307 Ρολόι πραγματικού χρόνου RTC με Arduino: 4 βήματα
DS1307 Ρολόι πραγματικού χρόνου RTC με Arduino: Σε αυτό το σεμινάριο, θα μάθουμε για το Ρολόι πραγματικού χρόνου (RTC) και πώς το Arduino & Ρολόι πραγματικού χρόνου IC DS1307 συνδυάζεται ως συσκευή χρονισμού. Το ρολόι πραγματικού χρόνου (RTC) χρησιμοποιείται για την παρακολούθηση του χρόνου και τη διατήρηση ενός ημερολογίου. Για να χρησιμοποιήσετε ένα RTC, w
Ρολόι βασισμένο σε Arduino χρησιμοποιώντας μονάδα ρολογιού πραγματικού χρόνου DS1307 (RTC) & βήματα 0,96: 5
Ρολόι βασισμένο σε Arduino χρησιμοποιώντας τη μονάδα ρολογιού πραγματικού χρόνου DS1307 (RTC) & 0.96: Γεια σας παιδιά σε αυτό το σεμινάριο θα δούμε πώς να φτιάξετε ένα ρολόι εργασίας χρησιμοποιώντας μια μονάδα ρολογιού πραγματικού χρόνου DS1307 & Οθόνες OLED. Έτσι θα διαβάσουμε την ώρα από τη μονάδα ρολογιού DS1307. Και εκτυπώστε το στην οθόνη OLED
Σύστημα φανών 4 δρόμων με χρήση 5 ασύρματων μονάδων Arduinos και 5 NRF24L01: 7 βήματα (με εικόνες)
Σύστημα 4 δρόμων φανών με χρήση 5 ασύρματων μονάδων Arduinos και 5 NRF24L01: Πριν από λίγο δημιούργησα ένα Instructable που περιγράφει λεπτομερώς ένα ζευγάρι φανάρια σε ένα breadboard. Δημιούργησα επίσης ένα άλλο Instructable που δείχνει το βασικό πλαίσιο για τη χρήση μιας ασύρματης μονάδας NRF24L01. Αυτό με έβαλε σε σκέψεις! Υπάρχουν αρκετά