الوصف
وحدة الساعة الفعلية RTC DS3231
وحدة DS3231 هي ساعة فعلية (RTC) عالية الدقة لحفظ الوقت والتاريخ. تتضمن مذبذباً بلورياً معوضاً حرارياً (TCXO) وبطارية احتياطية لمواصلة عمل الساعة عند انقطاع التغذية.
المواصفات التفصيلية
- جهد التشغيل: من 2.3 إلى 5.5 V
- استهلاك التيار: أقل من 300 µA أثناء التشغيل؛ و500 nA في وضع البطارية الاحتياطية
- درجة حرارة التشغيل: من −45 إلى +80 °C
- الدقة: ±2 ppm من 0 إلى +40 °C (±1 دقيقة/سنة)
- البطارية الاحتياطية: CR2032 بعمر نموذجي من سنتين إلى 3 سنوات
- البطارية: CR2032 غير مرفقة
- الواجهة: I2C بسرعة 400 kHz
- الوظائف: الثواني والدقائق والساعات والأيام والتواريخ والأشهر والسنوات؛ التعامل مع السنوات الكبيسة؛ منبهان؛ خرج موجة مربعة قابل للبرمجة
- الأبعاد: 38 × 22 × 14 مم
- الوزن: 8 g مع البطارية
طريقة العمل
تحافظ DS3231 على الوقت والتاريخ بدقة وتتصل بالمتحكم الدقيق عبر I2C. عند توفر التغذية الرئيسية تستخدمها، وتنتقل تلقائياً إلى البطارية الاحتياطية عند انقطاعها، لضمان استمرار حفظ الوقت.
الاستخدامات
- الساعات الرقمية
- أنظمة إدارة الطاقة
- ملحقات الحاسوب
- أنظمة GPS
- الأتمتة الصناعية
توزيع الأطراف
- VCC: التغذية (2.3–5.5 V)
- GND: الأرضي
- SDA: بيانات تسلسلية (I2C)
- SCL: ساعة تسلسلية (I2C)
- SQW: خرج موجة مربعة
- 32K: خرج مذبذب 32 kHz
استخدام الوحدة مع Arduino
صل أطراف VCC وGND وSDA وSCL في الوحدة بالتوصيلات المقابلة في Arduino. استخدم مكتبة مثل RTClib لتسهيل الاتصال.
الاستخدام مع Arduino Uno — مثال أساسي
وظيفة الكود الأساسي
يهيئ هذا المثال وحدة DS3231 ويعرض الوقت والتاريخ الحاليين على Serial Monitor. إذا فقدت الوحدة التغذية، يعيد ضبط الوقت اعتماداً على تاريخ ووقت ترجمة البرنامج.
مكونات المثال الأساسي
- Arduino Uno
- وحدة RTC DS3231
- أسلاك توصيل
كود Arduino الأساسي
#include <Wire.h> // Inclusion de la bibliothèque Wire pour I2C
#include "RTClib.h" // Inclusion de la bibliothèque RTClib pour le module RTC DS3231
RTC_DS3231 rtc; // Création de l'objet RTC pour le module DS3231
// Constantes
const int DELAY_TIME = 1000; // Délai entre les lectures en millisecondes
void setup() {
Serial.begin(9600); // Initialiser la communication série à 9600 bauds
// Vérification de la connexion du module RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC"); // Afficher un message d'erreur si le module RTC n'est pas trouvé
while (1); // Arrêter le programme si le RTC n'est pas trouvé
}
// Vérification de la perte d'alimentation du RTC
if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!"); // Afficher un message si le RTC a perdu l'alimentation
// Initialiser l'heure avec la date et l'heure de compilation (ajuster pour le fuseau horaire si nécessaire)
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
DateTime now = rtc.now(); // Obtenir l'heure actuelle du RTC
// Vérification de la validité de la date/heure actuelle
if (!now.isValid()) {
Serial.println("Error: Invalid date/time"); // Afficher un message d'erreur si la date/heure est invalide
return;
}
// Affichage de l'heure et de la date actuelles sur le moniteur série
Serial.print(now.year(), DEC); // Afficher l'année
Serial.print('/');
Serial.print(now.month(), DEC); // Afficher le mois
Serial.print('/');
Serial.print(now.day(), DEC); // Afficher le jour
Serial.print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); // Afficher le jour de la semaine
Serial.print(") ");
Serial.print(now.hour(), DEC); // Afficher l'heure
Serial.print(':');
Serial.print(now.minute(), DEC); // Afficher les minutes
Serial.print(':');
Serial.print(now.second(), DEC); // Afficher les secondes
Serial.println();
delay(DELAY_TIME); // Attendre avant la prochaine lecture
}
شرح الكود الأساسي
- إضافة المكتبات: تتيح
Wire.hوRTClib.hالاتصال بوحدة DS3231 عبر I2C. - تعريف ثابت: يحدد
DELAY_TIMEالفاصل بين قراءات الساعة وتحديث العرض. - إنشاء كائن RTC: ينشئ
RTC_DS3231 rtcكائناً للتعامل مع الوحدة. - داخل
setup():- بدء الاتصال التسلسلي بسرعة 9600 baud باستخدام
Serial.begin(9600). - التحقق من اتصال الوحدة بواسطة
rtc.begin()وإظهار خطأ إذا لم يتم العثور عليها. - التحقق من انقطاع التغذية بواسطة
rtc.lostPower()، ثم ضبط الوقت باستخدام تاريخ ووقت ترجمة البرنامج عبرrtc.adjust(DateTime(F(__DATE__), F(__TIME__)))عند الحاجة.
- بدء الاتصال التسلسلي بسرعة 9600 baud باستخدام
- داخل
loop():- قراءة الوقت الحالي باستخدام
rtc.now()وحفظه فيDateTime now. - التحقق من صلاحية التاريخ والوقت باستخدام
now.isValid(). - طباعة الوقت والتاريخ الحاليين على Serial Monitor.
- الانتظار قبل القراءة التالية باستخدام
delay(DELAY_TIME).
- قراءة الوقت الحالي باستخدام
عرض أيام الأسبوع
لعرض أيام الأسبوع، أضف مصفوفة للتحويل مثل المثال التالي:
const char* daysOfTheWeek[7] = {"Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"};
التوصيل الأساسي مع Arduino Uno
- VCC: إلى طرف 5V في Arduino
- GND: إلى طرف GND في Arduino
- SDA: إلى طرف A4 في Arduino
- SCL: إلى طرف A5 في Arduino
مثال متقدم باستخدام شاشة 7-segment مع معالجة الأخطاء
#include <Wire.h>
#include <RTClib.h>
#include <SevSeg.h>
// Constantes
const int DELAY_TIME = 1000; // Délai entre les lectures en millisecondes
RTC_DS3231 rtc; // Définir l'objet RTC
SevSeg sevseg; // Définir l'objet pour l'écran 7 segments
void setup() {
// Initialisation de la communication série
Serial.begin(9600);
// Initialisation de l'écran 7 segments
byte numDigits = 4;
byte digitPins[] = {2, 3, 4, 5};
byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
bool resistorsOnSegments = true;
bool updateWithDelays = false;
bool leadingZeros = true;
bool disableDecPoint = false;
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros, disableDecPoint);
sevseg.setBrightness(90);
// Initialisation du RTC
if (!rtc.begin()) {
Serial.println("Erreur : RTC non trouvé");
while (1); // Arrêter le programme si le RTC n'est pas trouvé
}
if (rtc.lostPower()) {
Serial.println("Le RTC a perdu l'alimentation, réglons l'heure !");
// Définir l'heure avec la date et l'heure de compilation
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
// Lecture de l'heure actuelle
DateTime now = rtc.now();
// Format de l'affichage : HHMM
int displayTime = now.hour() * 100 + now.minute();
sevseg.setNumber(displayTime, 2); // Afficher le temps sur 4 chiffres avec 2 chiffres après le point
// Afficher l'heure et la date sur le moniteur série
Serial.print("Heure : ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.print(" Date : ");
Serial.print(now.day(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.year(), DEC);
Serial.println();
sevseg.refreshDisplay(); // Rafraîchir l'affichage 7 segments
delay(DELAY_TIME); // Attendre avant la prochaine lecture
}
وظيفة الكود المتقدم
يقرأ هذا المثال الوقت والتاريخ من DS3231 ثم يعرضهما على شاشة 7-segment.
شرح الكود المتقدم
- إضافة المكتبات: توفر
Wire.hوRTClib.hوSevSeg.hالاتصال عبر I2C ووظائف الساعة والتحكم في شاشة 7-segment. - تحديد الفاصل: يحدد
DELAY_TIMEالزمن بين قراءات RTC وتحديث الشاشة. - تهيئة الاتصال التسلسلي والشاشة: يبدأ الاتصال التسلسلي بسرعة 9600 baud، وتُهيأ الشاشة وفق أطرافها وبوضع الكاثود المشترك.
- تهيئة RTC: التحقق من اتصال الوحدة، وضبط الساعة بتاريخ ووقت ترجمة البرنامج إذا انقطعت التغذية.
- قراءة القيم وعرضها: قراءة الوقت وتنسيقه لشاشة 7-segment، مع طباعة الوقت والتاريخ أيضاً على Serial Monitor.
- تحديث الشاشة: عرض الوقت بتنسيق HHMM وتحديث الشاشة في كل دورة من
loop().
مكونات المثال المتقدم
- Arduino Uno
- وحدة RTC DS3231
- شاشة 7-segment (12 طرفاً، كاثود مشترك، 4 أرقام مع نقطتين عشريتين)
- أسلاك توصيل
التوصيل التفصيلي: وحدة DS3231 RTC وشاشة 7-segment
صل وحدة DS3231 والشاشة بـ Arduino Uno كما يلي.
توصيلات DS3231 RTC
- VCC: طرف 5V في Arduino Uno
- GND: طرف GND في Arduino Uno
- SDA: طرف A4 في Arduino Uno (بيانات I2C)
- SCL: طرف A5 في Arduino Uno (ساعة I2C)
توصيلات شاشة 7-segment (كاثود مشترك، 4 أرقام، نقطتان عشريتان)
- Digit 1 (الطرف 1): طرف Arduino Uno رقم 2
- Digit 2 (الطرف 2): طرف Arduino Uno رقم 3
- Digit 3 (الطرف 6): طرف Arduino Uno رقم 4
- Digit 4 (الطرف 8): طرف Arduino Uno رقم 5
- Segment A (الطرف 14): طرف Arduino Uno رقم 6
- Segment B (الطرف 16): طرف Arduino Uno رقم 7
- Segment C (الطرف 13): طرف Arduino Uno رقم 8
- Segment D (الطرف 3): طرف Arduino Uno رقم 9
- Segment E (الطرف 5): طرف Arduino Uno رقم 10
- Segment F (الطرف 11): طرف Arduino Uno رقم 11
- Segment G (الطرف 15): طرف Arduino Uno رقم 12
- النقطة DP (الطرف 9): طرف Arduino Uno رقم 13 (اختياري)
ملاحظات
- تحقق من مواصفات شاشة 7-segment، فقد يختلف توزيع أطرافها بحسب الطراز.
- استخدم مقاومات مناسبة للحد من التيار في المقاطع، عادةً من 220 إلى 330 Ω.
- تحقق من القطبية الصحيحة للتوصيلات لتجنب إتلاف المكونات.
تثبيت المكتبات
للمثالين الأساسي والمتقدم، ثبّت RTClib من مدير المكتبات في Arduino IDE. ولمثال شاشة 7-segment، ثبّت أيضاً SevSeg:
- افتح Arduino IDE.
- اختر Sketch → Include Library → Manage Libraries…
- ابحث عن
RTClibوSevSegثم اختر Install.
ورقة البيانات
ورقة بيانات DS3231 RTC
كلمات مفتاحية: ساعة فعلية، RTC، I2C، دقة الساعة، بطارية احتياطية، وحدة DS3231، طابع زمني، تعويض حراري.





