Jumat, 22 April 2016

Memprogram Arduino RTC DS3231 AT24C32

Hallo sobat AWI'ers atau sobat arduino, sudah tau apa itu RTC, fungsi dan kegunaan RTC. Sebelum kita melakukan program Arduino RTC DS3231 AT24C32, alangkah baikknya saya ulas sedikit tentang RTC.

RTC atau kepanjangan dari Real Time Clock adalah merupakan suatu chip yang bisa menyimpan waktu dan tanggal. Pernah mematikan komputer/leptop (pasti pernah). Tapi kok waktu/tanggalnya tetap bisa menghitung ya..... Nah dari kasus tersebut komputer/leptop ada RTC nya di dalamnya. jadi ketika leptop/komputer dalam kondisi mati, RTC masih menyimpan data waktu/tanggal.

Oke sekarang RTC yang akan saya gunakan disini adalah jenis RTC DS3231 AT24C32, atau bisa di lihat gambar dibawah ini



Karena type RTC modul ini menggunakan Koneksi I2C maka yang perlu kita sambungkan adalah sebagai berikut

RTC ------------ ARDUINO
GND       ->        GND
VCC       ->        VCC
SDA       ->         A4
SCL       ->         A5

dan sebelum kita mengakses I2C kita harus tahu alamat address nya I2C RTC Tersebut
caranya sebagai berikut, setelah di koneksi ke arduino ketik programm I2C Scanner dibawah ini


#include <Wire.h>

void setup()
{
  Wire.begin();
  Serial.begin(9600);
  Serial.println("\nI2C Scanner");
}
 
void loop()
{
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknow error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }   
  }
  if (nDevices == 0)
    Serial.println("Not found\n");
  else
    Serial.println("done\n");

  delay(5000);
}

upload ke Arduino dan dapatkan address seperti berikut ini pada serial monitor


Sedangkan program untuk I2C RTC adalah sebagai berikut

#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}
void setup()
{
  Wire.begin();
  Serial.begin(9600);
  // set the initial time here:
  // DS3231 seconds, minutes, hours, day, date, month, year
   setDS3231time(30,35,21,1,27,12,15);
}
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year)
{
  // sets time and date data to DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();
}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}
void displayTime()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  // send it to the serial monitor
  Serial.print(hour, DEC);
  // convert the byte variable to a decimal number when displayed
  Serial.print(":");
  if (minute<10)
  {
    Serial.print("0");
  }
  Serial.print(minute, DEC);
  Serial.print(":");
  if (second<10)
  {
    Serial.print("0");
  }
  Serial.print(second, DEC);
  Serial.print(" ");
  Serial.print(dayOfMonth, DEC);
  Serial.print("/");
  Serial.print(month, DEC);
  Serial.print("/");
  Serial.print(year, DEC);
  Serial.print(" Day of week: ");
  switch(dayOfWeek){
  case 1:
    Serial.println("Sunday");
    break;
  case 2:
    Serial.println("Monday");
    break;
  case 3:
    Serial.println("Tuesday");
    break;
  case 4:
    Serial.println("Wednesday");
    break;
  case 5:
    Serial.println("Thursday");
    break;
  case 6:
    Serial.println("Friday");
    break;
  case 7:
    Serial.println("Saturday");
    break;
  }
}
void loop()
{
  displayTime(); // display the real-time clock data on the Serial Monitor,
  delay(1000); // every second
}

langkah pertama untuk setting RTC agar sama dengan jam kita adalah dengan setting RTC itu sendiri, caranya dengan memasukkan waktu yang akan kita set. seperti  dalam void setup ada setDS3231time(30,35,21,1,27,12,15);

setelah kita sesuaikan jam upload yang didalam void setup ada setDS3231time(30,35,21,1,27,12,15); selanjutnya upload ulang program tersebut. tapi pada setDS3231time(30,35,21,1,27,12,15); kasih tanda komen

//setDS3231time(30,35,21,1,27,12,15);

biar data rtc tidak baca setting lagi, jadi selanjutnya tingga Read data saja

 Selamat mencoba, Salam Arduino Indonesia

9 komentar:

  1. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
    Balasan
    1. Komentar ini telah dihapus oleh pengarang.

      Hapus
    2. Komentar ini telah dihapus oleh pengarang.

      Hapus
  2. *second = bcdToDec(Wire.read() & 0x7f);
    *hour = bcdToDec(Wire.read() & 0x3f);

    Admin, nilai 0x7f sama 0x3f maksudnya apa ya? terima kasih atas perhatiannya.

    BalasHapus
  3. Mas klu nampilin jam digital rtc di led matrik p10 ya gmane mas mohon pencerahanya.klau boleh si kirimin coding dmd jam digita arduino.
    Imeil. Kreatifgame@gmail.com
    Trimakash

    BalasHapus
  4. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  5. Punten, saya sudah membuat jam digital dengan arduino uno dan led 5mm sebagai 7 segmentnya. Bagaimana cara untuk menambahkan RTC DS3231 setelah disambungkan ke arduino uno sesuai dengan pin nya? Karena setiap saya upload sketch rtc ds3231, jam led jadi tidak menyala, meskipun di serial monitor bisa tampil jam menit detiknya.
    Mohon pencerahan, apa yang harus dilakukan untuk masalah ini. Terimakasih.

    BalasHapus
  6. untuk di masukan ke p10 gimana yah mas ?

    BalasHapus