DS3231 RTC คืออะไร? โมดูลนาฬิกาความแม่นยำสูง
DS3231 คือ โมดูลนาฬิกาเรียลไทม์ (RTC - Real Time Clock) ความแม่นยำสูง ใช้สำหรับเก็บข้อมูลวันที่และเวลาอย่างต่อเนื่องและถูกต้อง แม้ว่าแหล่งจ่ายไฟหลักของระบบจะถูกปิดหรือตัดการเชื่อมต่อออกไปก็ตาม เนื่องจากมีแบตเตอรี่สำรอง (CR2032) ในตัวเพื่อรักษาเวลาไว้
โมดูลนี้เหมาะอย่างยิ่งสำหรับโปรเจกต์ที่ต้องการความเที่ยงตรงของเวลา เช่น ระบบบันทึกข้อมูล (Data Logger), นาฬิกาปลุก, ระบบตั้งเวลาเปิด-ปิดอุปกรณ์อัตโนมัติ และอื่นๆ
สเปคของ DS3231 RTC
แรงดันไฟฟ้าใช้งาน |
3.3V – 5.5V (ใช้ได้ทั้ง Arduino และ Raspberry Pi) |
การสื่อสาร |
I2C (SCL, SDA) |
ความแม่นยำ |
±2 นาทีต่อปี (แม่นยำกว่า DS1307 มาก) |
แบตเตอรี่สำรอง |
CR2032 (รักษาเวลาได้นานหลายปีแม้ไม่มีไฟเลี้ยง) |
ช่วงปีที่รองรับ |
ค.ศ. 2000 – 2099 |
คุณสมบัติพิเศษ |
มีวงจรชดเชยอุณหภูมิในตัว (Temperature-compensated) ทำให้เวลาไม่เพี้ยนตามอุณหภูมิที่เปลี่ยนไป |
การใช้งานกับ Arduino
✅ การต่อสายกับ Arduino UNO
ขาบน DS3231 |
ต่อกับขาบน Arduino UNO |
VCC |
5V |
GND |
GND |
SDA |
A4 |
SCL |
A5 |
หมายเหตุ: Arduino รุ่นอื่นอาจใช้ขา I2C ที่แตกต่างกัน (เช่น Mega 2560 ใช้ขา 20, 21) กรุณาตรวจสอบ Pinout ของบอร์ดที่ใช้
✅ ตัวอย่างโค้ด Arduino
ต้องติดตั้งไลบรารี RTClib by Adafruit ก่อนใช้งานผ่าน Library Manager ของ Arduino IDE
#include <Wire.h>
#include <RTClib.h>
RTC_DS3231 rtc;
void setup() {
Serial.begin(9600);
Wire.begin();
rtc.begin();
// ----- ตั้งเวลาเริ่มต้น (สำคัญมาก!) -----
// หากเป็นครั้งแรก ให้ยกเลิกคอมเมนต์บรรทัดล่างนี้เพื่อตั้งเวลาปัจจุบัน
// จากนั้นคอมเมนต์กลับเหมือนเดิม แล้วอัปโหลดโค้ดอีกครั้ง
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// ตรวจสอบว่าไฟเคยดับหรือไม่
if (rtc.lostPower()) {
Serial.println("RTC lost power, let's set the time!");
// ตั้งเวลาเริ่มต้นหากไม่มีการตั้งค่ามาก่อน
// rtc.adjust(DateTime(2025, 8, 7, 10, 0, 0));
}
}
void loop() {
DateTime now = rtc.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.println(now.second(), DEC);
delay(1000);
}
ข้อควรจำ: บรรทัด rtc.adjust(...)
ใช้สำหรับตั้งเวลาเริ่มต้นให้กับโมดูลเพียง "ครั้งเดียว" เท่านั้น หลังจากอัปโหลดโค้ดครั้งแรกเพื่อให้เวลาตรงแล้ว ให้ใส่คอมเมนต์ (//) นำหน้าบรรทัดนั้น แล้วอัปโหลดโค้ดอีกครั้ง เพื่อไม่ให้เวลาถูกรีเซ็ตใหม่ทุกครั้งที่บอร์ดเริ่มทำงาน
การใช้งานกับ Raspberry Pi
✅ การติดตั้งและตรวจสอบ
เปิด Terminal และรันคำสั่งต่อไปนี้:
sudo apt-get update
sudo apt-get install i2c-tools python3-smbus
จากนั้นตรวจสอบว่า Raspberry Pi มองเห็นโมดูลหรือไม่:
sudo i2cdetect -y 1
หากการเชื่อมต่อถูกต้อง คุณจะเห็นเลข 0x68 ปรากฏบนตาราง ซึ่งเป็น I2C Address ของ DS3231
หลังจากนั้นสามารถใช้ไลบรารี Python เช่น adafruit-circuitpython-ds3231
เพื่อเขียนโปรแกรมอ่านและตั้งค่าเวลาได้
ไอเดียการประยุกต์ใช้งาน
โปรเจกต์ |
การใช้งาน RTC |
Data Logger |
บันทึกค่าจากเซนเซอร์ต่างๆ พร้อมประทับเวลา (Timestamp) ที่แม่นยำ |
ระบบเปิด-ปิดไฟอัตโนมัติ |
ตั้งเวลาเปิดไฟตอน 18:00 น. และปิดตอน 06:00 น. ของทุกวัน |
นาฬิกา DIY |
สร้างนาฬิกาดิจิทัลของตัวเองโดยแสดงผลบนจอ LCD หรือ OLED |
ระบบรดน้ำต้นไม้อัตโนมัติ |
สั่งให้ปั๊มน้ำทำงานตามเวลาที่กำหนดไว้ เช่น 07:00 น. และ 17:00 น. |
ระบบเตือนหรือนาฬิกาปลุก |
ตั้งเวลาเพื่อให้ Buzzer, LED หรืออุปกรณ์อื่นๆ ทำงานเมื่อถึงเวลาที่กำหนด |
ข้อดีของ DS3231
-
แม่นยำสูงมาก เมื่อเทียบกับ RTC รุ่นยอดนิยมอย่าง DS1307
-
มีแบตเตอรี่สำรอง ทำให้เวลาเดินต่อเนื่องแม้ไม่มีไฟเลี้ยง
-
ใช้งานได้หลายแพลตฟอร์ม ทั้ง Arduino, ESP32, Raspberry Pi และอื่นๆ
-
สื่อสารผ่าน I2C ทำให้ประหยัดขาและสามารถต่ออุปกรณ์อื่นบนบัสเดียวกันได้