وحدة الساعة الفعلية RTC DS3231

38,00 DH

التوفر:

298 متوفر في المخزون

رمز المنتج: 0121 التصنيفات: ,

الوصف

وحدة الساعة الفعلية 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
}

شرح الكود الأساسي

  1. إضافة المكتبات: تتيح Wire.h وRTClib.h الاتصال بوحدة DS3231 عبر I2C.
  2. تعريف ثابت: يحدد DELAY_TIME الفاصل بين قراءات الساعة وتحديث العرض.
  3. إنشاء كائن RTC: ينشئ RTC_DS3231 rtc كائناً للتعامل مع الوحدة.
  4. داخل setup():
    • بدء الاتصال التسلسلي بسرعة 9600 baud باستخدام Serial.begin(9600).
    • التحقق من اتصال الوحدة بواسطة rtc.begin() وإظهار خطأ إذا لم يتم العثور عليها.
    • التحقق من انقطاع التغذية بواسطة rtc.lostPower()، ثم ضبط الوقت باستخدام تاريخ ووقت ترجمة البرنامج عبر rtc.adjust(DateTime(F(__DATE__), F(__TIME__))) عند الحاجة.
  5. داخل 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.

شرح الكود المتقدم

  1. إضافة المكتبات: توفر Wire.h وRTClib.h وSevSeg.h الاتصال عبر I2C ووظائف الساعة والتحكم في شاشة 7-segment.
  2. تحديد الفاصل: يحدد DELAY_TIME الزمن بين قراءات RTC وتحديث الشاشة.
  3. تهيئة الاتصال التسلسلي والشاشة: يبدأ الاتصال التسلسلي بسرعة 9600 baud، وتُهيأ الشاشة وفق أطرافها وبوضع الكاثود المشترك.
  4. تهيئة RTC: التحقق من اتصال الوحدة، وضبط الساعة بتاريخ ووقت ترجمة البرنامج إذا انقطعت التغذية.
  5. قراءة القيم وعرضها: قراءة الوقت وتنسيقه لشاشة 7-segment، مع طباعة الوقت والتاريخ أيضاً على Serial Monitor.
  6. تحديث الشاشة: عرض الوقت بتنسيق 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:

  1. افتح Arduino IDE.
  2. اختر Sketch → Include Library → Manage Libraries…
  3. ابحث عن RTClib وSevSeg ثم اختر Install.

ورقة البيانات

ورقة بيانات DS3231 RTC
كلمات مفتاحية: ساعة فعلية، RTC، I2C، دقة الساعة، بطارية احتياطية، وحدة DS3231، طابع زمني، تعويض حراري.

شكرًا لولائك!

AR