บทที่ 10: การเขียนโปรแกรมอ่านข้อมูลไอซีฐานเวลา (Real Time Clock) เบอร์ DS3231
ในการออกแบบระบบควบคุมบางครั้งมีความจำเป็น ต้องมีฐานเวลาเป็นข้อมูลในการตัดสินใจการ
ทำงานให้กับไมโครคอนโทรลเลอร์ เช่นระบบที่ต้องทำงานเปิด-ปิดตามเวลา หรือการตั้งเวลาการทำงานของวาล์วน้ำในระบบสมาร์ทฟาร์มเป็นต้น ซึ่งใน Arduino และ ESP32 ไม่มีวงจรฐานเวลาอยู่ภายในตัวไมโครคอนโทรลเลอร์
โมดูล หรือไอซีฐานเวลา (RTC: Real Time Clock) เป็นอุปกรณ์ที่ให้ค่าเวลาตามฐานเวลาจริง ซึ่งการทำงานของมัน จะทำงานโดยตัวกำเนิดสัญญาณนาฬิกา (Crystal)ภายนอก ที่ต่อเข้าไปหรือบางตัวจะมีตัวกำเนิดสัญญาณนาฬิกาภายในตัวของมันเอง ซึ่งจะทำงานที่ความถี่ 32.768 kHz ทำให้การนับเวลาของมันค่อนข้างแม่นยำมากเลยครับ สำหรับงานที่เกี่ยวกับ การบันทึกเวลา หรือพวก Data logger ตัวอุปกรณ์ RTC จึงมีความจำเป็นอย่างมาก
บอร์ด Arduino Learning Kit ได้ติดตั้งไอซีเบอร์ DS3231 ไว้บนบอร์ดเป็นที่เรียบร้อยแล้ว และยังมีแบตเตอรี่ 3V จะถูกติดตั้งอยู่ใต้บอร์ดอีกด้วย มาดูรายละเอียดของไอซี DS3231(RTC) กันก่อนสักเล็กน้อยครับ
DS3231 คือไอซีฐานเวลาที่มีสัญญาณนาฬิกาภายในตัว มีการชดเชยการเปลี่ยนแปลงของสัญญาณนาฬิกา เนื่องจากการเปลี่ยนแปลงของอุณหภูมิแวดล้อม ซึ่งมักจะพบปัญหาจากไอซีตระกูลอื่นคือเวลาอุณหภูมิเปลี่ยน สัญญาณนาฬิกาจาก Crystal ก็เปลี่ยน ทำให้เวลาก็เพี้ยนไปด้วย แต่ DS3231 นี้ได้ทำการวัดค่าอุณหภูมิพร้อมทั้งชดเชยความเปลี่ยนแปลงนี้ไปด้วยแล้ว ทำให้เวลาที่ได้มีความแม่นยำสูงมาก

นอกจากนี้ไอซี DS3231 ยังมีเซนเซอร์วัดอุณหภูมิในตัว ซึ่งเราสามารถนำค่าอุณหภูมิที่วัดได้ นำไปใช้งานได้อีกด้วย

ในการเชื่อมต่อกับไมโครคอนโทรลเลอร์ จะเชื่อมต่อผ่านทาง i2c bus ซึ่งเป็นบัสหรือสายสัญญาณเส้นเเดียวกับ LCD16x2 i2c และ OLED ของบทความที่ผ่านมา ทั้งนี้ในการสั่งงานให้กับอุปกรณ์ i2c ที่อยู่บัสเส้นเดียวกัน ค่า address ของตัวอุปกรณ์จึงมีความสำคัญมาก เพราะถ้ากำหนด address ผิด จะไม่สามารถติดต่อหรือสั่งงานอุปกรณ์ตัวนั้นได้เลย
เขียนโปรแกรมสำหรับอ่านและเซตค่าเวลาจากไอซี DS3231
10. เปิดโปรแกรม Arduino IDE ขึ้นมา เลือกบอร์ดเป็นชนิด Arduino Uno, Nano หรือ ESP32 จากนั้นทำการ ดาวน์โหลดไลบรารี่ DS3231 คลิกที่ Sketch -> Include Library -> Manage Libraries ดังตัวอย่างรูปด้านล่าง ทำการติดตั้งให้เรียบร้อย (ไลบรารี่นี้สามารถใช้ได้กับ ESP32)

-
เปิด Example sketch โดยทำการเปิดตัวอย่างโปรแกรมที่มีชื่อว่า DS3231_test โดยคลิกที่ File -> Examples -> DS3231->DS3231_test
อธิบายการทำงานของโค้ด
-
เริ่มที่บรรทัด 13-21 เป็นการ include library การประกาศตัวแปรต่าง ๆ และประกาศตัวแปร object
-
บรรทัดที่ 23-28 เป็นการกำหนดค่าเริ่มต้นในการสื่อสารของบัส i2c และความเร็วของ serial port
-
บรรทัดที่ 33-65 ในฟังก์ชัน loop จะเป็นการดึงค่าวันและเวลาจากตัวไอซี DS3231 มาแสดงบนหน้าจอ Serial Monitor
-
บรรทัดที่ 67-68 เป็นการดึงค่าอุณหภูมิจากตัวไอซี DS3231 มาแสดงบนหน้าจอ Serial Monitor
-
บรรทัดที่ 76-134 เป็นการทดสอบฟังก์ชันของ Clock Alarm หรือฟังก์ชันการตั้งเวลา (Alarm1 , Alarm2)
-
บรรทัดที่ 136-137 เป็นการแสดงค่าในรีจิสเตอร์ Abits

-
ทดลองเซตค่าเวลาโดยใช้คำสั่ง Clock.set โดยเพิ่มคำสั่งในฟังก์ชัน setup ตามโปรแกรมด้านล่าง

-
จากนั้นดูผลจาก Serial Monitor ซึ่งจะเห็นได้ว่าวันที่และเวลา เปลี่ยนแปลงตามค่าที่เราได้เซตไว้ด้านบน

แบบฝึกหัดสำหรับทบทวนความเข้าใจ
-
ให้เขียนโปรแกรมบน Arduino Uno โดยให้แสดงค่าที่อ่านได้จาก DS3231 บนหน้าจอ LCD16x2 โดย
-
บรรทัดแรกแสดงค่าเวลา โดยมีรูปแบบคือ HH:MM:SS
-
บรรทัดที่สองให้แสดงค่าวันเดือนปี โดยมีรูปแบบคือ DD/MM/YYYY
-
-
ให้เขียนโปรแกรมบน ESP32(ESP-WROM-32) โดยให้แสดงค่าที่อ่านได้จาก DS3231 บนหน้าจอ OLED128x64 โดย
-
บรรทัดแรกแสดงค่าเวลา โดยมีรูปแบบคือ HH:MM:SS
-
บรรทัดที่สองให้แสดงค่าวันเดือนปี โดยมีรูปแบบคือ DD/MM/YYYY
-
3. เขียนโปรแกรมให้ตั้งค่าเวลาการทำงานของรีเลย์1 และรีเลย์2 โดยให้ที่
-
เวลา 9:00AM ให้รีเลย์1 ทำงาน
-
เวลา 9:05AM ให้รีเลย์1 หยุดทำงาน
-
เวลา 9:06AM ให้รีเลย์2 ทำงาน
-
เวลา 9:10AM ให้รีเลย์2 หยุดทำงาน




Leave a Reply