Τρόπος χρήσης της μονάδας ρολογιού πραγματικού χρόνου (RTC) DS3231 με ESP32

Tropos Chreses Tes Monadas Rologiou Pragmatikou Chronou Rtc Ds3231 Me Esp32



Το ESP32 είναι μια έξυπνη πλακέτα μικροελεγκτή με ενσωματωμένες δυνατότητες Wi-Fi και Bluetooth. Το ESP32 διαθέτει εσωτερικό RTC, αλλά η λειτουργία του εξαρτάται από την ισχύ. Επομένως, εάν θέλετε να σχεδιάσετε έργα ή κυκλώματα που θέλετε να εκτελείτε ακόμα και όταν δεν υπάρχει ρεύμα, πρέπει να χρησιμοποιήσετε οποιαδήποτε εξωτερική μονάδα RTC όπως το DS1307 ή το DS3231.

Έχουμε ήδη κάνει ένα σεμινάριο για DS1307 διασύνδεση με τη μονάδα ESP32 . Σήμερα θα συζητήσουμε τα βασικά του αισθητήρα DS3231 RTC και θα ελέγξουμε πώς μπορεί κανείς να τον διασυνδέσει με την πλακέτα ESP32.

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







1. Τι είναι η μονάδα DS3231 RTC



2. Τρόπος διασύνδεσης του DS3231 με το ESP32



3. Υλικό





4. Κωδ

5. Έξοδος



6. Πώς να εμφανίσετε την ώρα RTC DS3231 σε μια οθόνη OLED χρησιμοποιώντας ESP32

συμπέρασμα

1. Τι είναι η μονάδα DS3231 RTC

Η μονάδα DS3231 παρέχει χρονομέτρηση υψηλής ακρίβειας. Περιλαμβάνει έναν ενσωματωμένο ταλαντωτή κρυστάλλου με αντιστάθμιση θερμοκρασίας (TCXO) για να μας δίνει χρόνο με μεγάλη ακρίβεια. Η μονάδα λειτουργεί με το πρωτόκολλο I2C χρησιμοποιώντας τη διαμόρφωση Master-Slave. Μπορεί να κρατήσει την ώρα και την ημερομηνία με μια εφεδρική μπαταρία ακόμα και όταν δεν υπάρχει κύρια τροφοδοσία εισόδου. Χρησιμοποιείται συνήθως σε συσκευές που εξαρτώνται από την ώρα και την ημερομηνία.

Το DS3231 διατηρεί καρτέλες σε δευτερόλεπτα, λεπτά και ώρες. Μπορεί επίσης να κρατήσει αρχείο ημερομηνιών και καθημερινών. Όταν πρόκειται για δίσεκτα έτη, προσαρμόζει αυτόματα τον χρόνο ανάλογα. Επίσης, μπορεί να εμφανίσει την ώρα σε μορφή 12 ωρών ή 24 ωρών, με ένδειξη AM/PM.

1.1. DS3231 εναντίον DS1307

Τόσο το DS3231 όσο και το DS1307 είναι μονάδες μέτρησης χρόνου με υποστήριξη εφεδρικής μπαταρίας. Ωστόσο, το DS3231 είναι πιο ακριβές από το DS1307. Ο κύριος λόγος είναι ότι το DS1307 εξαρτάται από εξωτερικό κρύσταλλο 32 kHz για τη μέτρηση του χρόνου.

Ωστόσο, το RTC DS3231 διαθέτει εσωτερικό Ταλαντωτή Κρυστάλλων Αντιστάθμισης Θερμοκρασίας (TCXO). Αυτό το καθιστά λιγότερο επηρεασμένο από την εξωτερική θερμοκρασία και ως εκ τούτου, έχει ένα πλεονέκτημα ακρίβειας μερικών λεπτών το χρόνο από το DS1307.

1.2. DS3231 Pinout

Το DS3231 λειτουργεί χρησιμοποιώντας το πρωτόκολλο I2C. Στην καρδιά αυτής της μονάδας RTC, έχουμε το ακριβές τσιπ RTC που σχεδιάστηκε από τη Maxim. Αυτό το τσιπ χειρίζεται όλες τις λειτουργίες του χρόνου και επικοινωνεί χρησιμοποιώντας το I2C με πλακέτα ESP32 ή Arduino.

Οι κύριες ακίδες των μονάδων RTC DS3231 είναι:

  • VCC: Συνδέστε αυτόν τον πείρο στον θετικό ακροδέκτη της πηγής ρεύματος.
  • GND: Σύνδεση γείωσης.
  • SDA: Pin Serial Data (χρησιμοποιείται για επικοινωνία I2C).
  • SCL: Pin Serial Clock (επίσης μέρος της διεπαφής I2C).
  • QW: Καρφίτσα εξόδου Square Wave (μπορεί να παράγει περιοδικό σήμα, π.χ. για συναγερμούς ή άλλους σκοπούς χρονισμού).
  • 32K: Έξοδος ταλαντωτή 32 KHz (χρήσιμο για εφαρμογές ακριβούς χρονισμού).

Τα ακόλουθα είναι τα κύρια ενσωματωμένα εξαρτήματα της μονάδας RTC DS3231:

  • Υποδοχή μπαταρίας: Επιτρέπει στη μονάδα να συνεχίσει να λειτουργεί όταν απουσιάζει η εξωτερική τροφοδοσία.
  • Τσιπ RTC: Αυτό το τσιπ διατηρεί την ώρα και την ημερομηνία.
  • AT24C32 EEPROM: Παρέχει μη πτητική αποθήκευση για καταγραφή δεδομένων και άλλους σκοπούς με 1.000.000 κύκλους εγγραφής.
  • TCXO: Ταλαντωτής με αντιστάθμιση θερμοκρασίας για να παρέχει τον σωστό χρόνο για ποικίλο εύρος θερμοκρασιών.
  • Αισθητήρας θερμοκρασίας: Λαμβάνει μετρήσεις θερμοκρασίας και τις παρέχει ως μέρος της δυνατότητας της μονάδας.

2. Τρόπος διασύνδεσης του DS3231 με το ESP32

Για να διασυνδέσετε το DS3231 με το ESP32, πρέπει να εγκαταστήσετε το Βιβλιοθήκη RTClib πρώτα. Μετά την εγκατάσταση αυτής της βιβλιοθήκης Adafruit RTC, μπορείτε να συνδέσετε την πλακέτα ESP32 με το DS3231 χρησιμοποιώντας το πρωτόκολλο I2C. Για να συνδέσετε το ESP32 I2C με τη μονάδα RTC DS3231, μπορείτε να χρησιμοποιήσετε τις ακίδες ESP32 D21 και D22.

2.1. Διάγραμμα καλωδίωσης ESP32 με RTC DS3231

Πρώτα, πρέπει να συνδέσετε το ESP32 με τη μονάδα I2C RTC DS3231. Ακολουθήστε την παρακάτω διαμόρφωση ακροδεκτών για την καλωδίωση:

Αφού συνδέσετε το ESP32 με το RTC DS3231, το διάγραμμα καλωδίωσης θα πρέπει να μοιάζει με αυτό. Μπορείτε επίσης να τροφοδοτήσετε το DS3231 από τον ακροδέκτη VIN του ESP32. Οι τάσεις λειτουργίας του DS3231 είναι 3,3 έως 5,5 VDC.

2.2. Εγκατάσταση των Απαιτούμενων Βιβλιοθηκών

Μόλις το κύκλωμα είναι έτοιμο, το επόμενο βήμα είναι να διαμορφώστε την πλακέτα ESP32 με το Arduino IDE . Για τη διασύνδεση του DS3231, θα χρειαστεί να εγκαταστήσετε το Βιβλιοθήκη RTClib . Μπορείτε να το εγκαταστήσετε χρησιμοποιώντας τον διαχειριστή βιβλιοθήκης Arduino IDE.

3. Υλικό

Θα χρειαστείτε το ακόλουθο υλικό για το σχεδιασμό του ρολογιού RTC που βασίζεται σε DS3231 με ESP32:

  • Πλακέτα ανάπτυξης ESP32
  • Μονάδα RTC DS3231
  • Μπαταρία CR2032
  • Καλώδια βραχυκυκλωτήρα
  • Breadboard

4. Κωδ

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

Τώρα ανοίξτε το Arduino IDE, μεταγλωττίστε και εγγράψτε τον κώδικα στην πλακέτα ESP32.

#include
#include

RTC_DS3231 rtc ; // Αρχικοποίηση μιας παρουσίας της κλάσης RTC_DS3231

κενός εγκατάσταση ( ) {
Κατα συρροη. αρχίζουν ( 115200 ) ;
Σύρμα. αρχίζουν ( ) ;

αν ( ! rtc. αρχίζουν ( ) ) {
Κατα συρροη. println ( 'Δεν εντοπίστηκε RTC' ) ;
ενώ ( 1 ) ; // Παραμονή επ' αόριστον εάν δεν βρεθεί το RTC
}

//Απαιρέστε το σχόλιο της παρακάτω γραμμής για να ορίσετε την αρχική ημερομηνία και ώρα
//rtc.adjust(DateTime(__DATE__, __TIME__));
}

κενός βρόχος ( ) {
// Ανάγνωση τρέχουσας ώρας από τον αισθητήρα (DS3231)
ΗμερομηνίαΏρα τώρα = rtc. τώρα ( ) ;

// Εκτυπώστε την ημερομηνία και την ώρα στην ίδια γραμμή με δύο ψηφία για ώρες, λεπτά και δευτερόλεπτα
Κατα συρροη. Τυπώνω ( 'Σημερινή ημερομηνία: ' ) ;
Κατα συρροη. Τυπώνω ( τώρα. έτος ( ) , ΔΕΚ ) ;
Κατα συρροη. Τυπώνω ( '/' ) ;
printTwoDigits ( τώρα. μήνας ( ) ) ;
Κατα συρροη. Τυπώνω ( '/' ) ;
printTwoDigits ( τώρα. ημέρα ( ) ) ;
Κατα συρροη. Τυπώνω ( 'Τρέχουσα ώρα:' ) ;
printTwoDigits ( τώρα. ώρα ( ) ) ;
Κατα συρροη. Τυπώνω ( ':' ) ;
printTwoDigits ( τώρα. λεπτό ( ) ) ;
Κατα συρροη. Τυπώνω ( ':' ) ;
printTwoDigits ( τώρα. δεύτερος ( ) ) ;
Κατα συρροη. println ( ) ;

καθυστέρηση ( 1000 ) ; // Ενημέρωση κάθε 1 δευτερόλεπτο
}

κενός printTwoDigits ( ενθ αριθμός ) {
αν ( αριθμός < 10 ) {
Κατα συρροη. Τυπώνω ( '0' ) ; // Προσθέστε ένα μηδενικό στην αρχή για μονοψήφιους αριθμούς
}
Κατα συρροη. Τυπώνω ( αριθμός ) ;
}

4.1. Επεξήγηση κώδικα

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

Στο εγκατάσταση μέρος, ο δίαυλος I2C ξεκινά και ελέγχεται για τις διαθέσιμες συσκευές I2C. Εάν δεν βρεθεί, το πρόγραμμα μένει απεριόριστα. Ο ρυθμός baud ορίζεται επίσης, ώστε να μπορείτε να ελέγξετε την έξοδο στη σειριακή οθόνη Arduino IDE.

Ρύθμιση του ρολογιού για πρώτη φορά

Κατά τον προγραμματισμό του DS3231, πρέπει καταργήστε το σχόλιο αυτής της γραμμής . Αυτό θα πάρει το χρόνο του συστήματός σας και θα τον αποθηκεύσει στη μνήμη RTC. Με αυτόν τον τρόπο, το ρολόι της μονάδας RTC συγχρονίζεται με το ρολόι του συστήματός σας.

//rtc.adjust(DateTime(__DATE__, __TIME__));

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

Με αυτόν τον τρόπο, ο χρόνος σας θα παραμείνει διαθέσιμος στο φόντο της μονάδας RTC για όσο διάστημα η μονάδα RTC έχει ισχύ στο κελί CR2032.

Στο βρόχος μέρος, η τρέχουσα ημερομηνία και ώρα διαβάζονται από τη μονάδα DS3231 χρησιμοποιώντας τη συνάρτηση rtc.now(). Τα στοιχεία ημερομηνίας και ώρας εξάγονται και η μορφοποιημένη ημερομηνία εκτυπώνεται στη σειριακή οθόνη Arduino IDE κάθε ένα δευτερόλεπτο.

5. Έξοδος

Αφού ανεβάσετε τον κωδικό στην πλακέτα ESP32, θα δείτε ότι η ώρα θα ξεκινήσει η εκτύπωση στη σειριακή οθόνη Arduino IDE.

6. Πώς να εμφανίσετε την ώρα RTC DS3231 στην οθόνη OLED χρησιμοποιώντας ESP32

Μπορείτε επίσης να προχωρήσετε ένα βήμα παραπέρα και να εμφανίσετε την ώρα στην οθόνη OLED αφού την διαβάσετε από το DS3231. Για αυτό, πρέπει να εγκαταστήσετε το Βιβλιοθήκη Adafruit GFX SSD1306 στο Arduino IDE.

Μόλις εγκατασταθεί, συνδέστε το ESP32 με τη μονάδα OLED και RTC στην ακόλουθη διαμόρφωση.

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

Τώρα ανεβάστε τον ακόλουθο κωδικό DS3231 στην πλακέτα ESP32.

#include
#include
#include
#include 'RTClib.h'

RTC_DS3231 rtc ;

απανθρακώνω ημέρες [ 7 ] [ 12 ] = { 'Κυριακή' , 'Δευτέρα' , 'Τρίτη' , 'Τετάρτη' , 'Πέμπτη' , 'Παρασκευή' , 'Σάββατο' } ;

Οθόνη Adafruit_SSD1306 = Adafruit_SSD1306 ( 128 , 64 , & Σύρμα , - 1 ) ;

κενός εγκατάσταση ( ) {
Κατα συρροη. αρχίζουν ( 115200 ) ;

απεικόνιση. αρχίζουν ( SSD1306_SWITCHCAPVCC , 0x3C ) ;

αν ( ! rtc. αρχίζουν ( ) ) {
Κατα συρροη. println ( 'Δεν ήταν δυνατή η εύρεση του RTC! Ελέγξτε το κύκλωμα.' ) ;
ενώ ( 1 ) ;
}
//αποσχολιάστε την παρακάτω γραμμή ενώ ορίζετε την ώρα για πρώτη φορά
//rtc.adjust(DateTime(__DATE__, __TIME__));
απεικόνιση. καθαρή οθόνη ( ) ;
απεικόνιση. setTextColor ( ΑΣΠΡΟ ) ;
απεικόνιση. setTextSize ( 2 ) ;
απεικόνιση. setCursor ( 0 , είκοσι ) ;
απεικόνιση. Τυπώνω ( 'RTC CLOCK' ) ;
απεικόνιση. απεικόνιση ( ) ;
καθυστέρηση ( 5000 ) ;
}

κενός βρόχος ( ) {
ΗμερομηνίαΏρα τώρα = rtc. τώρα ( ) ;

απεικόνιση. καθαρή οθόνη ( ) ;
απεικόνιση. setTextSize ( 2 ) ;
απεικόνιση. setCursor ( 75 , 0 ) ;
απεικόνιση. println ( τώρα. δεύτερος ( ) , ΔΕΚ ) ;
απεικόνιση. setTextSize ( 2 ) ;
απεικόνιση. setCursor ( 25 , 0 ) ;
απεικόνιση. println ( ':' ) ;
απεικόνιση. setTextSize ( 2 ) ;
απεικόνιση. setCursor ( 65 , 0 ) ;
απεικόνιση. println ( ':' ) ;
απεικόνιση. setTextSize ( 2 ) ;
απεικόνιση. setCursor ( 40 , 0 ) ;
απεικόνιση. println ( τώρα. λεπτό ( ) , ΔΕΚ ) ;
απεικόνιση. setTextSize ( 2 ) ;
απεικόνιση. setCursor ( 0 , 0 ) ;
απεικόνιση. println ( τώρα. ώρα ( ) , ΔΕΚ ) ;
απεικόνιση. setTextSize ( 2 ) ;
απεικόνιση. setCursor ( 0 , 25 ) ;
απεικόνιση. println ( τώρα. ημέρα ( ) , ΔΕΚ ) ;
απεικόνιση. Τυπώνω ( ημέρες [ τώρα. ημέρα της εβδομάδας ( ) ] ) ;
απεικόνιση. setTextSize ( 2 ) ;
απεικόνιση. setCursor ( είκοσι , 25 ) ;
απεικόνιση. println ( '-' ) ;
απεικόνιση. setTextSize ( 2 ) ;
απεικόνιση. setCursor ( 35 , 25 ) ;
απεικόνιση. println ( τώρα. μήνας ( ) , ΔΕΚΕΜΒΡΙΟΥ ) ;
απεικόνιση. setTextSize ( 2 ) ;
απεικόνιση. setCursor ( 60 , 25 ) ;
απεικόνιση. println ( '-' ) ;
απεικόνιση. setTextSize ( 2 ) ;
απεικόνιση. setCursor ( 75 , 25 ) ;
απεικόνιση. println ( τώρα. έτος ( ) , ΔΕΚΕΜΒΡΙΟΥ ) ;
απεικόνιση. απεικόνιση ( ) ;
}

Επεξήγηση κώδικα

Ο κώδικας ξεκίνησε με ορισμένες σημαντικές βιβλιοθήκες που απαιτούνται για οθόνες RTC και OLED. Η οθόνη OLED ρυθμίζεται χρησιμοποιώντας τη βιβλιοθήκη Adafruit SSD1306.

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

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

Σημείωση: Ο παραπάνω κώδικας χρησιμοποιεί το 0x3C Διεύθυνση I2C για OLED. Αυτή είναι η πιο κοινή διεύθυνση I2C που είναι διαθέσιμη στις οθόνες OLED SSD1306. Εάν θέλετε να βρείτε τη διεύθυνση I2C για την οθόνη OLED σας, μπορείτε να εκτελέσετε το Κωδικός σαρωτή I2C .

συμπέρασμα

Το DS3231 είναι ένας αισθητήρας RTC που μπορεί να χρησιμοποιηθεί για τη μέτρηση του χρόνου. Διαθέτει εφεδρική μπαταρία που μπορεί να κρατήσει ακριβή τον χρόνο ακόμα κι αν η πλακέτα του μικροελεγκτή σας είναι απενεργοποιημένη. Για να διασυνδέσετε το ESP2 με το DS3231, πρέπει να εγκαταστήσετε τη βιβλιοθήκη RTClib στο Arduino IDE. Μετά από αυτό, πρέπει να συνδέσετε τη μονάδα RTC μέσω του πρωτοκόλλου I2C χρησιμοποιώντας την ψηφιακή ακίδα του ESP32. Μόλις συνδεθείτε, απλώς μεταφορτώστε τον κωδικό και προσαρμόστε την ώρα. Τώρα ο αισθητήρας RTC θα κρατά χρόνο και μπορείτε να τον διαβάσετε στη σειριακή οθόνη σας σε έργα που βασίζονται σε χρόνο σχεδίασης.