เขียนคำสั่งอ่านค่าเวลาจาก Real Time Clock DS1307 module (RTC) Netduino Arduino

enter image description here

ในวันนี้เราจะมาเรียนรู้การเขียนคำสั่งอ่านค่าเวลาจาก Real Time Clock DS1307 module (RTC)

ตัวอย่างการประยุกต์ใช้งาน

  • สร้าง project เก็บข้อมูลความชื้นหรือฝุ่นในอากาศ โดยเก็บเหล่านี้นี้ลง text file พร้อมกับเวลาที่ได้จากตัว RTC module
  • การตั้งค่าอุปกรณ์ให้ทำงานบางอย่างตามเวลาที่กำหนดไว้ เช่น ระบบ smart farm เปิดปิดระบบรดน้ำตามเวลาที่กำหนด หรือเปิดปิดอุปกรณ์ไฟฟ้าอื่นๆ เป็นต้น

มาเริ่มเขียนเลยครับ

อุปกรณ์ที่ใช้

  • Microcontroller board Netduino
  • Real time clock module (RTC)
  • ถ่านนาฬิกา CR1220 ตัวกลมเล็กเพื่อเป็นแหล่งพลังงานให้กับ RTC module ในการเก็บค่าเวลา
  • เครื่อง computer ที่ติดตั้ง Visual Studio 2005 และ plugin สำหรับ Netduino .NET Micro เรียนรู้เพิ่มเติมได้จาก http://codesanook.com/getting-started-with-iot-netudio-3-ethernet-a-compatibility-arduino-board

enter image description here

enter image description here

เริ่มจากเชื่อมต่ออุปกรณ์ดังนี้ ใช้เพียง 4 Pins

  • Netduino 5V to SL1307 5v
  • Netduino GND to SL1307 GND
  • Netduino SC to SL1307 SCL
  • Netduino SD to SL1307 SDA

มาเริ่ม code กันเลย

สร้าง project ชื่อว่า NetduinoRealTimeClockDS1307 เรียนรู้การสร้าง project ใหม่ได้จาก http://codesanook.com/getting-started-with-iot-netudio-3-ethernet-a-compatibility-arduino-board แล้วเพิ่ม class library ต่างๆ มีไว้ให้ที่ Github ตาม Link นี้แล้วครับ source code

NetMf.CommonExtensions Toolbox.NETMF.Core Toolbox.NETMF.Hardware.Core Toolbox.NETMF.Hardware.DS1307

หน้าตาโครงสร้าง Project ใหม่ของเรา

enter image description here

เขียนคำสั่งต่อไปในนี้ลงใน Program.cs

using Microsoft.SPOT;
using NetMf.CommonExtensions;
using System.Threading;
using Toolbox.NETMF.Hardware;

namespace NetduinoRealTimeClockDS1307
{
    public class Program
    {
        public static void Main()
        {
            var ds1307 = new DS1307();
            //Comment the following line to not set the time to DS1307 board again
            ds1307.SetTime(
                Year: 2018,
                Month: 01,
                Day: 23,
                Hour: 16,
                Minute: 59,
                Second: 0
            );

            while (true)
            {
                var time = ds1307.GetTime();
                var formattedDate = StringUtility.Format(
                    "Netduino Time in UTC: {0}",
                    time.ToString("yyyy-MM-ddTHH:mm:ssZ")
                );

                Debug.Print(formattedDate);
                //sleep for 5 seconds
                Thread.Sleep(5000);
            }
        }
    }
}

อธิบายคำสั่ง

  • สร้าง object จาก DS1307 class ตั้งค่าเวลาแบบ UTC time ให้กับ RTC module ผ่าน method SetTime ของ DS1307 object
  • อ่านค่าเวลาจาก method.GetTime()
  • Format datetime object เป็นรูปแบบ ISO8601 เขียนค่าลง Output window ของ Visual Studio
  • หยุดการทำงาน 5 วินาที ก่อนจะกลับวน
  • Loop ทำงานใหม่อีกครั้งไปเรื่อยๆ

ทดสอบการทำงาน

  • เชื่อมต่อ Netduino เข้ากับ computer ผ่าน USB cable
  • แล้วกดปุ่ม F5 เพื่อเข้าสู่ debug mode
  • รอครู่ Visual studio จะ compile และ upload code ของเราลงไปที่ board Netduino
  • แล้วเราก็จะเห็น output ของเวลาปัจจุบันในรูปแบบ UTC ISO uct iso8601

enter image description here

ก่อน run โปรแกรมครั้งต่อไป เราก็ comment คำสั่งในการตั้งค่าเวลาปัจจุบันให้กับ module โดยตัว module เองมีแบตเลี้ยงในตัวเพื่อเก็บเวลาค่าเวลาปัจจุบัน ทำงานอิสระจากตัว Microcontroller เมื่อเราปิด Microcontroller ไป แล้วเปิดขึ้นมาใหม่ก็อ่านค่าเวลาได้อย่างถูกต้อง

source code

Credit พี่ Art ผู้เชี่ยวชาญด้าน IoT ของเมืองไทยที่ให้กับสนับสนุนเป็นอย่างดี

ขอบคุณครับ