Silulasi Proteus - Jam Digital Arduino 7 Segment dengan RTC DS1307

Jam Digital Arduino 7 Segment dengan RTC DS1307
arduino 7 Segment Clock

Masih dengan 7 Segment Display ya teman-teman, dari simulasi sebelumnya mari kita simulasikan jam digital 7 Segment dengan RTC DS1307. Kita akan mulai dengan jumlah tampilan 4 display (Jam- menit). Selanjutnya nanti akan kita tambah menjadi 2 digit lagi untuk menampilkan nilai detik. Nilai jam, menit dan detik akan ditampilkan dalam 2 Digit.

Simulasi Jam 4 Digit (Jam, Menit)

1. Rangkaian Proteus jam 4 digit

Untuk komponen yang digunakan adalah arduino uno (lib Arduino Proteus bisa donlot disini), IC 74HC595, 7 Segment Common Anoda (CA), beberapa Resistor, dan RTC DS1307. IC RTC DS 1307 menggunakan cryztal osilator dengan frekuensi 32.768 KHZ.  Arduino dan DS1307 berkomunikasi secara I2C dengan pin SDA (Arduino pin analog 4) dan SCL (arduino analog 5). Rangkainya di proteus seperti berikut:

Arduino digital clock 7 segment

2. Arduino Program jam 4 digit

Untuk program, kita memerlukan library RTC yaitu RTClib ver.2.1.1 by adafruit. Kamu dapat menambahkannya via library manager. Selanjutnya silahkan untuk langsung copas program dibawah ini.

Jam Digital Arduino 7 Segment dengan RTC DS1307

 
/*
 * Program jam digital arduino 7 segment display
 * www.arducoding.com
 */
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include "RTClib.h"
#include "Wire.h"

#define DATA 2
#define CLK 3
#define LATCH 4
#define LED 11

//konfigurasi segment dengan hex / biner 8 bit = https://www.electrical4u.com/images/march16/1460385570.PNG
byte segment[10]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x7, 0x7F, 0x6F};

byte ani_char[8]= {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x01,0x40};

int jam_puluhan = 0;
int jam_satuan = 0;
int menit_puluhan = 0;
int menit_satuan = 0;
int led_stat = 0;


RTC_DS1307 rtc;

void setup () {
  Serial.begin(115200);
  
  pinMode(LATCH, OUTPUT);
  pinMode(CLK, OUTPUT);
  pinMode(DATA, OUTPUT);
  pinMode(LED, OUTPUT); 

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    while (1) delay(10);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running, let's set the time!");
    led_blink(5);
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }

 
  // opening animation
  int i = 0;
  while(i<8){
    i++;
    digitalWrite(LATCH, LOW);
    shiftOut(DATA, CLK, MSBFIRST, ~ani_char[i]); 
    shiftOut(DATA, CLK, MSBFIRST, ~ani_char[i]); 
    shiftOut(DATA, CLK, MSBFIRST, ~ani_char[i]); 
    shiftOut(DATA, CLK, MSBFIRST, ~ani_char[i]);
    digitalWrite(LATCH, HIGH);
    delay(200);
  }
  led_blink(2);
  delay(200);

}

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

    //jam
    if (now.hour()<10){
      jam_puluhan = 0;      
      jam_satuan = now.hour();
    }else{
      jam_puluhan = now.hour() / 10;      
      jam_satuan = now.hour() % 10; 
    }

    //menit
    if (now.minute()<10){
      menit_puluhan = 0;      
      menit_satuan = now.minute();  
    }else{
      menit_puluhan = now.minute() / 10;      
      menit_satuan = now.minute() % 10;
    }


    //led kedip-kedip  
    if (led_stat == 0){
      digitalWrite(LED, HIGH);
      led_stat =1;
    }else{
      digitalWrite(LED, LOW);
      led_stat =0;
    }
    
    //for monitoring data via serial monitor
    //Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC);Serial.println();
    //Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC);Serial.println();
    
    digitalWrite(LATCH, LOW);
    shiftOut(DATA, CLK, MSBFIRST, ~segment[menit_satuan]); // display 4 
    shiftOut(DATA, CLK, MSBFIRST, ~segment[menit_puluhan]); // display 3
    shiftOut(DATA, CLK, MSBFIRST, ~segment[jam_satuan]); // display 2
    shiftOut(DATA, CLK, MSBFIRST, ~segment[jam_puluhan]); // display 1
    digitalWrite(LATCH, HIGH);

    Serial.println();
    //delay(1000);
    delay(500); //buat simulasi delaynya agak cepet aja
}

void led_blink(int blink_times){
  int x = 0;
  while (x <= blink_times){
    x++;
    digitalWrite(LED, HIGH);delay(200);digitalWrite(LED, LOW);delay(200);
  }
  digitalWrite(LED, HIGH);
}

Pada Arduino IDE, Patikan board yang dipilih adalah arduino uno. 

Selanjutnya pastikan Arduino IDE dapat melakukan verify code dengan pilih menu File > Preferences > Check list pada opsi Verify code after Upload

Setelah semua dipastikan, langkah selanjutnya dalah Compile programnya dengan klik tombol Verify. Akan diperoleh file dengan ekstensi .hex pada vie compiling process


Copy lokasi file .hex tersebut berada (blok kemudian CTRL+C), balik ke rangkaian proteus, double klick pada komponen arduino. Selanjutnya paste lokasi file .hex tadi ke bagian Upload hex file . Pilih OK kalau udah beres!


 Jalankan Simulasi proteusnya dan hasilnya kira-kira begini:


Nah.. hasil diatas hanya menggunakan 7 Segment Display 4 Digit. cobe deh untuk ditambahkan 2 digit lagi untuk menampilkan detik.. Selamat mencoba.. Untuk file Proteus dari Project Arduino  4 Digit 7 Segment Digital Clock silahkan dapat di download pada link berikut :


Simulasi Jam 6 Digit (Jam, Menit, Detik)

1. Rangkaian Proteus jam 6 digit

Untuk komponen yang digunakan kurang lebih sama dengan rangkaian 4 digit yaitu arduino uno (lib Arduino Proteus bisa donlot disini), IC 74HC595, 7 Segment Common Anoda (CA), beberapa Resistor, dan RTC DS1307. IC RTC DS 1307 menggunakan cryztal osilator dengan frekuensi 32.768 KHZ. Susun komponen-komponen tersebut ke rangkaian beritut:
Arduino 7 Segment Clock

2. Arduino Program jam 6 digit

Untuk programnya, hampir mirip dengan yang 4 digit ya. library yang digunakan juga sama yaitu  RTC yaitu RTClib ver.2.1.1 by adafruit. . kurang lebih seperti berikut:

/*
 * Program jam digital arduino 7 segment display
 * www.arducoding.com
 */
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include "RTClib.h"
#include "Wire.h"

#define DATA 2
#define CLK 3
#define LATCH 4
#define LED 11

//konfigurasi segment dengan hex / biner 8 bit = https://www.electrical4u.com/images/march16/1460385570.PNG
byte segment[10]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x7, 0x7F, 0x6F};

byte ani_char[8]= {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x01,0x40};

int jam_puluhan = 0;
int jam_satuan = 0;
int menit_puluhan = 0;
int menit_satuan = 0;
int detik_puluhan = 0;
int detik_satuan = 0;
int led_stat = 0;


RTC_DS1307 rtc;

void setup () {
  Serial.begin(115200);
  
  pinMode(LATCH, OUTPUT);
  pinMode(CLK, OUTPUT);
  pinMode(DATA, OUTPUT);
  pinMode(LED, OUTPUT); 

  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    while (1) delay(10);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running, let's set the time!");
    led_blink(5);
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }

 
  // opening animation
  int i = 0;
  while(i<8){
    i++;
    digitalWrite(LATCH, LOW);
    shiftOut(DATA, CLK, MSBFIRST, ~ani_char[i]); 
    shiftOut(DATA, CLK, MSBFIRST, ~ani_char[i]); 
    shiftOut(DATA, CLK, MSBFIRST, ~ani_char[i]); 
    shiftOut(DATA, CLK, MSBFIRST, ~ani_char[i]);
    shiftOut(DATA, CLK, MSBFIRST, ~ani_char[i]); 
    shiftOut(DATA, CLK, MSBFIRST, ~ani_char[i]);
    digitalWrite(LATCH, HIGH);
    delay(200);
  }
  led_blink(2);
  delay(200);

}

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

    //jam
    if (now.hour()<10){
      jam_puluhan = 0;      
      jam_satuan = now.hour();
    }else{
      jam_puluhan = now.hour() / 10;      
      jam_satuan = now.hour() % 10; 
    }

    //menit
    if (now.minute()<10){
      menit_puluhan = 0;      
      menit_satuan = now.minute();  
    }else{
      menit_puluhan = now.minute() / 10;      
      menit_satuan = now.minute() % 10;
    }

    //detik
    if (now.second()<10){
      detik_puluhan = 0;      
      detik_satuan = now.second();  
    }else{
      detik_puluhan = now.second() / 10;      
      detik_satuan = now.second() % 10;
    }

    //led kedip-kedip  
    if (led_stat == 0){
      digitalWrite(LED, HIGH);
      led_stat =1;
    }else{
      digitalWrite(LED, LOW);
      led_stat =0;
    }
    
    //for monitoring data via serial monitor
    //Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC);Serial.println();
    //Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC);Serial.println();
    
    digitalWrite(LATCH, LOW);
    shiftOut(DATA, CLK, MSBFIRST, ~segment[detik_satuan]); // display 6 
    shiftOut(DATA, CLK, MSBFIRST, ~segment[detik_puluhan]); // display 5
    shiftOut(DATA, CLK, MSBFIRST, ~segment[menit_satuan]); // display 4 
    shiftOut(DATA, CLK, MSBFIRST, ~segment[menit_puluhan]); // display 3
    shiftOut(DATA, CLK, MSBFIRST, ~segment[jam_satuan]); // display 2
    shiftOut(DATA, CLK, MSBFIRST, ~segment[jam_puluhan]); // display 1
    digitalWrite(LATCH, HIGH);

    Serial.println();
    //delay(1000);
    delay(500); //buat simulasi delaynya agak cepet aja
}

void led_blink(int blink_times){
  int x = 0;
  while (x <= blink_times){
    x++;
    digitalWrite(LED, HIGH);delay(200);digitalWrite(LED, LOW);delay(200);
  }
  digitalWrite(LED, HIGH);
}

Pada Arduino IDE, Patikan board yang dipilih adalah arduino uno kemudian Compile programnya  sebagaimana langkah yang sudah dijelaskan pada proses diatas (4 Digit 7 Segment) dan hasilnya kira-kira begini: