DS3231: ساعة وتقويم في الوقت الفعلي لاردوينو الخاص بك

DS3231

تتطلب بعض المشاريع تتبع الوقت، سواءً الساعة أو التاريخ. قد يكون ذلك لأداء وظائف معينة تعتمد على الوقت، أو لإدارة تقويم أو سجل أحداث، أو لتتبع الوقت في نظام ما، أو ببساطة لإنشاء ساعة رقمية باستخدام أردوينو . مع DS3231 ، يمكنك تحقيق ذلك؛ إنه مكون آخر أضفناه إلى قائمتنا.

وحدة DS3231 هي الوحدة التي كنت تبحث عنها، وستجد هنا كل ما تحتاجه للتحكم بها. سأعرض لك أيضًا مثالًا عمليًا لكيفية دمجها مع أردوينو ...

ما هو DS3231؟

DS3231

أولاً، يجب أن تعرف ما هي ساعة الوقت الحقيقي (RTC) . هذه الرقاقات شائعة جدًا في العديد من التطبيقات؛ في الواقع، يحتوي جهاز الكمبيوتر الخاص بك على واحدة على اللوحة الأم، وهي تعمل أيضًا ببطارية CR2032 . إنها المسؤولة عن تتبع الوقت والإعدادات في BIOS/UEFI، وهي ما يستخدمه نظام التشغيل للحفاظ على الوقت الصحيح عند بدء التشغيل (مع أنه يمكنك الآن، بفضل الإنترنت، استخدام المزامنة مع الخوادم لمزيد من الدقة، لكن هذا موضوع آخر...).

تقيس ساعة الوقت الحقيقي (RTC) الوقت ببساطة. على عكس أنواع الساعات الإلكترونية الأخرى، تقيس الوقت عن طريق عدّ نبضات إشارة الساعة، مع معرفة ترددها وفتراتها. بالإضافة إلى الوقت، تتتبع ساعة الوقت الحقيقي أيضًا الأيام والأسابيع والشهور والسنوات - أي التاريخ الكامل.

لكي يكون ذلك ممكناً، يجب أن تُزود الساعة الحقيقية (RTC) ببلورة كوارتز تعمل كمرنان لتوفير التردد. إضافةً إلى ذلك، تحتاج إلى دوائر إلكترونية قادرة على عدّ وتخزين التاريخ في الذاكرة. يجب أن تكون هذه الدوائر قادرة على عدّ الثواني والدقائق والساعات والأيام والأسابيع والشهور والسنوات.

هذه الذاكرة متطايرة ، ولذلك فهي تحتاج إلى البطارية لتوفير الطاقة باستمرار. إذا نفدت البطارية، فسيتم مسح البيانات. هذا ما يحدث لأجهزة الكمبيوتر عند نفاد البطارية؛ إذ تعرض وقتًا خاطئًا. إذا قمت بضبط الوقت أثناء تشغيل الكمبيوتر، فسيظل الوقت صحيحًا لأن ساعة الوقت الحقيقي (RTC) تتلقى الطاقة، ولكن الحاجة إلى البطارية تظهر أثناء العمليات التي يكون فيها الكمبيوتر مطفأً.

في مشاريع التصنيع الذاتي، يستخدم المصممون عادةً شريحتين شائعتين لساعة الوقت الحقيقي: DS1307 وDS3231 . تُصنّع كلتاهما من قبل شركة ماكسيم (دالاس سيميكوندكتور سابقًا)، وتُعدّ DS3231 أكثر دقةً من DS1307، لأنها أقل تأثرًا بتغيرات درجة الحرارة. لذا، لا تتأثر دقتها كثيرًا بتغيرات درجة الحرارة، وتحافظ على دقة أعلى في الوقت.

في بعض الأحيان ، مع وجود اختلافات ملحوظة في درجة الحرارة ، يمكن أن يتأخر DS1307 بمقدار دقيقة أو دقيقتين في اليوم. شيء لا يطاق بالنسبة لبعض التطبيقات.

لا يخلو جهاز DS3231 من التأثر بالتغيرات؛ بل إنه مزود بأنظمة قياس وتعويض درجة الحرارة مدمجة لضمان دقة تصل إلى 2 جزء في المليون، وهو ما يعادل تأخيرًا زمنيًا يبلغ حوالي 172 مللي ثانية يوميًا، أو ما يزيد قليلاً عن ثانية واحدة أسبوعيًا كحد أقصى. لكن عمليًا، لا يتجاوز التباين عادةً ثانية أو ثانيتين شهريًا.

أما بالنسبة لكيفية تواصله مع ساعة الوقت الحقيقي DS3131 للحصول على قيم التاريخ، فيتم ذلك عبر ناقل I2C . وبالنسبة للطاقة، يمكنك استخدام جهد يتراوح بين 2.3 و5.5 فولت مع DS3231، وهو أقل قليلاً من جهد DS1307 الذي يتراوح بين 4.5 و5.5 فولت، مما يجعله أكثر كفاءة في استهلاك الطاقة ويطيل عمر البطارية.

بالإضافة إلى ذلك، يجب أن تعلم أن هذه الوحدات عادة ما تحتوي على ذاكرة EEPROM إضافية من نوع AT24C32 لتخزين بعض القراءات والقياسات السابقة، وهو أمر مفيد للغاية.

التطبيقات

أما بالنسبة للتطبيقات، فقد ذكرت بعضها بالفعل، مثل تنفيذ ساعة باستخدام أردوينو، وإنشاء نظام يعمل وفقًا للوقت ، والحفاظ على الوقت على معدات مثل أجهزة الكمبيوتر والعديد من الأجهزة الإلكترونية والأجهزة الأخرى التي تحتوي على وقت، وما إلى ذلك.

ويمكن استخدامه أيضاً في مشاريع لإنشاء مؤقتات للإضاءة وأنظمة الري ومسجلات البيانات، وما إلى ذلك. التطبيقات عديدة...

اشترِ RTC DS3231

وحدة DS3131 غير مكلفة ويمكن العثور عليها في بعض متاجر الإلكترونيات أو في الأسواق الإلكترونية الكبيرة مثل eBay وAliExpress وAmazon وغيرها. إذا كنت مهتمًا بالحصول على واحدة، فإليك بعض التوصيات:

DS3231 تكامل اردوينو

لقطة شاشة لـ Arduino IDE

إذا كنت ترغب في دمج جهاز DS3231 مع لوحة أردوينو الخاصة بك والبدء في إنشاء مشاريع مؤقتة، فيجب عليك أولاً إجراء التوصيلات اللازمة. عملية التوصيل بسيطة للغاية:

  • يجب توصيل سن SLC للوحة DS3231 بـ A5 الخاص بك Arduino UNO.
  • SDA الخاص بـ DS3231 متصل بـ A4 من Arduino.
  • سيذهب Vcc من الوحدة النمطية إلى 5V من Arduino.
  • GND إلى GND.
تذكر تثبيت المكتبة لاستخدام RTC DS3231 في Arduino IDE الخاص بك وإلا فلن يعمل الرمز ...

بعد توصيل النظام، تتمثل الخطوة التالية في كتابة الكود المصدري للبرنامج . يمكنك تعديل الكود وتكييفه حسب احتياجاتك، ولكن يمكنك البدء ببساطة بالحصول على التاريخ من ساعة الوقت الحقيقي DS3231 المتصلة بلوحة أردوينو.

#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
}

ويمكن استخدام تاريخ الساعة الحقيقية لجدولة مهمة ما ، مثل تشغيل أو إطفاء الأضواء، أو الري التلقائي، أو تشغيل جهاز إنذار، وما إلى ذلك. تذكر أنه للتحكم في الأجهزة ذات الجهد العالي، يمكنك استخدام الترانزستورات أو المرحلات.

#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);
}


أضف كمصدر مفضل في جوجل