สวัสดีครับ ในบทความนี้เราจะมาเพิ่ม Real Time Clock (RTC) ให้แก่บอร์ด CAT LoRa Starter Kit กันครับ
Real Time Clock (RTC) คืออะไร ?
เป็นอุปกรณ์ที่ให้ค่าเวลาตามจริง ทำงานโดยการจับสัญญานนาฬิกาที่ได้มาจาก Crystal มีถ่านสำรองมาให้เพื่อให้สามารถบันทึกเวลาได้ถึงแม้ว่าจะไม่มีไฟเลี้ยงมาที่ตัวบอร์ด ทำให้ไม่ต้องตั้งเวลาใหม่ทุกครั้ง โมดูล RTC นี้จำเป็นอย่างยิ่งกับการใช้งานที่ต้องมีการบันทึกเวลา (Time Stamp) หรือมีการทำงานที่เกี่ยวพันกับเวลาจริง เช่น การตั้งเวลาเปิดปิด Relay Module เป็นต้น
ความจริง Adafruit Feather M0 มีตัวจับเวลาอยู่แล้ว เช่นการใช้ฟังก์ชัน millis() เป็นต้น แต่การประมวลผลคำสั่งจะทำงานแบบ อนุกรม (Serial) คือ ทำทีละบรรทัด ทำให้การทำงานของคำสั่งจับเวลาจะถูกรบกวนจากการประมวลผลคำสั่งอื่น ๆ ไปด้วย เวลาที่ได้จากการใช้คำสั่งนี้เลยไม่สามารถนำมาเป็นเวลาตามจริงที่ต้องการบันทึกไปพร้อมกับค่าอื่น ๆ ที่ต้องการวัดได้ ดังนั้น ในการประยุกต์ใช้กับงานที่ต้องการเวลาที่แม่นยำ และสามารถบอก วันที่ เดือน ปี ชั่วโมง นาที วินาที จึงต้องใช้อุปกรณ์ที่ทำหน้าที่จับเวลาแยก
DS3231 เป็น RTC Module ที่มีข้อดีคือ มีการชดเชยการเปลี่ยนแปลงของสัญญาณนาฬิกา เนื่องจากการเปลี่ยนแปลงของอุณหภูมิแวดล้อมด้วย หรือก็คือ เวลาที่อุณหภูมิเปลี่ยน สัญญาณนาฬิกาจาก Crystal ก็เปลี่ยน ทำให้เวลาก็เพี้ยนไปด้วย แต่โมดูลนี้ได้ทำการวัดค่าอุณหภูมิพร้อมทั้งชดเชยความเปลี่ยนแปลงนี้ไปด้วยแล้ว ทำให้เวลาที่ได้มีความแม่นยำสูงมาก อีกทั้งยังใช้การเชื่อมต่อแบบบัส I2C ทำให้ง่ายต่อการใช้งานมาก
อุปกรณ์
- CAT LoRa Starter Kit
- DS3231 Module
การต่อวงจร
Library ที่จำเป็น
DS3231 Real-Time Clock: https://github.com/jarzebski/Arduino-DS3231
การเขียนโปรแกรมเพื่อเชื่อมต่อกับตัวโมดูล
ผลลัพธ์
เปิดดูใน Terminal
อธิบายการทำงาน
- include ไลบรารี่ชื่อ
Wire.h
และDS3231.h
เข้ามาในโปรเจค - สร้าง clock object โดยใช้คำสั่ง
DS3231 clock;
หรือDS3231 clock = new DS3231();
ก็ได้ - เปิดใช้งาน clock ในฟังชันก์ setup() โดยใช้คำสั่ง
clock.begin();
- ตั้งค่าเวลาเริ่มต้นโดย ในกรณีที่เชื่อมต่อกับคอมพิวเตอร์ผ่าน USB เราจะตั้งค่าเวลาเป็นเวลาปัจจุบันของเครื่องคอมพิวเตอร์ โดยใช้คำสั่ง
clock.setDateTime(__DATE__, __TIME__);
แต่ถ้าต่อกับแหล่งจ่ายไฟโดยตรงจะใช้ค่าเดิมที่เคยตั้งไว้แล้ว ซึ่งการ setDateTime(…) นี้มีได้หลายรูปแบบสามารถดูได้จาก DS3231.h - การเรียกเวลาปัจจุบันจะใช้คำสั่ง
RTCDateTime dt = clock.getDateTime();
ซึ่งจะได้ object ของ RTCDateTime ซึ่งจะมี 8 Attribute คืิอ year, month, day, hour, minute, second, dayOfWeek และ unixtime - สามารถดึงค่าอุณหภูมิได้โดยใช้คำสั่ง
clock.readTemperature();
แต่เนื่องจาก DS3231 จะทำการอัปเดตค่าอุณหภูมิทุก ๆ 64 วินาที ดังนั้นถ้าเราต้องการดึงค่าอุณหภูมิ ณ ปัจจุบันเราต้องใช้คำสั่งclock.forceConversion();
ก่อนการเรียกค่าอุณหภูมิ
ก็ขอจบบทความนี้แต่เพียงเท่านี้ สำหรับบทความหน้าจะเป็นการนำ DS3231 มาประยุกต์ใช้งาน โดยการตั้งเวลาการเปิด-ปิดหลอดไฟ LED ผ่านระบบเครือข่าย CAT LoRa กันครับ