⏰ ماژول ساعت RTC (DS3231) (DS3231 Real-Time Clock Module)
| اسم انگلیسی | DS3231 Real-Time Clock Module |
|---|---|
| در ووکوی (Wokwi) | نسخهی آمادهای سراغ نداریم |
| دسته | 📦 ماژولها |
| در شبیهساز فارسی | مود آردوینو · رایگان |
ماژول ساعت DS3231 (Real-Time Clock) ساعت و تاریخ را جدا از آردوینو نگه میدارد و با یک باتری سکهای حتی وقتی برد خاموش است میشمارد. آردوینو با millis فقط میداند چقدر از روشن شدنش گذشته؛ برای ساعت رومیزی، زنگ هشدار، ثبت داده با تاریخ یا روشن کردن پمپ آبیاری سر یک ساعت مشخص، به یک RTC مثل DS3231 نیاز داری.
ساعت RTC در ووکوی (Wokwi)
تا جایی که میدانیم ووکوی نسخهی آمادهی DS3231 را ندارد. نزدیکترین قطعه wokwi-ds1307 است با پایههای GND، 5V، SDA، SCL و SQW. تراشه فرق دارد: DS1307 دماسنج داخلی ندارد، دقتش کمتر است و در کتابخانه بهجای lostPower تابع isrunning دارد. ولی آدرس I2C هر دو 0x68 است و سیمکشی یکی است:
{
"version": 1,
"parts": [
{ "type": "wokwi-arduino-uno", "id": "uno", "top": 0, "left": 0, "attrs": {} },
{ "type": "wokwi-ds1307", "id": "rtc1", "top": -110, "left": 120, "attrs": {} }
],
"connections": [
[ "rtc1:GND", "uno:GND.1", "black", [] ],
[ "rtc1:5V", "uno:5V", "red", [] ],
[ "rtc1:SDA", "uno:A4", "green", [] ],
[ "rtc1:SCL", "uno:A5", "blue", [] ]
]
}
خود DS3231 در تینکرکد فارسی شبیهسازی میشود و جزو اشتراک پلاس است؛ مثالهای آمادهاش برای خواندن رایگان باز میشوند و برای اجرا پلاس لازم داری.
سیمکشی با آردوینو
| پایهی ماژول DS3231 | وصل به |
|---|---|
| VCC | 5V |
| GND | GND |
| SDA | A4 |
| SCL | A5 |
| SQW | اختیاری؛ برای وقفهی زنگ هشدار به پین 2 |
| 32K | وصل نمیشود |
روی آردوینو مگا SDA و SCL روی پایههای 20 و 21 هستند و روی ESP32 معمولاً 21 و 22. بیشتر ماژولهای DS3231 یک حافظهی EEPROM کوچک هم روی همان باس I2C دارند که برای کار ساعت لازمش نداری.
کد نمونه
// DS3231 clock with RTClib: date, time and the chip temperature
#include <Wire.h>
#include <RTClib.h>
RTC_DS3231 rtc; // in Wokwi use RTC_DS1307 (see the note below)
void setup() {
Serial.begin(9600);
if (!rtc.begin()) {
Serial.println("RTC not found - check SDA and SCL");
while (true) {}
}
if (rtc.lostPower()) {
// set the clock once, from the time this sketch was compiled
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
DateTime now = rtc.now();
char stamp[] = "YYYY-MM-DD hh:mm:ss";
Serial.print(now.toString(stamp));
Serial.print(" chip: ");
Serial.print(rtc.getTemperature());
Serial.println(" C");
delay(1000);
}
برای اجرا در ووکوی سه تغییر بده: RTC_DS3231 را به RTC_DS1307 عوض کن، شرط rtc.lostPower() را !rtc.isrunning() کن و دو خط دمای تراشه را پاک کن، چون DS1307 دماسنج ندارد. کتابخانهی RTClib از Adafruit برای هر دو کافی است.
اشتباههای رایج
- adjust بیشرط: اگر
rtc.adjustبیرون از شرط باشد، هر ریست ساعت را به زمان کامپایل برمیگرداند. - بدون باتری سکهای: بدون باتری، با هر قطع برق ساعت از اول شروع میشود و هدف RTC از بین میرود.
- مدار شارژ روی ماژول: بعضی ماژولهای ارزان DS3231 سعی میکنند باتری را شارژ کنند. اگر باتری CR2032 معمولی (غیرشارژی) گذاشتهای، این مدار به آن آسیب میزند؛ مشخصات ماژولت را چک کن.
- A4 و A5 برای کار دیگر: وقتی این دو پایهی I2C هستند،
analogReadیا LED رویشان ارتباط با ساعت را خراب میکند.
آموزشهای مرتبط
- ماژول ساعت DS3231 با آردوینو
- پروژهی ساعت زنگدار (Alarm Clock) در تینکرکد فارسی
- ساعت اینترنتی با ESP32 و NTP
- LCD 16×2 با ماژول I2C برای نمایش ساعت
- باتری سکهای
سؤالهای رایج
ووکوی DS3231 دارد؟
تا جایی که میدانیم نه؛ نزدیکترین قطعهاش wokwi-ds1307 است که همان آدرس I2C یعنی 0x68 را دارد. کد RTClib با عوض کردن RTC_DS3231 به RTC_DS1307 و دو تغییر کوچک روی آن اجرا میشود.
چرا هر بار که آردوینو ریست میشود ساعت به عقب برمیگردد؟
احتمالاً rtc.adjust را بیشرط در setup گذاشتهای. این دستور ساعت را روی زمان کامپایل تنظیم میکند؛ آن را فقط وقتی اجرا کن که ساعت برقش را از دست داده باشد، یعنی داخل شرط lostPower.
DS3231 بهتر است یا DS1307؟
DS3231 کریستال داخلی جبرانشده با دما دارد و دقتش حدود یک دقیقه در سال است، یک دماسنج داخلی هم دارد. DS1307 ارزانتر است ولی کریستالش بیرونی است و با سرد و گرم شدن هوا بیشتر جلو و عقب میرود.