Skip to content Skip to sidebar Skip to footer

Widget HTML #1

RTC DS3231 Arduino Menggunakan Library Adafruit

RTC DS3231 Arduino Menggunakan Library Adafruit - Artikel ini merupakan artikel pembaruan dari artikel Cara Menggunakan RTC DS3231 Arduino Pakai Library RinkyDink.

Library DS3231 dari RinkyDink merupakan library yang bagus. Namun ada satu kendala saat saya menggunakan untuk tingkat lanjut yaitu day of the week tidak bisa sinkron.

Jadi saya menemukan library yang lebih baik buatan Adafruit yaitu RTClib. Library RTClib ini mendukung chip RTC DS3231, DS1307 dan PCF8523.

Untuk board, library RTClib ini mendukung:

  • ATmega328 @ 16MHz : Arduino UNO, Adafruit Pro Trinket 5V, Adafruit Metro 328, Adafruit Metro Mini
  • ATmega328 @ 12MHz : Adafruit Pro Trinket 3V
  • ATmega32u4 @ 16MHz : Arduino Leonardo, Arduino Micro, Arduino Yun, Teensy 2.0
  • ATmega32u4 @ 8MHz : Adafruit Flora, Bluefruit Micro
  • ESP8266 : Adafruit Huzzah
  • ATmega2560 @ 16MHz : Arduino Mega
  • ATSAM3X8E : Arduino Due
  • ATSAM21D : Arduino Zero, M0 Pro
  • ATtiny85 @ 16MHz : Adafruit Trinket 5V
  • ATtiny85 @ 8MHz : Adafruit Gemma, Arduino Gemma, Adafruit Trinket 3V 


Berdasarkan datasheet, RTC buatan MAXIM INTEGRATED ini memiliki fitur :
  • Real time untuk menghitung detik, menit, jam, tanggal, bulan dan tahun  berlaku hingga 2100.
  • Akurasi ±2ppm dari 0°C hingga +40°C
  • Akurasi ±3.5ppm dari -40°C hingga +85°C
  • Akurasi Output sensor temperatur digital ±3°C
  • Komunikasi I2C (400kHz)
  • Tegangan backup baterai 3.3V

A. Library DS3231 Arduno dari Adafruit

Untuk mengoperasikan RTC ini menggunakan Arduino, silahkan download library RTClib pada link berikut:

Download Libary DS323 RTClib

Jika sudah, masukkan library Libary RTClib yang telah teman-teman download ke Arduino IDE dengan cara:
  • Buka Arduino IDE
  • Klik Sketch > Include Library > Add .ZIP Library
  • Cari Library RTClib-master.zip yang telah teman-teman download
  • Klik Ok

B. Rangkaian DS3231 Arduino

Untuk rangkaiannya tidak terlalu sulit, hubungkan 5V Arduino ke VCC RTC, GND ke GND, A4 ke SDA dan A5 ke SCL. Hubungan RTC DS3231 Arduino seperti tampak pada gambar dibawah:


Rangkaian DS3231 Arduino UNO

C. Program Membaca RTC DS3231 Arduino

Sekarang, kita akan mencoba membaca data dari RTC. Data diantaranya adalah hari, tanggal, bulan, tahun, jam, menit dan detik. 
#include "RTClib.h"

RTC_DS3231 rtc;

char daysOfTheWeek[7][7] = {"Ahad", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};
char Month [13][10] = {" ", "Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"};

void setup () {
  Serial.begin(9600);


  if (! rtc.begin()) {
    Serial.println("Tidak ada RTC");
    Serial.flush();
    abort();
  }

  if (rtc.lostPower()) {
    Serial.println("RTC kehilangan daya, mari atur waktu!");
  }

  // baris berikut menyetel RTC ke tanggal & waktu dari komputer saat sketsa ini dikompilasi
  //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  
  // Jika anda ingin menyetel waktu RTC secara manual, gunakan baris rtc.adjust
  // Contoh 21 Januari 2014 pukul 03.00:
  // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}

void loop () {
  DateTime now = rtc.now();

  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); // Menampilkan Hari
  Serial.print(", ");
  Serial.print(now.day(), DEC);     // Menampilkan tanggga
  Serial.print(' ');
  Serial.print(Month[now.month()]); // Menampilkan bulan
  Serial.print(' ');
  Serial.print(now.year(), DEC);    // Menampilkan tahun
  Serial.print(", ");


  Serial.print(now.hour(), DEC);    // Menampilkan jam
  Serial.print(':');
  Serial.print(now.minute(), DEC);  // Menampilkan menit
  Serial.print(':');
  Serial.print(now.second(), DEC);  // Menampilkan detik
  Serial.println('\n');

  delay(1000);
}

Setelah program diupload, buka serial Monitor Arduino IDE dan anda akan melihat data yang tampil seperti berikut:

Pada program diatas, baris array Mont pertama saya tulis " ", karena pembacaan array dimulai dari 0, maka tidak ada bulan pada bulan ke-0. Dari itu, saya menambahkan karakter kosong.

Jika anda ingin mengatur secara manual pewaktuan, gunakan perintah  rtc.adjust(DateTime(tahun, bulan, tanggal, jam, menit, detik)); Selangkapnya pada progam dibawah:

D. Tetapkan Waktu Sesuai Keinginan Melalui Serial

Sekarang kita akan membuat program yang mana dengan program ini kita dapat menyetel RTC secara manual.

Perhatikan perintah rtc.adjust(DateTime(tahun, bulan, tanggal, jam, menit, detik));, ini akan membuat program akan menetapkan waktu secara bersamaan.

Misalnya kita hanya ingin merubah tanggal saja atau jam saja, bagaimana caranya?

Berikut saya sertakan program lengkapnya.  Progam ini akan menampilkan data RTC pada Serial Monitor

  Untuk merubah data, kirimkan karakter berikut pada serial monitor:
   - TG untuk merubah Tanggal
   - BL untuk merubah Bulan
   - TH untuk merubah Tahun
   - JM untuk merubah Jam
   - MT untuk merubah Menit
   - DT untuk merubah Detik

Progam:
/*
  www.chippiko.com

  Progam ini akan menampilkan data RTC pada Serial Monitor

  Untuk merubah data, kirimkan karakter berikut pada serial monitor:
   - TG untuk merubah Tanggal
   - BL untuk merubah Bulan
   - TH untuk merubah Tahun
   - JM untuk merubah Jam
   - MT untuk merubah Menit
   - DT untuk merubah Detik
*/

#include "RTClib.h"

RTC_DS3231 rtc;

char daysOfTheWeek[7][7] = {"Ahad", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};
char Month [13][10] = {" ", "Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"};
String read_string = " ";
int read_int = 0;

void setup () {
  Serial.begin(9600);


  if (! rtc.begin()) {
    Serial.println("Tidak ada RTC");
    Serial.flush();
    abort();
  }

  if (rtc.lostPower()) {
    Serial.println("RTC kehilangan daya, mari atur waktu!");
  }
}

void loop () {
  bacaRTC();
  aturRTC();
  delay(1000);
}

void bacaRTC()
{
  DateTime now = rtc.now();

  Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); // Menampilkan Hari
  Serial.print(", ");
  Serial.print(now.day(), DEC);     // Menampilkan tanggga
  Serial.print(' ');
  Serial.print(Month[now.month()]); // Menampilkan bulan
  Serial.print(' ');
  Serial.print(now.year(), DEC);    // Menampilkan tahun
  Serial.print(", ");
  Serial.print(now.hour(), DEC);    // Menampilkan jam
  Serial.print(':');
  Serial.print(now.minute(), DEC);  // Menampilkan menit
  Serial.print(':');
  Serial.print(now.second(), DEC);  // Menampilkan detik
  Serial.println('\n');
}
void aturRTC() {
  DateTime now = rtc.now();

  while (Serial.available() > 0) {

    read_string = Serial.readStringUntil('\n');
    read_string.trim();
    delay(100);

    //Hari tidak dapt diubah karena akan berubah sendiri sesuai tanggal

    //Jika tanggal
    if (read_string == "TG") {
      Serial.print("Masukkan Tanggal: ");

      //Tahan sebentar menunggu data baru dikirim
      while (!Serial.available()) {}

      read_int = Serial.parseInt();
      Serial.println(read_int);

      rtc.adjust(DateTime(now.year(), now.month(), read_int, now.hour(), now.minute(), now.second()));
    }

    //Jika bulan
    if (read_string == "BL") {
      Serial.print("Masukkan Bulan: ");

      //Tahan sebentar menunggu data baru dikirim
      while (!Serial.available()) {}

      read_int = Serial.parseInt();
      Serial.println(read_int);

      rtc.adjust(DateTime(now.year(), read_int, now.day(), now.hour(), now.minute(), now.second()));
    }

    //Jika tahun
    if (read_string == "TH") {
      Serial.print("Masukkan Tahun: ");

      //Tahan sebentar menunggu data baru dikirim
      while (!Serial.available()) {}

      read_int = Serial.parseInt();
      Serial.println(read_int);

      rtc.adjust(DateTime(read_int, now.month(), now.day(), now.hour(), now.minute(), now.second()));
    }

    //Jika jam
    if (read_string == "JM") {
      Serial.print("Masukkan Jam: ");

      //Tahan sebentar menunggu data baru dikirim
      while (!Serial.available()) {}

      read_int = Serial.parseInt();
      Serial.println(read_int);

      rtc.adjust(DateTime(now.year(), now.month(), now.day(), read_int, now.minute(), now.second()));
    }

    //Jika menit
    if (read_string == "MT") {
      Serial.print("Masukkan Menit: ");

      //Tahan sebentar menunggu data baru dikirim
      while (!Serial.available()) {}

      read_int = Serial.parseInt();
      Serial.println(read_int);

      rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), read_int, now.second()));
    }

    //Jika  detik
    if (read_string == "DT") {
      Serial.print("Masukkan Detik: ");

      //Tahan sebentar menunggu data baru dikirim
      while (!Serial.available()) {}

      read_int = Serial.parseInt();
      Serial.println(read_int);

      rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute(), read_int));
    }
  }
}

Terima kasih telah mengunjungi website Chip Piko. Semoga bermanfaat.

Post a Comment for "RTC DS3231 Arduino Menggunakan Library Adafruit"