Search This Blog

Thursday, February 6, 2014

RTC pada Netduino+

Real Time Clock

RTC merupakan salah satu I2C device, RTC membantu Netduino untuk mendapat set waktu yang sesuai bahkan sampai ke resolusi millisecond. RTC memilki sumber catu daya yang berbeda dari Netduino sehingga set waktu tidak akan bergeser apabila Netduino dalam keadaan mati. Netduino tidak memiliki internal RTC, karena itulah setiap Netduino di reset maka waktu akan menunjukkan tanggal yang tidak sesuai atau kembali pada factory default -nya. 

kali ini saya menggunakan RTC DS1307 buatan iteadstudio (RTC v1.1). cukup mudah untuk di implementasikan kedalam netduino. tapi sebelum nya catatan nya adalah, pada RTC tersebut Resistor pada pin SDA dan SCL di pull up langsung ke catu daya 5V dari Netduino, hal ini tidak menjadi masalah apabila kita tidak menggunakan pin Analog input untuk melakukan pengukuran. namun apabila kita hendak menggunakan pin tersebut sebagai input analog, maka kita perlu sedikit merubah posisi pull up tersebut ke 3V. hal ini dapat dilakukan dengan memotong Jalur pada bagian belakang RTC yang menghubungkan catu daya 5V ke serangkaian resister tersebut dan menambahkan satu kabel yang terpisah untuk menyambungkannya pada catu daya 3.3v pada netduino. saya mendapatkan catatan ketika pin SDA dan SCL yang du pull up ke catu daya 5v maka analog read akan mendapatkan nilai yang jauh dari nilai sebenarnya. meskipun secara elektronik netduino akan memutuskan A4 dan A5 dari ADC chip ketika kita mendeklarasikannya sebagai I2C devices.

baik, sampai di sini mari kita lihat bagaimana menset up RTC pada Netduino Plus.
1. Secara fisik set up kabel seperti  di bawah ini:
   SDA -> Analog Pin 4
    SCL -> Analog Pin 5
    GND -> GND
    5V  -> 5V
    Pull Up Resistor ->3.3v (pull resistor di sini sebesar 4.7k)

2. Download Project nya di sini .
3. Untuk pertama kali menjalankan RTC, ubah sedikit code dibawah ini pada bagian main program.


 // TODO: Do this only once to set your 
 //clock.SetClock(14, 2, 4, 10, 40, 0, DayOfWeek.Sunday); //set sesuai dengan waktu upload sketch.
 // tahun, bulan, tanggal, jam, menit, detik

4. setelah upload sketch, nonaktifkan kembali code tersebut dan upload sekali lagi. hal ini perlu dilakukan agar waktu tidak berubah ketika netduino di reset.

5. panggil waktu yang sudah di setup menggunakan DateTime.Now(Format waktu nya). contoh:

Debug.Print("The time is: " + DateTime.Now.ToString("HH:mm:ss"));
Debug.Print(DateTime.Today.Date.ToString("dd/mm/yyyy")) 

tadaaaa.... selesai.... kita bisa memanggil method DateTime.now kapan pun dan sudah sync dengan DS1307 yang kita tambahkan.
kita bisa membuat format waktu sesuai dengan keinginan kita dengan memanggil method tersebut seperti ini

DateTime.now.today // return value : int tanggal hari ini (misal: 7)
DateTime.now.Hour // return value : int jam saat ini (misal: 22)
DateTime.now.millisecond // return value : int millisecond


selamat mencoba. jika perlu penjelasan lebih silahkan ditanyakan.

Cheers

SD card Log With Netduino

Untuk Netduino slot SD card sudah tersedia dan memiliki fitur autodetect. So, kita tidak perlu membeli shield khusus untuk merekam data. karena factory set nya sudah termasuk SDcard maka dalam programming nya pun menjadi mudah karena library nya ada termasuk kedalam .NetFramework (saya menggunakan versi .NetMF4.2)

Kali ini saya akan berbagi sedikit mengenai bagaimana menggunakan library tersebut. Disini saya menggunakan bahasa pemrograman C#. Class yang digunakan untuk mengendalikan SDcard pada Netduino terdapat pada Namespace System.IO, jadi sebelum memulai project nya sebaiknya tambahkan class tersebut kedalam project reference nya. Untuk mempermudah proses input data saya lebih memilih untuk membuat class baru yang ready to use. Class diagram untuk class SDcard sebagai berikut.

SD card Class For Netduino compatible with .NetMF 4.0 above
untuk code Lengkap nya download di sini. 

Saya akan ulas sedikit bagaimana untuk menggunakannya.
Pertama, yang perlu di ingat adalah bahwa code tersebut adalah sebuah Class, jadi tentu perlu dibuat satu objek untuk dapat menggunakannya pada main program. dibawah ini contoh create objek dari class tersebut.
private static DataStorage _store = new DataStorage();

setelah membuat objek nya kita bisa menggunakan method dari class dengan memanggil objek yang telah kita buat tadi. Dapat diliah dari diagram class di atas terdapat field, properties dan method. Sebaiknya kita fokus pada bagian Public Method dan Properties saja.

sebelum menulis kedalam SDcard hal pertama yang kita lakukan adalah mengisi property NameFile dan PathFile. Misal:

_store.PathFile = "Folder";
_store.NameFile = "Test"; //extensi pada NameFile akan berupa Csv. silahkan di edit sesuai kebutuhan.

kemudian, kita bisa mengisi file tesebut dengan memasukkan nilai kedalam property ContentFile

contoh:
_store.ContentFile = _hour + "," + (analogIn.miliVolts / 10).ToString("F1"));

ok. dengan begitu kita sudah menuliskan kedalam SD card dengan alamat @SD\Folder\Test.csv

catatan:
1. Class ini secara otomatis membuat Direktori "Folder" dan nama file "test" apabila tidak ditemukan.
2. Anda bisa menambahkan subdirectory pada pathfile dengan cara menambahkan class berikut :

        
public bool CheckPath(string rootDir, string YDir, string MDir)
 {                 
     try
     {
         Again:
         if (!Directory.Exists(@"\SD\" + rootDir))
         {
             Directory.CreateDirectory(@"\SD\" + rootDir);
             Thread.Sleep(150);
            
             goto Again;
         }
          else if (!Directory.Exists(@"\SD\" + rootDir + Path.DirectorySeparatorChar + YDir)) 
         {
             Directory.CreateDirectory(@"\SD\" + rootDir + Path.DirectorySeparatorChar + YDir);
             Thread.Sleep(150);
             goto Again;
         }
          else if (!Directory.Exists(@"\SD\" + rootDir + Path.DirectorySeparatorChar 
    + YDir + Path.DirectorySeparatorChar + MDir))
         {
             Directory.CreateDirectory(@"\SD\" + rootDir + Path.DirectorySeparatorChar 
    + YDir + Path.DirectorySeparatorChar + MDir);
             Thread.Sleep(150);
             goto Again;
         }
          else
         {
             _mypath = rootDir + Path.DirectorySeparatorChar + YDir + Path.DirectorySeparatorChar + MDir;
             return true;
         }                
     }
     catch (Exception ex)
     {
         myLcd.SetCursorPosition(0, 1);
         myLcd.Write(ex.Message);
         Debug.Print(ex.Message);
         return (false);
     }
}
lalu gunakan variable string _mypath pada class tersebut sebagai PathFile
 _store.PathFile = _namePath