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.id, 2 nisa.33224011@mhs.polines.ac.id ,
3 ghofur.33224012@mhs.polines.ac.id , 4 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:
- 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.
- Politeknik Negeri Semarang (POLINES) yang
telah menyediakan fasilitas pendukung bagi kelancaran penelitian dan
pembuatan proyek.
- Teman–teman kelompok 1 yang telah
meluangkan waktu, tenaga, dan pikiran untuk bekerja sama dalam
menyelesaikan proyek ini.
- Orang tua, yang selalu memberi doa,
dukungan, dan izin kepada anggota kelompok sehingga seluruh proses dapat
berjalan dengan baik.
- 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.
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.
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.
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.
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.
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.
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.
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.
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
Link Video
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
Posting Komentar