DS3231: ρολόι και ημερολόγιο σε πραγματικό χρόνο για το Arduino

DS3231

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

Το DS3231 είναι η ενότητα που αναζητούσατε και εδώ θα βρείτε όλα όσα χρειάζεστε για τον έλεγχό του και θα σας δείξω επίσης ένα παράδειγμα του πώς ενσωματώστε το με το Arduino με ένα πρακτικό παράδειγμα ...

Τι είναι το DS3231;

DS3231

Πρώτα απ 'όλα, πρέπει να ξέρετε τι α RTC (Ρολόι πραγματικού χρόνου)ή ρολόι σε πραγματικό χρόνο. Αυτά τα τσιπ είναι πολύ συχνά σε πολλές εφαρμογές, στην πραγματικότητα, ο υπολογιστής σας διαθέτει ένα από αυτά στη μητρική πλακέτα σας και τροφοδοτείται επίσης από Μπαταρία CR2032 επίσης. Είναι αυτό που διατηρεί τον χρόνο και τη διαμόρφωση στο BIOS / UEFI και από το οποίο το λειτουργικό σύστημα το παίρνει κατά την εκκίνηση να είναι εγκαίρως (αν και τώρα, με το Διαδίκτυο, ο συγχρονισμός με διακομιστές μπορεί να χρησιμοποιηθεί για μεγαλύτερη ακρίβεια, αλλά αυτό είναι μια άλλη ιστορία…).

Αυτό που κάνει το RTC είναι η λήψη μετρήσεων χρόνου, τόσο απλών. Η διαφορά από άλλους τύπους ηλεκτρονικών ρολογιών είναι ότι απλά μετρήστε το χρόνο, και το κάνει μετρώντας τους παλμούς σήματος ρολογιού, γνωρίζοντας τη συχνότητα και τις περιόδους του. Εκτός από την ώρα, ένα RTC σας επιτρέπει επίσης να τηρείτε τις ημέρες, εβδομάδες, μήνες και έτη. Δηλαδή, η πλήρης ημερομηνία ...

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

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

Για έργα DIY, οι κατασκευαστές χρησιμοποιούν συνήθως δύο κοινά τσιπ RTC, τα οποία είναι DS1307 και DS3231. Και τα δύο κατασκευάζονται από τον Maxim (πρώην Dallas Semiconductor), και το DS3231 είναι το πιο ακριβές από τα δύο, καθώς δεν επηρεάζεται τόσο από τις διακυμάνσεις της θερμοκρασίας όσο το πρώτο. Επομένως, δεν κυμαίνεται τόσο πολύ ανάλογα με τη θερμοκρασία και διατηρεί τον χρόνο με μεγαλύτερη ακρίβεια.

Μερικές φορές, με αισθητές διαφορές θερμοκρασίας, το DS1307 μπορεί να καθυστερήσει όσο 1 ή 2 λεπτά ανά ημέρα. Κάτι απαράδεκτο για ορισμένες εφαρμογές.

Το DS3231 δεν είναι ότι δεν επηρεάζεται από παραλλαγές, αλλά ότι έχει ενσωματωμένα συστήματα μέτρησης θερμοκρασίας και αντιστάθμισης για να διασφαλίσει ακρίβεια 2ppm, που θα ισοδυναμούσε χρονική υστέρηση περίπου 172ms την ημέρα, δηλαδή λίγο περισσότερο από 1 δευτερόλεπτο την εβδομάδα το πολύ. Στην πράξη, συνήθως διαφέρουν μόνο 1 ή 2 δευτερόλεπτα το μήνα.

Όσο για τον τρόπο επικοινωνήστε με το RTC DS3131 για να λάβετε τις τιμές ημερομηνίας που λαμβάνει, γίνεται από Δίαυλος I2C. Και για ισχύ, μπορείτε να χρησιμοποιήσετε 2.3 έως 5.5v για το DS3231, το οποίο είναι κάπως χαμηλότερο από το 4.5 έως 5.5v για το DS1307, οπότε μπορεί να είναι πιο ενεργειακά αποδοτικό και να κάνει την μπαταρία να διαρκέσει περισσότερο.

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

εφαρμογές

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

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

Αγοράστε ένα RTC DS3231

Η ενότητα Το DS3131 είναι φθηνόκαι μπορείτε να το βρείτε σε ορισμένα εξειδικευμένα καταστήματα ηλεκτρονικών ειδών ή σε μεγάλα καταστήματα όπως το eBay, το AliExpress, το Amazon κ.λπ. Αν σας ενδιαφέρει να έχετε ένα, ακολουθούν ορισμένες προτάσεις:

DS3231 Arduino Integration

Στιγμιότυπο οθόνης Arduino IDE

Αν θέλετε ενσωματώστε το DS3231 με την πλακέτα Arduino και ξεκινήστε τη δημιουργία έργων "χρονισμένου", πρέπει πρώτα να κάνετε τις κατάλληλες συνδέσεις. Για να μπορέσετε να το συνδέσετε, είναι τόσο απλό όσο:

  • Ο πείρος SLC της πλακέτας DS3231 πρέπει να είναι συνδεδεμένος με το A5 του δικού σας Arduino UNO.
  • Το SDA του DS3231 συνδέεται με το A4 του Arduino.
  • Το Vcc από τη μονάδα θα πάει στο 5V από το Arduino.
  • GND σε GND.
Θυμηθείτε να εγκαταστήσετε τη βιβλιοθήκη για να χρησιμοποιήσετε το RTC DS3231 στο Arduino IDE σας, διαφορετικά ο κωδικός δεν θα λειτουργήσει ...

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

#include <Wire.h>
#include "RTClib.h"
 
// RTC_DS1307 rtc;
RTC_DS3231 rtc;
 
String daysOfTheWeek[7] = { "Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado" };
String monthsNames[12] = { "Enero", "Febrero", "Marzo", "Abril", "Mayo",  "Junio", "Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre" };
 
void setup() {
   Serial.begin(9600);
   delay(1000); 
 
   if (!rtc.begin()) {
      Serial.println(F("No se encuentra el RTC"));
      while (1);
   }
 
   // Si se ha perdido el suministro eléctrico, fijar fecha y hora
   if (rtc.lostPower()) {
      // Fijar a fecha y hora (poner la de compilación del sketch)
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      
      // Fijar a fecha y hora específica. En este ejemplo el 2021-01-01 a las 00:00:00
      // rtc.adjust(DateTime(2020, 1, 1, 0, 0, 0));
   }
}
//Imprimir completa obtenida la fecha en decimal
void printDate(DateTime date)
{
   Serial.print(date.year(), DEC);
   Serial.print('/');
   Serial.print(date.month(), DEC);
   Serial.print('/');
   Serial.print(date.day(), DEC);
   Serial.print(" (");
   Serial.print(daysOfTheWeek[date.dayOfTheWeek()]);
   Serial.print(") ");
   Serial.print(date.hour(), DEC);
   Serial.print(':');
   Serial.print(date.minute(), DEC);
   Serial.print(':');
   Serial.print(date.second(), DEC);
   Serial.println();
}
 
void loop() {
   // Obtener fecha actual y mostrar por Serial
   DateTime now = rtc.now();
   printDate(now);
 
   delay(3000);    //Espera 3 segundos
}

Και για να χρησιμοποιήσετε την ημερομηνία RTC έως προγραμματίστε κάποια εργασία, όπως για να ανάψετε ή να σβήσετε τα φώτα, για αυτόματο πότισμα ή για να ακούγεται συναγερμός κ.λπ. Να θυμάστε ότι για να χειριστείτε συσκευές υψηλότερης τάσης μπορείτε να χρησιμοποιήσετε τρανζίστορ ή αναμετάδοση:

#include <Wire.h>
#include "RTClib.h"
 
const int outputPin = LED_BUILTIN;
bool state = false;
 
// RTC_DS1307 rtc;
RTC_DS3231 rtc;
 
void setup() {
   Serial.begin(9600);
   delay(1000);
 
   if (!rtc.begin()) {
      Serial.println(F("Couldn't find RTC"));
      while (1);
   }
 
   if (rtc.lostPower()) {
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
   }
}
 
// Se comprueba si está programado el encendido
bool isScheduledON(DateTime date)
{
   int weekDay = date.dayOfTheWeek();
   float hours = date.hour() + date.minute() / 60.0;
 
   // Configuración de horas de 08:30 a 9:30 y de 22:00 a 23:00 (usando decimal)
   bool hourCondition = (hours > 8.50 && hours < 9.50) || (hours > 22.00 && hours < 23.00);
 
   // Configuración del día Lunes, Sábado y Domingo con números (recuerda que en inglés comienza la semana en Domingo=0, Lunes=1,...
   bool dayCondition = (weekDay == 1 || weekDay == 6 || weekDay == 0); 
   if (hourCondition && dayCondition)
   {
      return true;
   }
   return false;
}
 
void loop() {
   DateTime now = rtc.now();
 
   if (state == false && isScheduledON(now))      // Apagado
   {
      digitalWrite(outputPin, HIGH);
      state = true;
      Serial.print("Activado");
   }
   else if (state == true && !isScheduledON(now))  // Encendido
   {
      digitalWrite(outputPin, LOW);
      state = false;
      Serial.print("Desactivado");
   }
 
   delay(3000);
}


Γίνε ο πρώτος που θα σχολιάσει

Αφήστε το σχόλιό σας

Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα υποχρεωτικά πεδία σημειώνονται με *

*

*

  1. Υπεύθυνος για τα δεδομένα: Miguel Ángel Gatón
  2. Σκοπός των δεδομένων: Έλεγχος SPAM, διαχείριση σχολίων.
  3. Νομιμοποίηση: Η συγκατάθεσή σας
  4. Κοινοποίηση των δεδομένων: Τα δεδομένα δεν θα κοινοποιούνται σε τρίτους, εκτός από νομική υποχρέωση.
  5. Αποθήκευση δεδομένων: Βάση δεδομένων που φιλοξενείται από τα δίκτυα Occentus (ΕΕ)
  6. Δικαιώματα: Ανά πάσα στιγμή μπορείτε να περιορίσετε, να ανακτήσετε και να διαγράψετε τις πληροφορίες σας.