To ρολόι DS3231

- Συνδέστε το Vin με την τροφοδοσία του Arduino, το 3-5V είναι καλό.  Για τους περισσότερους Arduinos, δηλαδή 3.3 V είναι καλή επιλογή.

- Συνδέστε το GND στο αντίστοιχο του Arduino
- Συνδέστε τον ακροδέκτη SCL στην ακίδα SCL του ρολογιού I2C στο Arduino. Σε ένα UNO & 328 με βάση Arduino, αυτό είναι επίσης γνωστό ως A5, σε ένα Mega είναι επίσης γνωστό ως ψηφιακό 21 και σε ένα Leonardo / Micro, ψηφιακή 3
Συνδέστε τον ακροδέκτη SDA στον ακροδέκτη δεδομένων SDA του I2C στο Arduino σας. Σε ένα UNO & 328 based Arduino, αυτό είναι επίσης γνωστό ως A4, σε Mega είναι επίσης γνωστό ως ψηφιακό 20 και σε ένα Leonardo / Micro, ψηφιακή 2
Το DS3231 έχει μια προεπιλεγμένη διεύθυνση I2C του 0x68 και δεν μπορεί να αλλάξει.

Download RTCLib

Για να αρχίσετε να διαβάζετε δεδομένα, θα χρειαστεί να κάνετε λήψη του RTCLib της Adafruit από το αποθετήριο github. Μπορείτε να το κάνετε αυτό με την επίσκεψη στο github repo και το κατέβασμα με το χέρι ή, ευκολότερα, απλά κάντε κλικ σε αυτό το κουμπί για να κατεβάσετε το zip

Για τη βιβλιοθήκη RTC θα χρησιμοποιήσουμε μια εξαιρετική RTC βιβλιοθήκη RTClib της JeeLab - μια βιβλιοθήκη για τη λήψη και ρύθμιση χρόνου από ένα RTC (αρχικά γραμμένο από το JeeLab, η έκδοση της Adafruit που χρησιμοποιούμε είναι ελαφρώς διαφορετική.
Για να αρχίσετε να διαβάζετε δεδομένα, θα χρειαστεί να κάνετε λήψη του RTCLib της Adafruit από το αποθετήριο github. Μπορείτε να το κάνετε αυτό με την επίσκεψη στο github repo και  κατέβασμα  ή, ευκολότερα, απλά κάντε κλικ σε αυτό το κουμπί για να κατεβάσετε το zip

Download RTClib

Μετονομάστε το μη συμπιεσμένο φάκελο RTCLib και βεβαιωθείτε ότι ο φάκελος RTCLib περιέχει RTCLib.cpp και RTCLib.h Αν δεν έχει τοποθετηθεί στο φάκελο libraries ,τοποθετήστε το φάκελο βιβλιοθήκης RTCLib στον φάκελο arduinosketchfolder / libraries / folder.
Ίσως χρειαστεί να δημιουργήσετε τον υποφάκελο βιβλιοθηκών εάν είναι η πρώτη σας βιβλιοθήκη. Κάντε επανεκκίνηση του IDE.

Πρώτο RTC τεστ

Το πρώτο πράγμα που θα δείξουμε είναι ένα δοκιμαστικό πρόγραμμα που θα διαβάσει το χρόνο από το RTC μία φορά το δευτερόλεπτο. Θα δείξουμε επίσης τι θα συμβεί αν αφαιρέσετε την μπαταρία και την αντικαταστήσετε, καθώς αυτό αναγκάζει το RTC να σταματήσει. Για να ξεκινήσετε, αφαιρέστε την μπαταρία από τη θήκη, ενώ το Arduino δεν τροφοδοτείται ή συνδέεται σε USB. Περιμένετε 3 δευτερόλεπτα και στη συνέχεια αντικαταστήστε την μπαταρία. Αυτό επαναφέρει το τσιπ RTC.

components_insertbatt.jpg

Φόρτωση προγράμματος επίδειξης (Demo)
Ανοίξτε το Αρχείο-> Παραδείγματα-> RTClib-> ds3231 και μεταφορτώστε στο Arduino σας που είναι συνδεδεμένο το RTC

components_ds3231.png

 

Μεταφορτώστε στο Arduino σας και ελέγξτε τη σειριακή κονσόλα @ 9600 Baud. Μετά από μερικά δευτερόλεπτα, θα δείτε την αναφορά ότι ο Arduino παρατήρησε ότι αυτή είναι η πρώτη φορά που το DS3231 έχει τροφοδοτηθεί και θα ρυθμίσει το χρόνο με βάση το πρόγραμμα Arduino.

components_lostpower.png

Αποσυνδέστε το Arduino plus RTC για μερικά δευτερόλεπτα (ή λεπτά, ώρες ή εβδομάδες) και συνδέστε ξανά.
Την επόμενη φορά που θα την εκτελέσετε, δεν θα έχετε το ίδιο μήνυμα "RTC lost power", αλλά  αμέσως και θα σας ενημερώσει για το σωστό χρόνο!

components_reset.png

 

Από τώρα και στο εξής, δεν θα πρέπει ποτέ να ρυθμίσετε ξανά το χρόνο: η μπαταρία θα διαρκέσει 5 ή περισσότερα χρόνια.

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

 Download file
 
  1. void loop () {
  2. DateTime now = rtc.now();
  3. Serial.print(now.year(), DEC);
  4. Serial.print('/');
  5. Serial.print(now.month(), DEC);
  6. Serial.print('/');
  7. Serial.print(now.day(), DEC);
  8. Serial.print(" (");
  9. Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
  10. Serial.print(") ");
  11. Serial.print(now.hour(), DEC);
  12. Serial.print(':');
  13. Serial.print(now.minute(), DEC);
  14. Serial.print(':');
  15. Serial.print(now.second(), DEC);
  16. Serial.println();

 

Υπάρχει σχεδόν μόνο ένας τρόπος για να πάρετε το χρόνο χρησιμοποιώντας το RTClib, το οποίο πρόκειται να καλέσετε now(), μια λειτουργία που επιστρέφει ένα αντικείμενο DateTime που περιγράφει το έτος, μήνα, ημέρα, ώρα, λεπτό και δευτερόλεπτο όταν καλείτε το now(),
Υπάρχουν μερικές βιβλιοθήκες RTC που για να τις χρησιμοποιήσετε τις καλείτε σαν  RTC.year () και RTC.hour () για να λάβετε το τρέχον έτος και ώρα. Εντούτοις, υπάρχει ένα πρόβλημα όπου, αν τυχαίνει να ζητάτε το λεπτό ακριβώς στις 3:14:59 λίγο πριν το επόμενο λεπτό, και στη συνέχεια το δεύτερο αμέσως μετά το λεπτό κυλάει (έτσι στις 3:15:00) θα δούμε την ώρα ως 3:14:00 που είναι ένα λεπτό νωρίτερα. Εάν το κάνατε, ο άλλος τρόπος γύρω σας θα μπορούσε να πάρει 3:15:59 - έτσι ένα λεπτό μακριά προς την άλλη κατεύθυνση.
Επειδή αυτό δεν είναι ένα ιδιαίτερα απίθανο περιστατικό -ιδίως αν ρωτάμε το χρόνο αρκετά συχνά- παίρνουμε ένα «στιγμιότυπο» του χρόνου από το RTC ταυτόχρονα και στη συνέχεια μπορούμε να το διαχωρίσουμε σε ημέρα () ή δεύτερη () όπως φαίνεται παραπάνω. Είναι μια μικρή προσπάθεια παραπάνω, αλλά πιστεύουμε ότι αξίζει τον κόπο για να αποφύγουμε τα λάθη!
Μπορούμε επίσης να αποκτήσουμε ένα 'timestamp' από το αντικείμενο DateTime κάνοντας κλήση του unixtime που μετράει τον αριθμό των δευτερολέπτων (χωρίς να υπολογίζονται τα πρόσθετα δευτερόλεπτα για συγχρονισμό με τον ηλιακό χρόνο) από τα μεσάνυχτα της 1ης Ιανουαρίου 1970.

 
  1. Serial.print(" since midnight 1/1/1970 = ");
  2. Serial.print(now.unixtime());
  3. Serial.print("s = ");
  4. Serial.print(now.unixtime() / 86400L);
  5. Serial.println("d");
 

 

Δεδομένου ότι υπάρχουν 60 * 60 * 24 = 86400 δευτερόλεπτα σε μια μέρα, μπορούμε εύκολα να μετράμε ημέρες από τότε. Αυτό μπορεί να είναι χρήσιμο όταν θέλετε να παρακολουθήσετε πόσο χρόνο έχει περάσει από το τελευταίο ερώτημα, κάνοντας κάποιους υπολογισμούς πολύ πιο εύκολους (όπως για να ελέγξετε εάν ήταν 5 λεπτά αργότερα, δείτε μόνο αν το unixtime () έχει αυξηθεί κατά 300, και δεν χρειάζεται να ανησυχείτε για τις αλλαγές ώρας).