PERANCANGAN JAM DIGITAL DENGAN FITUR ALARM BERBASIS MIKROKONTROLER ATMEGA

PERANCANGAN JAM DIGITAL DENGAN FITUR ALARM  BERBASIS MIKROKONTROLER ATMEGA16L

Abieza Putra Yudha1, Faridhotun Nisa2, Ghofur Fadli Alfan3 , Luky Setiyawan4

E-mail  : 1abieza.33224001@mhs.polines.ac.idnisa.33224011@mhs.polines.ac.id ,
3 ghofur.33224012@mhs.polines.ac.id , luky.33224016@mhs.polines.ac.id

 

Program Studi Teknik Elektronika Politeknik Negeri Semarang

Jl. Prof. Sudarto,Tembalang, Kec. Tembalang, Kota Semarang, Jawa Tengah 50275

Tlp. (024) 7472396, Website : www.polines.ac.id, Email : sekretariat@polines.ac.id


 

Abstrak - Jam digital dengan fitur alarm merupakan perangkat penting untuk membantu pengelolaan waktu secara akurat. Penelitian ini bertujuan merancang dan merealisasikan sistem jam digital berbasis mikrokontroler ATmega16L yang dilengkapi modul Real Time Clock (RTC), LCD 16×2, tombol pengatur, dan buzzer. RTC digunakan sebagai sumber waktu utama untuk menampilkan jam, menit, detik, hari, dan tanggal secara real-time, sedangkan buzzer berfungsi sebagai indikator alarm. Metode yang digunakan meliputi perancangan perangkat keras, pembuatan program menggunakan bahasa C, serta pengujian sistem. Hasil pengujian menunjukkan bahwa sistem mampu menampilkan waktu dengan stabil, dengan selisih waktu kurang dari 1 detik pada pengujian selama 24 jam. Fitur alarm berhasil aktif sesuai waktu yang diatur dengan tingkat keberhasilan 100% pada 10 kali pengujian, serta tetap tersimpan pada EEPROM meskipun catu daya dimatikan. Sistem dinyatakan bekerja dengan baik dan andal.

Kata Kunci: ATmega16L, Jam Digital, RTC, Alarm.

 


 

KATA PENGANTAR

            Puji syukur kami panjatkan kepada Allah SWT atas segala rahmat, nikmat, serta keberkahan-Nya. Alhamdulillah, kami dapat menyelesaikan proyek besar berjudul “Perancangan Jam Digital Dengan Fitur Alarm Berbasis Mikrokontroller Atmega” ini dengan lancar sebagai salah satu tugas akhir pada semester 3.

            Dalam proses penyusunannya, kami menghadapi berbagai hambatan dan kendala, baik teknis maupun non-teknis. Namun berkat kerja sama tim, dukungan moral, serta bantuan dari banyak pihak, proyek ini akhirnya dapat diselesaikan dengan baik. Oleh karena itu, pada kesempatan ini kami ingin menyampaikan terima kasih kepada:

  1. Bapak Dr. Samuel Beta K., Ing.Tech, M.T., selaku dosen pengampu mata kuliah Mikrokontroler yang telah memberikan ilmu, bimbingan, dan arahan sehingga proyek ini dapat terselesaikan.
  2. Politeknik Negeri Semarang (POLINES) yang telah menyediakan fasilitas pendukung bagi kelancaran penelitian dan pembuatan proyek.
  3. Teman–teman kelompok 1 yang telah meluangkan waktu, tenaga, dan pikiran untuk bekerja sama dalam menyelesaikan proyek ini.
  4. Orang tua, yang selalu memberi doa, dukungan, dan izin kepada anggota kelompok sehingga seluruh proses dapat berjalan dengan baik.
  5. Seluruh pihak yang telah membantu, baik secara langsung maupun tidak langsung, yang tidak dapat kami sebutkan satu per satu.

            Kami menyadari bahwa proyek ini masih jauh dari sempurna dan memiliki berbagai kekurangan. Oleh sebab itu, kami sangat terbuka terhadap kritik dan saran yang membangun demi peningkatan kualitas di masa mendatang. Besar harapan kami, proyek sederhana ini dapat memberikan manfaat dan menjadi referensi bagi siapa pun yang membaca laporan ini.


 

BAB I

PENDAHULUAN

             1.1  Latar Belakang

Dalam kehidupan sehari-hari, pencatatan waktu yang akurat sangat dibutuhkan untuk mengatur aktivitas, terutama pada lingkungan rumah, sekolah, maupun tempat kerja. Jam digital dengan fitur alarm menjadi salah satu perangkat sederhana namun penting karena mampu membantu pengguna mengingat jadwal tertentu secara otomatis.

Untuk memenuhi kebutuhan tersebut, mikrokontroler ATmega sering digunakan karena mudah diprogram dan mampu mengintegrasikan berbagai komponen seperti RTC, LCD, tombol, serta buzzer. Dengan memanfaatkan modul RTC, sistem dapat menampilkan jam, hari, dan tanggal secara presisi, sementara fitur alarm memberikan pengingat yang dapat disesuaikan oleh pengguna.

Oleh karena itu, dirancanglah sistem jam digital berbasis ATmega yang tidak hanya menampilkan waktu real-time, tetapi juga memungkinkan pengaturan alarm secara mudah dan akurat sebagai solusi praktis dalam manajemen waktu sehari-hari.

            1.2  Tujuan

1.     Merancang dan membangun sistem jam digital yang menampilkan waktu, hari, dan tanggal secara akurat menggunakan modul RTC.

2.     Mengembangkan fitur alarm yang dapat diatur sesuai kebutuhan pengguna.

3.     Mengintegrasikan mikrokontroler ATmega dengan LCD, tombol pengatur, dan buzzer agar sistem dapat berfungsi dengan baik.

4.     Menciptakan perangkat yang mudah digunakan dan mampu memberikan informasi waktu secara jelas.

5.     Menambah pemahaman mahasiswa dalam merancang rangkaian elektronik dan pemrograman mikrokontroler.

6.     Mengidentifikasi serta mengatasi kendala yang muncul selama proses perancangan dan pengujian alat.


 

1.3  Rumusan Masalah

1.     Bagaimana merancang sistem jam digital yang dapat menampilkan waktu, hari, dan tanggal secara akurat menggunakan modul RTC?

2.     Bagaimana cara mengatur dan mengaktifkan fitur alarm pada mikrokontroler ATmega agar dapat berfungsi sebagai pengingat?

3.     Bagaimana mengintegrasikan ATmega dengan LCD, tombol pengatur, dan buzzer agar seluruh sistem dapat bekerja secara optimal?

4.     Bagaimana memastikan rangkaian dan program dapat berjalan stabil serta mudah dioperasikan pengguna?


 

BAB II

TINJAUAN PUSTAKA

2.1   ATMEGA 16L

ATmega16L adalah mikrokontroler 8-bit dari keluarga AVR buatan Atmel (sekarang Microchip) yang dirancang untuk aplikasi embedded dengan konsumsi daya rendah. Huruf "L" pada ATmega16L menunjukkan versi low-power, sehingga cocok digunakan pada proyek yang mengutamakan efisiensi energi. Mikrokontroler ini menggunakan arsitektur RISC (Reduced Instruction Set Computing) yang memungkinkan eksekusi instruksi lebih cepat dan efisien.

 

Buy ATMEGA16L 8 Bit AVR Microcontroller DIP-40 Package at  electronifyindia.com – ElectronifyIndiaPengertian dan Penjelasan tentang Mikrokontroler ATMega16 - Arduino  Indonesia | Tutorial Lengkap Arduino Bahasa Indonesia

Gambar 2. 1 ATMega 16L dan Pinnya

ATmega16L memiliki spesifikasi memori yang cukup besar untuk kelasnya, yaitu 16 KB Flash untuk menyimpan program, 1 KB SRAM untuk penyimpanan sementara data, serta 512 byte EEPROM untuk data permanen yang tetap tersimpan saat catu daya dimatikan. Mikrokontroler ini menyediakan 32 jalur I/O yang bisa digunakan untuk menghubungkan berbagai perangkat seperti LCD, tombol, sensor, buzzer, dan modul RTC.

Fitur pendukung lainnya mencakup:

·       ADC 10-bit sebanyak 8 channel untuk membaca sinyal analog.

·       Timer/Counter 8-bit dan 16-bit untuk pengaturan waktu, PWM, atau delay.

·       Komunikasi serial: USART, SPI, dan I2C untuk interfacing dengan perangkat eksternal.

·       Interupsi internal dan eksternal untuk menangani peristiwa secara cepat.

ATmega16L dapat beroperasi pada tegangan 2.7–5.5 V dan kecepatan clock hingga 8 MHz untuk versi low-power. Kombinasi fitur yang lengkap dan konsumsi daya rendah menjadikan ATmega16L ideal digunakan pada proyek kontrol sederhana hingga menengah, termasuk sistem jam digital, alarm, robotik, dan alat otomatisasi lainnya. Penggunaan mikrokontroler ini memungkinkan integrasi berbagai komponen secara efisien dengan pengendalian program yang fleksibel.

2.2  Minimum System

Minimum system ATmega8535 adalah rangkaian dasar yang dibutuhkan agar mikrokontroler dapat bekerja dengan stabil. Rangkaian ini umumnya terdiri dari catu daya 5V, kristal oscillator sebagai sumber clock (misalnya 11.0592 MHz atau 16 MHz), kapasitor, serta rangkaian reset.

 

Modul System Minimum Sysmin ATMega328

Gambar 2. 2 Minimum System

Minimum system memastikan bahwa mikrokontroler dapat menjalankan program tanpa gangguan, sehingga menjadi komponen utama sebelum menambahkan modul lain seperti LCD, tombol, maupun sensor. Dalam proyek jam digital, minimum system menjadi pusat pengendali seluruh fungsi, mulai dari membaca waktu hingga mengaktifkan alarm.

2.3    USB ASP

USBasp adalah perangkat programmer yang digunakan untuk memasukkan program (upload firmware) ke dalam mikrokontroler AVR seperti ATmega8535. Alat ini bekerja melalui komunikasi USB dan menggunakan protokol ISP (In-System Programming), sehingga dapat memprogram mikrokontroler tanpa harus melepas chip dari rangkaian.

Jual Avr Programmer Usbasp USB Asp Isp Atmega Downloader 3.3v / 5v Arduino  Di Seller It Electro - Kacapiring, Kota Bandung | Blibli

Gambar 2. 3 USB ASP

Dengan USBasp, proses pemrograman menjadi lebih mudah, cepat, dan efisien, sangat membantu terutama saat harus melakukan debugging atau perubahan kode beberapa kali selama pembuatan proyek.

2.4  LCD I2C (Liquid Crystal Display)

LCD 16x2 adalah komponen tampilan yang mampu menampilkan dua baris tulisan, masing-masing berisi 16 karakter. Dalam proyek jam digital, LCD digunakan untuk menampilkan jam, menit, detik, serta informasi hari dan tanggal secara real-time.

2x16 LCD with I2C Module – Voltaat

Gambar 2. 4 LCD I2C 16 X 2

LCD 16x2 adalah komponen tampilan yang mampu menampilkan dua baris tulisan, masing-masing berisi 16 karakter. Dalam proyek jam digital, LCD digunakan untuk menampilkan jam, menit, detik, serta informasi hari dan tanggal secara real-time. LCD bekerja dengan dikendalikan oleh mikrokontroler melalui pin data dan control (RS, RW, E). Keunggulan LCD adalah tampilannya yang jelas, penggunaan daya yang rendah, serta kemampuan menampilkan teks yang lebih informatif dibandingkan LED tujuh segmen.

2.5  RTC (Real Time Clock)

RTC (Real Time Clock) adalah modul pencatat waktu yang digunakan untuk menyimpan dan menjaga informasi waktu secara real-time, seperti jam, menit, detik, hari, tanggal, bulan, dan tahun. Salah satu jenis RTC yang paling umum digunakan adalah DS1307 atau DS3231, yang dilengkapi dengan baterai backup sehingga waktu tetap berjalan meskipun sistem utama dimatikan.

Pengertian dan Penjelasan tentang RTC (Real Time Clock) - Edukasi  Elektronika | Electronics Engineering Solution and Education

Gambar 2. 5 Sensor RTC

RTC (Real Time Clock) adalah modul pencatat waktu yang digunakan untuk menyimpan dan menjaga informasi waktu secara real-time, seperti jam, menit, detik, hari, tanggal, bulan, dan tahun. Salah satu jenis RTC yang paling umum digunakan adalah DS1307 atau DS3231, yang dilengkapi dengan baterai backup sehingga waktu tetap berjalan meskipun sistem utama dimatikan. Modul RTC berkomunikasi dengan mikrokontroler menggunakan protokol I2C, sehingga memungkinkan transfer data waktu dengan dua jalur saja (SDA dan SCL). Dalam proyek jam digital, RTC berperan sebagai sumber waktu utama karena memiliki tingkat akurasi yang lebih baik dibandingkan timer internal mikrokontroler. Dengan adanya RTC, sistem dapat menampilkan waktu yang stabil dan tepat, serta memastikan fitur alarm aktif pada waktu yang benar.

2.6  Buzzer

Buzzer adalah komponen output yang menghasilkan suara sebagai bentuk notifikasi atau alarm. Dalam proyek jam digital, buzzer digunakan untuk memberikan tanda ketika alarm telah aktif pada waktu yang telah ditentukan.

Piezo Electronic Buzzer Alarm 3-12V Continuous 30mm – Indian Hobby Center

Gambar 2. 6 Buzzer

Buzzer dihubungkan ke mikrokontroler melalui pin output dan dapat dikendalikan menggunakan sinyal digital. Suara buzzer yang cukup jelas dan konsumsi daya yang rendah menjadikannya komponen yang ideal untuk sistem pengingat sederhana.


 

2.7  Crystal Oscillator

Crystal oscillator adalah komponen yang berfungsi menghasilkan sinyal clock yang stabil untuk mikrokontroler ATmega8535. Sinyal clock ini menjadi acuan waktu bagi seluruh proses di dalam mikrokontroler, mulai dari eksekusi instruksi, pencacahan timer, hingga pengaturan fungsi-fungsi pendukung.

Pencatat Waktu yang Tepat: Osilator Kristal, Jam Atom, dan Jam Kuantum -  Berita

Gambar 2. 7 Crystal Oscillator

Pada proyek jam digital, kestabilan clock sangat penting karena mempengaruhi ketepatan tampilan detik, menit, dan jam.

Umumnya ATmega8535 menggunakan crystal berfrekuensi 8–16 MHz yang dihubungkan pada pin XTAL1 dan XTAL2 bersama dua kapasitor kecil untuk mendukung proses osilasi. Dengan menggunakan crystal oscillator, sistem dapat bekerja dengan presisi tinggi sehingga waktu yang ditampilkan dan alarm yang diatur tetap akurat sepanjang penggunaan.

2.8   Resisstor

Resistor adalah komponen elektronik pasif yang berfungsi membatasi arus listrik dan mengatur tegangan dalam rangkaian.

Resistor: Pengertian, Rumus dan Jenis-jenis Resistor

Gambar 2. 8 Resistor

Dalam proyek jam digital berbasis ATmega8535, resistor digunakan untuk beberapa kebutuhan penting, seperti membatasi arus ke LED backlight LCD, memberikan pull-up/pull-down pada tombol agar pembacaan input stabil, serta melindungi komponen seperti buzzer atau transistor dari arus berlebih. Dengan nilai yang tepat, resistor memastikan rangkaian bekerja aman dan stabil tanpa risiko kerusakan komponen.


 

BAB III

PERANCANGAN ALAT

 

3.1  Daftar Alat dan Bahan

1.     Mikrokontroller ATMega 16L

2.     Sensor RTC

3.     Minimum System

4.     USB ASP

5.     LCD I2C

6.     Buzzer

7.     Push Button / Tombol

8.     Crystal Oscillator

9.     Resistor

10.  Kabel Jumper

11.  Box

3.2  Cara Kerja

Sistem alarm jam digital berbasis ATmega16L bekerja dengan mengandalkan modul RTC sebagai sumber waktu utama. RTC (misalnya DS1307/DS3231) terus mencatat jam, menit, detik, hari, dan tanggal secara akurat dengan bantuan baterai backup sehingga waktu tetap berjalan meskipun alat dimatikan. Mikrokontroler ATmega16L membaca data waktu dari RTC melalui komunikasi I2C, kemudian menampilkannya pada LCD 16x2. Pengguna dapat melakukan pengaturan jam, tanggal, dan alarm menggunakan tombol yang tersedia; setiap penekanan tombol diproses oleh mikrokontroler untuk mengubah nilai yang tersimpan. Ketika waktu pada RTC sama dengan waktu alarm yang telah diatur, mikrokontroler akan mengaktifkan buzzer sebagai tanda bahwa alarm berbunyi. Buzzer akan berhenti ketika pengguna menekan tombol tertentu atau setelah durasi alarm selesai. Seluruh proses dikendalikan secara otomatis oleh program di dalam ATmega16L, sehingga sistem dapat menampilkan waktu real-time dan mengaktifkan alarm dengan stabil dan akurat.


3.3  Diagram Blok

3.4  Flowchart

3.5  Gambar Rangkaian

 

3.6  Foto Prototipe





3.7  Kode Program

/*******************************************************************************

SMART CLOCK - JAM ALARM DIGITAL MULTI-TONE

Kelompok 1

*

Hardware:

- ATmega16 @1 MHz (internal RC)

- RTC DS1307 (I2C address 0x68)

- LCD 16x2 I2C (PCF8574 address 0x20)

- 3 tombol (SET, UP, DOWN) di PB0-2

- Buzzer aktif 3-12V di PD6

- 3 LED indikator di PD3-5

*

Fitur:

- Jam digital real-time dengan hari/tanggal

- Alarm dengan 5 pilihan nada (Siren, Rapid, Emergency, Kontinyu, Triple)

- Menu navigasi modern (kursor)

- Hourly chime (bunyi setiap jam)

- Simpan setting ke EEPROM (alarm tetap walau mati listrik)

*******************************************************************************/

 

#include <mega16.h>

#include <i2c.h>

#include <ds1307.h>

#include <delay.h>

 

// ========== ALAMAT I2C ==========

#define LCD_ADDR 0x20      // Alamat I2C LCD

 

// ========== PIN TOMBOL ==========

#define BTN_SET   PINB.0   // Tombol SET: masuk menu / simpan

#define BTN_UP    PINB.1   // Tombol UP: navigasi atas / tambah nilai

#define BTN_DOWN  PINB.2   // Tombol DOWN: navigasi bawah / kurangi nilai

 

// ========== VARIABEL WAKTU RTC ==========

unsigned char jam, menit, detik;     // Waktu sekarang (jam:menit:detik)

unsigned char hari, tgl, bln, thn;   // Tanggal sekarang (hari/tgl/bln/thn)

unsigned char detik_lama = 255;      /*Sebagai deklarasi detik sebelumnya untuk tampilan LCD

Akurat tidak loncat loncat*/

// ========== VARIABEL MENU ==========

unsigned char menu_pos = 0;    // Posisi menu (0=home, 1-9=menu pilihan, 10=keluar)

unsigned char menu_aktif = 0;  // Status menu (0=list menu, 1=sedang edit nilai)

signed char edit_val = 0;      // Nilai sementara saat edit (bisa negatif untuk cek batas bawah)

 

// ========== EEPROM ALARM  ==========

eeprom unsigned char ee_alm_h = 0;    // Jam alarm default: 00:00

eeprom unsigned char ee_alm_m = 0;

eeprom unsigned char ee_alm_on = 1;   // Alarm default: ON

eeprom unsigned char ee_nada = 1;     // Nada alarm default: Siren

 

unsigned char alm_h, alm_m, alm_on, nada_alarm;  // Variabel alarm

 

// ========== ARRAY TEKS ==========

flash char *nama_hari[] = {

"??",      // Index 0

"MINGGU",  // Index 1

"SENIN ",  // Index 2

"SELASA",  // Index 3

"RABU  ",  // Index 4

"KAMIS ",  // Index 5

"JUMAT ",  // Index 6

"SABTU "   // Index 7

};

 

flash char *nama_nada[] = {

"",        // Index 0 (tidak dipakai)

"SIREN",   // Index 1: cepat-lambat bergantian

"RAPID",   // Index 2: bunyi panjang cepat

"EMERG",   // Index 3: seperti ambulans

"KONTI",   // Index 4: kontinyu (paling keras!)

"TRIPLE"   // Index 5: kombinasi 3 tempo

};

 

flash char *nama_menu[] = {

"JAM",         // Index 0: set jam

"MENIT",       // Index 1: set menit

"TANGGAL",     // Index 2: set tanggal

"BULAN",       // Index 3: set bulan

"TAHUN",       // Index 4: set tahun

"ALARM JAM",   // Index 5: set jam alarm

"ALARM MENIT", // Index 6: set menit alarm

"ALM ON/OFF",  // Index 7: nyalakan/matikan alarm

"NADA ALARM",  // Index 8: pilih nada alarm (1-5)

"KELUAR"       // Index 9: keluar dari menu

};

 

// ========== FUNGSI LCD I2C DRIVER ==========

// LCD dihubungkan lewat I2C

 

void i2c_kirim_byte(unsigned char data) {

// Kirim 1 byte data ke LCD via I2C

i2c_start();                    // Mulai komunikasi I2C

i2c_write(LCD_ADDR << 1);       // Kirim alamat LCD (write mode)

i2c_write(data | 0x08);         // Kirim data + backlight ON (bit 3)

i2c_stop();                     // Akhiri komunikasi

}

 

void i2c_kedip_en(unsigned char data) {

// Kirim sinyal Enable (clock) ke LCD untuk proses data

i2c_kirim_byte(data | 0x04);    // Enable HIGH

delay_us(10);

i2c_kirim_byte(data & ~0x04);   // Enable LOW

delay_us(50);

}

 

void i2c_pecah_data(unsigned char val, unsigned char mode) {

// Pecah 8-bit jadi 2x 4-bit (high nibble dulu, lalu low nibble)

// mode: 0=command, 1=data

unsigned char high = val & 0xF0;       // Ambil 4 bit atas

unsigned char low = (val << 4) & 0xF0; // Ambil 4 bit bawah, shift ke atas

i2c_kedip_en(high | mode);             // Kirim nibble atas

i2c_kedip_en(low | mode);              // Kirim nibble bawah

}

 

void lcd_cmd(unsigned char cmd) {

i2c_pecah_data(cmd, 0);  // Kirim perintah (RS=0)

}

 

void lcd_data(unsigned char dat) {

i2c_pecah_data(dat, 1);  // Kirim data karakter (RS=1)

}

 

void lcd_clear() {

lcd_cmd(0x01);           // Perintah clear display

delay_ms(2);             // Tunggu LCD selesai clear

}

 

void lcd_gotoxy(unsigned char x, unsigned char y) {

// Pindahkan kursor ke posisi (x, y)

// y=0: baris 1 (alamat 0x80-0x8F)

// y=1: baris 2 (alamat 0xC0-0xCF)

unsigned char addr = (y == 0) ? (0x80 + x) : (0xC0 + x);

lcd_cmd(addr);

}

 

void lcd_putsf(flash char *str) {

// Tampilkan string dari FLASH memory

while (*str) lcd_data(*str++);

}

 

void tampil_angka(unsigned char angka) {

// Tampilkan angka 2 digit (00-99)

lcd_data((angka / 10) + '0');  // Digit puluhan

lcd_data((angka % 10) + '0');  // Digit satuan

}

 

void lcd_putchar(unsigned char c) {

// Tampilkan 1 karakter

lcd_data(c);

}

 

void lcd_init_i2c() {

// Inisialisasi LCD 16x2 mode I2C (4-bit interface)

delay_ms(100);               // Tunggu LCD power-on

i2c_kedip_en(0x30); delay_ms(5);  // Sequence inisialisasi 8-bit mode

i2c_kedip_en(0x30); delay_ms(1);

i2c_kedip_en(0x30); delay_ms(1);

i2c_kedip_en(0x20);          // Switch ke 4-bit mode

lcd_cmd(0x28);               // 4-bit, 2 baris, font 5x8

lcd_cmd(0x0C);               // Display ON, cursor OFF

lcd_cmd(0x06);               // Auto increment cursor

lcd_clear();

}

 

// ========== FUNGSI BUZZER ==========

void beep() {

// Bunyi pendek (feedback tombol)

PORTD.6 = 1;   // Buzzer ON

delay_ms(30);  // Durasi 30ms

PORTD.6 = 0;   // Buzzer OFF

}

 

// ========== ANIMASI LOADING SAAT BOOTING ==========

void loading_animation() {

 

int i;  // Variabel loop

lcd_clear();

lcd_gotoxy(0,0);

lcd_putsf("SMARTCLOCK.....");  // Tampil teks di baris 1   

// Progress bar di baris 2 (16 kotak penuh)

lcd_gotoxy(0,1);

for (i=0; i<16; i++) {

lcd_putchar(0xFF);  // 0xFF = karakter kotak hitam penuh

delay_ms(500);      // Delay animasi (bisa dipercepat)

}  

delay_ms(500);

lcd_clear();  

// Tampil info kelompok

lcd_gotoxy(0,0); lcd_putsf("KELOMPOK 1");

lcd_gotoxy(4,1); lcd_putsf("JAM DIGITAL");   

// Bunyi beep panjang = tanda siap

PORTD.6=1; delay_ms(300);

PORTD.6=0; delay_ms(1500);

lcd_clear();

}

 

// ========== FUNGSI HITUNG HARI (ALGORITMA ZELLER) ==========

// Input: tanggal (d), bulan (m), tahun 2 digit (y)

unsigned char hitung_hari(unsigned char d, unsigned char m, unsigned char y) {

// Output: hari (1=Minggu, 2=Senin, ..., 7=Sabtu)

unsigned int thn_full = 2000 + y;  // Konversi tahun ke 4 digit

static int t[] = {0,3,2,5,0,3,5,1,4,6,2,4}; //Tabel Zeller

//Jan Feb Mar Apr Mei Jun Jul Agt Sep Okt Nov Des

if (m < 3) thn_full -= 1;  // Januari & Februari dianggap bulan 13 & 14 tahun sebelumnya     

// Rumus Zeller Congruence

return (thn_full + thn_full/4 - thn_full/100 + thn_full/400 + t[m-1] + d) % 7 + 1;

}

 

// ========== FUNGSI UPDATE DISPLAY ==========

void update_display() {

// Fungsi ini dipanggil setiap detik atau saat menu berubah  

if (menu_pos == 0 && menu_aktif == 0) {

// ========== HOME SCREEN (TAMPILAN JAM) ==========      

 

// BARIS 1: Hari & Tanggal

lcd_gotoxy(0,0);

lcd_putsf(nama_hari[hari]);  // Tampil hari (MINGGU, SENIN, ...)

lcd_data(' ');

tampil_angka(tgl); lcd_data('/');  // Tanggal

tampil_angka(bln); lcd_data('/');  // Bulan

tampil_angka(thn);                 // Tahun (2 digit)

 

// BARIS 2: Jam & Info Alarm

lcd_gotoxy(0,1);

 

if (alm_on) {

// Alarm ON: tampil jam di kiri, info alarm di kanan

tampil_angka(jam);

if (detik % 2 == 0) lcd_data(':'); else lcd_data(' ');  // Blinking colon

tampil_angka(menit);

if (detik % 2 == 0) lcd_data(':'); else lcd_data(' ');

tampil_angka(detik);

 

lcd_data(' '); lcd_data('A');  // "A" = Alarm

tampil_angka(alm_h); lcd_data(':'); tampil_angka(alm_m);  // Waktu alarm

}

else {

// Alarm OFF: jam ditampilkan di tengah (estetika!)

lcd_putsf("    ");  // 4 spasi kiri

tampil_angka(jam);

if (detik % 2 == 0) lcd_data(':'); else lcd_data(' ');

tampil_angka(menit);

if (detik % 2 == 0) lcd_data(':'); else lcd_data(' ');

tampil_angka(detik);

lcd_putsf("  ");  // 2 spasi kanan (total 16 karakter)

}

}

else if (menu_aktif == 0) {

// ========== LIST MENU (NAVIGASI MENU) ==========

lcd_gotoxy(0,0);

lcd_putsf("MENU:           ");

 

lcd_gotoxy(0,1);

lcd_data('>');  // Kursor menu

lcd_putsf(nama_menu[menu_pos-1]);  // Nama menu saat ini

lcd_putsf("            ");  // Clear sisa karakter

}

else {

// ========== MODE EDIT (UBAH NILAI) ==========

lcd_gotoxy(0,0);

lcd_putsf("EDIT:");

lcd_putsf(nama_menu[menu_pos-1]);  // Tampil menu yang sedang diedit

lcd_putsf("      ");

 

lcd_gotoxy(0,1);

 

// Tampilkan nilai sesuai menu

if (menu_pos==1 || menu_pos==6) {

lcd_putsf("JAM: "); tampil_angka(edit_val); lcd_putsf("       ");

}

else if (menu_pos==2 || menu_pos==7) {

lcd_putsf("MENIT: "); tampil_angka(edit_val); lcd_putsf("     ");

}

else if (menu_pos==3) {

lcd_putsf("TGL: "); tampil_angka(edit_val); lcd_putsf("       ");

}

else if (menu_pos==4) {

lcd_putsf("BLN: "); tampil_angka(edit_val); lcd_putsf("       ");

}

else if (menu_pos==5) {

lcd_putsf("THN: 20"); tampil_angka(edit_val); lcd_putsf("     ");

}

else if (menu_pos==8) {

 

// Alarm ON/OFF

if (edit_val) lcd_putsf("[ON]            ");

else lcd_putsf("[OFF]           ");

}

else if (menu_pos==9) {

// Nada alarm (1-5)

lcd_data('['); lcd_data('0'+edit_val); lcd_data(']');

lcd_data(' ');

lcd_putsf(nama_nada[edit_val]);

lcd_putsf("       ");

}

}

}

 

// ========== FUNGSI NADA ALARM ==========

// Semua fungsi nada: loop TERUS sampai tombol ditekan (stop_flag=1)

 

void nada_siren(unsigned char *stop_flag) {

// Nada Siren: cepat-lambat bergantian (seperti polisi)

unsigned char i;

while(!(*stop_flag)) {  // Loop terus sampai stop_flag=1

// Fase cepat: 10x bunyi pendek

for(i=0; i<10; i++) {

PORTD.6=1; delay_ms(50); PORTD.6=0; delay_ms(50);

if (BTN_SET==0 || BTN_UP==0 || BTN_DOWN==0) { *stop_flag=1; return; }

}

// Fase lambat: 5x bunyi sedang

for(i=0; i<5; i++) {

PORTD.6=1; delay_ms(150); PORTD.6=0; delay_ms(150);

if (BTN_SET==0 || BTN_UP==0 || BTN_DOWN==0) { *stop_flag=1; return; }

}

}

}

 

void nada_rapid(unsigned char *stop_flag) {

// Nada Rapid: bunyi panjang cepat (400ms ON, 100ms OFF)

while(!(*stop_flag)) {

PORTD.6=1; delay_ms(400); PORTD.6=0; delay_ms(100);

if (BTN_SET==0 || BTN_UP==0 || BTN_DOWN==0) { *stop_flag=1; return; }

}

}

 

void nada_emergency(unsigned char *stop_flag) {

// Nada Emergency: seperti ambulans (pola cepat-lambat-pause)

unsigned char i;

while(!(*stop_flag)) {

// 5x cepat

for(i=0; i<5; i++) {

PORTD.6=1; delay_ms(80); PORTD.6=0; delay_ms(80);

}

delay_ms(200);  // Pause

// 3x lambat

for(i=0; i<3; i++) {

PORTD.6=1; delay_ms(300); PORTD.6=0; delay_ms(300);

}

delay_ms(200);  // Pause

if (BTN_SET==0 || BTN_UP==0 || BTN_DOWN==0) { *stop_flag=1; return; }

}

}

 

void nada_kontinyu(unsigned char *stop_flag) {

// Nada Kontinyu: hampir non-stop (80ms ON, 20ms OFF = paling keras!)

while(!(*stop_flag)) {

PORTD.6=1; delay_ms(80); PORTD.6=0; delay_ms(20);

if (BTN_SET==0 || BTN_UP==0 || BTN_DOWN==0)

{

*stop_flag=1;

return;

}

}

}

 

void nada_triple(unsigned char *stop_flag) {

// Nada Triple: kombinasi 3 tempo (super cepat - panjang - sedang)

unsigned char i;

while(!(*stop_flag)) {

// Fase 1: super cepat 20x

for(i=0; i<20; i++) {

PORTD.6=1; delay_ms(30); PORTD.6=0; delay_ms(30);

}

// Fase 2: panjang 3x

for(i=0; i<3; i++) {

PORTD.6=1; delay_ms(500); PORTD.6=0; delay_ms(200);

}

// Fase 3: sedang 10x

for(i=0; i<10; i++) {

PORTD.6=1; delay_ms(100); PORTD.6=0; delay_ms(100);

}

if (BTN_SET==0 || BTN_UP==0 || BTN_DOWN==0) { *stop_flag=1; return; }

}

}

 

// ========== FUNGSI MAIN (PROGRAM UTAMA) ==========

void main(void) {

// Variabel flag / status

unsigned char alarm_flag = 0;   // Status alarm (0=belum bunyi, 1=sedang bunyi)

unsigned char chime_flag = 0;   // Status chime jam (0=belum bunyi, 1=sudah bunyi)

unsigned char stop_alarm = 0;   // Flag stop alarm (1=stop, 0=terus bunyi)

unsigned char i;                // Variabel loop

 

// ========== KONFIGURASI PORT ==========

DDRB  = 0x00;  // Port B semua input (tombol PB0-2)

PORTB = 0x07;  // Pull-up resistor aktif untuk PB0-2

 

DDRD  = 0xFF;  // Port D semua output (PD6=buzzer, PD3-5=LED)

PORTD = 0x00;  // Semua output LOW (mati)

 

// ========== INISIALISASI PERIFERAL ==========

i2c_init();              // Init komunikasi I2C (untuk LCD dan RTC)

rtc_init(0,0,0);         // Init RTC DS1307

lcd_init_i2c();          // Init LCD 16x2 I2C

 

// ========== LOAD SETTING ALARM DARI EEPROM ==========

alm_h = ee_alm_h;        // Baca jam alarm dari EEPROM

alm_m = ee_alm_m;        // Baca menit alarm dari EEPROM

alm_on = ee_alm_on;      // Baca status alarm (ON/OFF) dari EEPROM

nada_alarm = ee_nada;    // Baca nada alarm (1-5) dari EEPROM

 

// Validasi data EEPROM (kalau corrupt/belum pernah diisi)

if (alm_h > 23)

alm_h=6;                      // Default jam 06:00

if (alm_m > 59)

alm_m=0;

if (alm_on > 1)

alm_on=1;                     // Default ON

if (nada_alarm < 1 || nada_alarm > 5)

nada_alarm=1;  // Default Siren

 

// ========== TAMPILKAN ANIMASI LOADING ==========

loading_animation();

 

// ========== LOOP UTAMA  ==========

while (1) {

// ========== BACA WAKTU DARI RTC DS1307 ==========

rtc_get_time(&jam, &menit, &detik);       // Baca jam, menit, detik

rtc_get_date(&hari, &tgl, &bln, &thn);    // Baca hari, tanggal, bulan, tahun

hari = hitung_hari(tgl, bln, thn);        // Hitung hari dari tanggal (Zeller)

 

// ========== UPDATE LCD  ==========

if (menu_pos == 0 && menu_aktif == 0) {

if (detik != detik_lama) {  // Deteksi perubahan detik

detik_lama = detik;     // Simpan detik sekarang

update_display();        // Update tampilan jam di LCD

}

}

 

// ========== HOURLY CHIME (BUNYI SETIAP JAM :00) ==========

if (menu_pos==0 && menit==0 && detik==0 && !chime_flag) {

// Bunyi 2x beep saat tepat jam :00:00

for(i=0; i<2; i++) { beep(); delay_ms(100); }

chime_flag = 1;  // Flag agar tidak bunyi terus

}

 

if (detik != 0) chime_flag = 0;  // Reset flag saat detik bukan 0

 

 

// ========== ALARM (BUNYI SAAT JAM = ALARM) ==========

if (menu_pos==0 && alm_on && jam==alm_h && menit==alm_m && detik==0 && !alarm_flag) {

 

alarm_flag = 1;   // Set flag alarm aktif

stop_alarm = 0;   // Reset flag stop

 

// Tampil pesan alarm di LCD

lcd_clear();

lcd_gotoxy(2,0); lcd_putsf("** ALARM **");

lcd_gotoxy(2,1); lcd_putsf(nama_nada[nada_alarm]); lcd_putsf(" PLAY!");

delay_ms(1000);

 

// Panggil fungsi nada sesuai pilihan (1-5)

if (nada_alarm == 1) nada_siren(&stop_alarm);

else if (nada_alarm == 2) nada_rapid(&stop_alarm);

else if (nada_alarm == 3) nada_emergency(&stop_alarm);

else if (nada_alarm == 4) nada_kontinyu(&stop_alarm);

else if (nada_alarm == 5) nada_triple(&stop_alarm);

 

PORTD.6 = 0;   // Matikan buzzer

lcd_clear();   // Clear LCD

}

if (detik != 0) alarm_flag = 0;  // Reset flag alarm saat detik bukan 0

 

// ========== TOMBOL SET (NAVIGASI & SIMPAN) ==========

if (BTN_SET == 0) {

delay_ms(30);  // Debounce (anti-bouncing tombol)

if (BTN_SET == 0) {

beep();  // Feedback suara

 

if (menu_pos == 0 && menu_aktif == 0) {

// HOME ? Masuk list menu

menu_pos = 1;

lcd_clear();

}

else if (menu_aktif == 0 && menu_pos >= 1 && menu_pos <= 9) {

// LIST MENU ? Masuk mode edit

menu_aktif = 1;

 

// Inisialisasi nilai edit sesuai menu

if (menu_pos==1) edit_val = jam;

else if (menu_pos==2) edit_val = menit;

else if (menu_pos==3) edit_val = tgl;

else if (menu_pos==4) edit_val = bln;

else if (menu_pos==5) edit_val = thn;

else if (menu_pos==6) edit_val = alm_h;

else if (menu_pos==7) edit_val = alm_m;

else if (menu_pos==8) edit_val = alm_on;

else if (menu_pos==9) edit_val = nada_alarm;

 

lcd_clear();

}

else if (menu_aktif == 1) {

// MODE EDIT ? Simpan & keluar ke list menu

 

// Simpan nilai edit ke RTC / variabel

if (menu_pos==1) {

rtc_set_time(edit_val, menit, 0);  // Set jam ke RTC

jam=edit_val;

}

else if (menu_pos==2) {

rtc_set_time(jam, edit_val, 0);  // Set menit ke RTC

menit=edit_val;

}

else if (menu_pos==3) {

tgl = edit_val;

hari = hitung_hari(tgl, bln, thn);  // Hitung hari otomatis

rtc_set_date(hari, tgl, bln, thn);  // Simpan ke RTC

}

else if (menu_pos==4) {

bln = edit_val;

hari = hitung_hari(tgl, bln, thn);

rtc_set_date(hari, tgl, bln, thn);

}

else if (menu_pos==5) {

thn = edit_val;

hari = hitung_hari(tgl, bln, thn);

rtc_set_date(hari, tgl, bln, thn);

}

 

else if (menu_pos==6) alm_h = edit_val;

else if (menu_pos==7) alm_m = edit_val;

else if (menu_pos==8) alm_on = edit_val;

else if (menu_pos==9) nada_alarm = edit_val;

 

// Simpan alarm ke EEPROM (tetap tersimpan walau mati listrik)

ee_alm_h = alm_h;

ee_alm_m = alm_m;

ee_alm_on = alm_on;

ee_nada = nada_alarm;

 

// Tampil pesan "SAVED!"

lcd_clear();

lcd_gotoxy(4,0); lcd_putsf("SAVED!");

delay_ms(800);

 

menu_aktif = 0;  // Keluar dari mode edit

lcd_clear();

}

else if (menu_pos == 10) {

// Menu KELUAR ? Balik ke home

menu_pos = 0;

menu_aktif = 0;

lcd_clear();

}

 

update_display();  // Update tampilan LCD

while(BTN_SET == 0);  // Tunggu tombol dilepas

}

}

 

// ========== TOMBOL UP (NAVIGASI ATAS / TAMBAH NILAI) ==========

if (BTN_UP == 0) {

delay_ms(30);

if (BTN_UP == 0) {

beep();

 

if (menu_aktif == 0) {

// MODE NAVIGASI: geser menu ke atas

menu_pos++;

if (menu_pos > 10) menu_pos = 0;  // Kembali ke home

lcd_clear();

}

else {

// MODE EDIT: tambah nilai (+1)

edit_val++;

 

// Cek batas atas (wrapping ke 0 atau batas bawah)

if (menu_pos==1 && edit_val>23) edit_val=0;   // Jam: 0-23

if (menu_pos==2 && edit_val>59) edit_val=0;   // Menit: 0-59

if (menu_pos==3 && edit_val>31) edit_val=1;   // Tanggal: 1-31

if (menu_pos==4 && edit_val>12) edit_val=1;   // Bulan: 1-12

if (menu_pos==5 && edit_val>99) edit_val=0;   // Tahun: 0-99

if (menu_pos==6 && edit_val>23) edit_val=0;   // Alarm jam: 0-23

if (menu_pos==7 && edit_val>59) edit_val=0;   // Alarm menit: 0-59

if (menu_pos==8 && edit_val>1)  edit_val=0;   // Alarm ON/OFF: 0-1

if (menu_pos==9 && edit_val>5)  edit_val=1;   // Nada: 1-5

}

 

update_display();

while(BTN_UP == 0);

}

}

 

// ========== TOMBOL DOWN (NAVIGASI BAWAH / KURANGI NILAI) ==========

if (BTN_DOWN == 0) {

delay_ms(30);

if (BTN_DOWN == 0) {

beep();

 

if (menu_aktif == 0) {

// MODE NAVIGASI: geser menu ke bawah

if (menu_pos == 0) menu_pos = 10;  // Dari home ke menu terakhir

else menu_pos--;

lcd_clear();

}

else {

// MODE EDIT: kurangi nilai (-1)

edit_val--;

 

// Cek batas bawah (wrapping ke nilai maksimal)

if (menu_pos==1 && edit_val<0) edit_val=23;

if (menu_pos==2 && edit_val<0) edit_val=59;

if (menu_pos==3 && edit_val<1) edit_val=31;

if (menu_pos==4 && edit_val<1) edit_val=12;

if (menu_pos==5 && edit_val<0) edit_val=99;

if (menu_pos==6 && edit_val<0) edit_val=23;

if (menu_pos==7 && edit_val<0) edit_val=59;

if (menu_pos==8 && edit_val<0) edit_val=1;

if (menu_pos==9 && edit_val<1) edit_val=5;

}

 

update_display();

while(BTN_DOWN == 0);

}

}

 

delay_ms(100);  // Delay loop utama

}

}

 


 

BAB IV

KESIMPULAN

Proyek sistem berbasis microcontroller ATmega8535 ini dirancang untuk melakukan pencatatan waktu secara akurat menggunakan modul RTC (Real Time Clock), menampilkan informasi pada LCD, serta memberikan peringatan melalui buzzer sesuai kondisi yang telah diprogram. Dengan dukungan minimum system ATmega8535 dan perangkat pemrograman USBasp, seluruh rangkaian dapat bekerja secara terintegrasi dan stabil. RTC memastikan waktu tetap berjalan meskipun catu daya mati, LCD berfungsi sebagai media tampilan utama, dan buzzer sebagai indikator suara. Sistem ini menunjukkan bagaimana kombinasi berbagai komponen elektronik dapat membentuk alat yang fungsional, terprogram, dan mudah dikembangkan sesuai kebutuhan aplikasi lain seperti absensi, pengingat otomatis, atau sistem monitoring digital.


 

BAB V

DAFTAR PUSTAKA

 

1.     Atmel / Microchip. (2012). ATmega8535 8-bit AVR Microcontroller Datasheet. Diakses dari https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-P-ATmega8535_Datasheet.pdf

 

2.     Maxim Integrated. (2005). DS1307 Real-Time Clock (RTC) Datasheet. Diakses dari https://datasheets.maximintegrated.com/en/ds/DS1307.pdf

 

3.     Last Minute Engineers. (2023). LCD 16x2 Interfacing with AVR Microcontroller. Diakses dari https://lastminuteengineers.com/lcd-16x2-avr-library-code/

 

4.     Ansari, M. (2022). RTC DS1307 with AVR UNO – Project Tutorial. Diakses dari https://create.arduino.cc/projecthub/muhammed-ansari/rtc-ds1307-with-avr-uno-3e0060

 

5.     Electronics Hub. (2021). How to Interface LCD 16×2 with AVR Microcontroller. Diakses dari https://www.electronicshub.org/lcd-16x2-display-with-avr-microcontroller/

 

6.     CircuitDigest. (2020). Digital Clock Using AVR Microcontroller and DS1307 RTC. Diakses dari https://circuitdigest.com/microcontroller-projects/digital-clock-using-avr-and-ds1307-rtc-module

 

7.     MikroElektronika. (2019). AVR I2C Communication Tutorial. Diakses dari https://mikroe.com/ebooks/avr-i2c-communication/pdf

 

8.     Instructables User. (2018). Build a Digital Clock with ATmega and RTC. Diakses dari https://www.instructables.com/ATmega-Digital-Clock-Using-RTC-DS1307/

 

 

 

 



 

LAMPIRAN

Kumpulan Pertanyaan

 Link PPT

Klik Disini

 

Link Video

Klik Disini


BIODATA PENULIS

 

Abieza Putra Yudha lahir di Semarang, 5 Desember 2005. Penulis merupakan mahasiswa Program Studi D-3 Teknik Elektronika, Teknik Elektro, Politeknik Negeri Semarang. Pendidikan menengah ditempuh di SMK Negeri 7 Semarang.

Apabila ada kritik, saran dan pernyataan mengenai project ini, bisa menghubungi melalui

Email : abieza.33224001@mhs.polines.ac.id

 

Faridhotun Nisa lahir di Jepara, 10 Desember 2005. Penulis merupakan mahasiswa Program Studi D-3 Teknik Elektronika, Teknik Elektro, Politeknik Negeri Semarang. Pendidikan menengah diselesaikan di SMK Tunas Harapan Pati.

Apabila ada kritik, saran dan pernyataan mengenai project ini, bisa menghubungi melalui

Email : nisa.33224001@mhs.polines.ac.id

 

Ghofur Fadli Alfan lahir di Rembang, 8 Agustus 2006. Penulis merupakan mahasiswa Program Studi D-3 Teknik Elektronika, Teknik Elektro, Politeknik Negeri Semarang. Pendidikan menengah diselesaikan di SMA Negeri 1 Rembang.

Apabila ada kritik, saran dan pernyataan mengenai project ini, bisa menghubungi melalui

Email : ghofur.33224001@mhs.polines.ac.id

 

Luky Setiyawan lahir di Pati, 14 April 2006. Penulis merupakan mahasiswa Program Studi D-3 Teknik Elektronika, Teknik Elektro, Politeknik Negeri Semarang. Pendidikan menengah diselesaikan di SMK Negeri 1 Cluwak.

Apabila ada kritik, saran dan pernyataan mengenai project ini, bisa menghubungi melalui

Email : luky.33224001@mhs.polines.ac.id

 

 

 

 

Komentar

Postingan populer dari blog ini

AIR TEMPERATURE SWITCHING AND MONITORING SYSTEM DENGAN MENGGUNAKAN SENSOR LM35 BERBASIS ATMEGA 16

RANCANG BANGUN KALKULATOR DIGITAL OPERASI KALI DAN BAGI BERBASIS MIKROKONTROLER AT89C51

SISTEM LAMPU LALU LINTAS PERTIGAAN BERBASIS AT89s51 DENGAN SENSOR INFRAMERAH