Jam Digital dan Kalkulator berbasis Arduino

Hugi Reyhandani
7 min readMar 12, 2019

Pada kali ini, penulis akan membahas tentang pembuatan Jam Digital dan Kalkulator berbasis Arduino. Berikut adalah komponen yang dibutuhkan untuk membuat perangkat :

  1. Keypad
  2. 7 Segment
  3. Arduino Uno
  4. Breadboard
  5. Jumper Male to Male

Di dalam perangkat ini di setting menjadi 2 mode yaitu mode pengaturan jam digital dan mode mengaplikasikan kalkulator.

JAM DIGITAL

Ketika pengguna menekan tombol (*) maka pengguna akan masuk ke mode Jam Digital. Ketika tombol (*) di tekan, maka program akan menginisiasi pengaturan jam berupa input digit menit kedua, digit menit pertama, digit jam kedua dan digit jam pertama. Cara mengatur digitnya adalah menekan tombol 6 (increment) dan tombol 4 (decrement) ketika telah menginput digit di menit maupun di jam, selalu menekan tombol 5 (tombol yang digunakan untuk pindah ke digit selanjutnya). Berikut adalah video penggunaan mode jam digital.

KALKULATOR

Ketika pengguna menekan tombol (#) maka pengguna akan masuk ke mode Kalkulator. Setelah memasuki mode kalkulator, pengguna akan diminta untuk memasukan 2 inputan angka yang masing-masing terdiri dari 2 digit. Setiap menginput angka harus di lanjutkan dengan menekan tombol (*) untuk menginput angka selanjutnya. Setelah 2 inputan angka dimasukan, selanjutnya pengguna akan memasukan operasi yang ingin dilakukan. Tombol (A) untuk melakukan penjumlahan, Tombol (B) untuk melakukan pengurangan dan Tombol C untuk melakukan perkalian. Berikut adalah video untuk menggunakan mode Kalkulator.

Dan berikut ini merupakan Source Code Arduino untuk Jam Digital dan Kalkulator :

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

//Deklarasi Variabel
//inisiasi jam awal
int count = 0;
int mnt1 = 9;
int mnt2 = 5;
int jam1 = 3;
int jam2 = 1;
//int keypad;
int a1, a2, a, b1, b2, b, dig1, dig2, dig3, dig4, N, keypad, neg;
bool mode = true;
int mins1, mins2, hour1, hour2;

void timer (void);
void disp7seg (int x);
int readKeypad(void);

//interrupt
ISR(TIMER1_OVF_vect)
{ //mengeset waktu interval
TCNT1H = 0xC2;
TCNT1L = 0xF7;

//menambah detik
count++;

//perhitungan menit dan jam
if (count > 59)
{
mnt1++;
count=0;
if (mnt1 > 9)
{
mnt2++;
mnt1=0;
if (mnt2 > 5)
{
jam1++;
mnt2=0;
if(jam1>9)
{
jam2++;
jam1=0;
}
}
}
}
if(jam2==2 && jam1>3)
{
jam2=0;
jam1=0;
}
}

//program utama
int main (void)
{
//pemanggilan fungsi init
timer ();

TIMSK1 = 0b00000001;
DDRB = 0xFF; //mengeset PORT B untuk output digit ke- seven segmen
PORTB = 0xFF;
DDRD = 0xFF; //mengeset PORT D untuk output seven segment & interrupt
PORTD = 0xFF;
DDRC = 0b00110000;
PORTC = 0x0F;
//looping dalam program utama
while (1)
{
keypad = readKeypad();
//mode 7seg akan berganti jika user menekan tombol push button
if ((keypad == ‘*’) || (keypad == ‘#’))
{
mode = !mode;
}

if (mode == true) //mode jam
{
//menampilkan m1 di pin PB0
PORTB = 0b00000001;
disp7seg(jam2);
_delay_ms (1);

//menampilkan m2 di pin PB1
PORTB = 0b00000010;
disp7seg(jam1);
_delay_ms (1);

//menampilkan jam1 di pin PB2
PORTB = 0b00000100;
disp7seg(mnt2);
_delay_ms (1);

//menampilkan jam2 di pin PB3
PORTB = 0b00001000;
disp7seg(mnt1);
_delay_ms (1);
}

else if ((mode == false) && (keypad == ‘*’)) //mode pengesetan
{
//menentukan digit ke- yang akan diset
mins1 = mnt1;
PORTB = 0b00001000;
disp7seg(mins1);
_delay_ms(100);

//merubah digit ke-1 (mnt1)
keypad = readKeypad ();
while (keypad != 5)
{
if (keypad == 6)
{
//increment
if (mins1 == 9)
{
mins1 = 0;
}
else
{
mins1 ++;
}
}
else if (keypad == 4)
{
//decrement
if (mins1 == 0)
{
mins1 = 9;
}
else
{
mins1 — ;
}
}
disp7seg (mins1);
_delay_ms(100);
keypad = readKeypad ();
}
mnt1 = mins1;

mins2 = mnt2;
PORTB = 0b00000100;
disp7seg (mins2);
_delay_ms (100);

//merubah digit ke-2
keypad = readKeypad ();
while (keypad != 5)
{
if (keypad == 6)
{
//increment
if (mins2 == 5)
{
mins2 = 0;
}
else
{
mins2 ++;
}
}
else if (keypad == 4)
{
//decrement
if (mins2 == 0)
{
mins2 = 5;
}
else
{
mins2 — ;
}
}
disp7seg (mins2);
_delay_ms(100);
keypad = readKeypad ();
}
mnt2 = mins2;

hour1 = jam1;
PORTB = 0b00000010;
disp7seg (hour1);
_delay_ms (100);

//merubah digit ke-3
keypad = readKeypad ();
while (keypad != 5)
{
if ((hour2==1)||(hour2==0)){
if (keypad == 6)
{
//increment
if (hour1 == 9)
{
hour1= 0;
}
else
{
hour1 ++;
}
}
else if (keypad == 4)
{
//decrement
if (hour1 == 0)
{
hour1 = 9;
}
else
{
hour1 — ;
}
}
}
else if (hour2==2){
if (keypad == 6)
{
//increment
if (hour1 == 3)
{
hour1= 0;
}
else
{
hour1 ++;
}
}
else if (keypad == 4)
{
//decrement
if (hour1 == 0)
{
hour1 = 3;
}
else
{
hour1 — ;
}
}
} disp7seg (hour1);
_delay_ms(100);
keypad = readKeypad ();
}
jam1 = hour1;

hour2 = jam2;
PORTB = 0b00000001;
disp7seg (hour2);
_delay_ms (100);

//merubah digit ke-4
keypad = readKeypad ();
while (keypad != 5)
{
if (keypad == 6)
{
//increment
if (hour2 == 2)
{
hour2= 0;
}
else
{
hour2 ++;
}
}
else if (keypad == 4)
{
//decrement
if (hour2 == 0)
{
hour2 = 2;
}
else
{
hour2 — ;
}
}
disp7seg (hour2);
_delay_ms(100);
keypad = readKeypad ();
}
jam2 = hour2;

mode =true;

}


else if ((mode == false) && (keypad == ‘#’)) //calc
{ //default tampilan, bagian ini akan dikembangkan untuk tugas selanjutnya
int k=0;
while (k<1000)
{
PORTB = 0b00000001;
PORTD = 0b00000000;
_delay_ms(1);

PORTB = 0b00000010;
PORTD = 0b00000000;
_delay_ms(1);

PORTB = 0b00000100;
PORTD = 0b00000000;
_delay_ms(1);

PORTB = 0b00001000;
PORTD = 0b00000000;
_delay_ms(1);
PORTD = 0xFF;

k++;
}



//input a1
keypad = readKeypad();
while (keypad != ‘*’)
{
if ((keypad >= 0) && (keypad <= 9))
{
a1 = keypad;
}
keypad = readKeypad ();
}

PORTB = 0b00000100;
disp7seg(a1);
_delay_ms(1000);
a = a1*10;

//input A2
keypad = readKeypad();
while (keypad != ‘*’)
{
if ((keypad >= 0) && (keypad <= 9))
{
a2 = keypad;
}
keypad = readKeypad ();
}

PORTB = 0b00001000;
disp7seg(a2);
_delay_ms(1000);
a = a+a2;

int m=0;
while(m<500)
{
PORTB = 0b00000001;
disp7seg(‘a’);
_delay_ms (1);

PORTB = 0b00000010;
disp7seg (‘=’);
_delay_ms (1);
disp7seg (‘-’);

PORTB = 0b00000100;
disp7seg (a1);
_delay_ms(1);

PORTB = 0b00001000;
disp7seg (a2);
_delay_ms(1);
m+=1;
}

int q=0;
while (q<500)
{
PORTB = 0b00000001;
disp7seg(‘b’);
_delay_ms(1);

PORTB = 0b00000010;
disp7seg(‘=’);
_delay_ms(1);
PORTD = 0xFF;
q++;
}

//input b dari keypad
keypad = readKeypad();
while (keypad != ‘*’)
{
if ((keypad >= 0) && (keypad <= 9))
{
b1 = keypad;
}
keypad = readKeypad ();
}

PORTB = 0b00000100;
disp7seg(b1);
_delay_ms(1000);
b = b1*10;

//input B2 dari keypad
keypad = readKeypad();
while (keypad != ‘*’)
{
if ((keypad >= 0) && (keypad <= 9))
{
b2 = keypad;
}
keypad = readKeypad ();
}

PORTB = 0b00001000;
disp7seg(b2);
_delay_ms(1000);
b = b+b2;

int z=0;
while(z<500)
{
PORTB = 0b00000001;
disp7seg(‘b’);
_delay_ms (1);

PORTB = 0b00000010;
disp7seg (‘=’);
_delay_ms (1);
disp7seg (‘-’);

PORTB = 0b00000100;
disp7seg (b1);
_delay_ms(1);

PORTB = 0b00001000;
disp7seg (b2);
_delay_ms(1);
z+=1;
}

disp7seg (‘-’);
//milih mode operasi
keypad = readKeypad ();
while (keypad != ‘*’)
{
if (keypad == ‘a’)
{
N = a + b;
}
else if (keypad == ‘b’)
{
N = a — b;
}
else if (keypad == ‘c’)
{
N = a * b;
}
keypad = readKeypad ();
}

disp7seg (‘ ‘);
if (N < 0)
{
neg = N;
N = (-1) * N;
}

//membagi N ke 4 seven segmen
dig4 = N/1000;
dig3 = N/100 — ((N/1000)*10);
dig2 = N/10 — ((N/100)*10);
dig1 = N%10;

//menampilkan hasil perhitungan pada 4 buah seven segmen
int h=0;
while(h<1000)
{
//menampilkan tanda negatif pada led biru
// if (neg < 0)
///{
//PORTD = (1 << PD2);
//_delay_ms (1);
//}/

//menampilkan digit4 di pin PB0
PORTB = 0b00001000;
disp7seg(dig1);
_delay_ms (1);

//menampilkan digit3 di pin PB1
PORTB = 0b00000100;
disp7seg(dig2);
_delay_ms (1);

//menampilkan digit2 di pin PB2
PORTB = 0b00000010;
disp7seg(dig3);
_delay_ms (1);

//menampilkan digit1 di pin PB3
PORTB = 0b00000001;
disp7seg(dig4);
_delay_ms (1);

h++;
}

mode = true;

}

}

return 0;
}

//pengaturan jenis timer
void timer ()
{ TIMSK1 = 0b00000000;
TCCR1B = 0b00000101;
TCNT1H = 0xC2;
TCNT1L = 0xF7;
TIFR1 = (1<<TOV1);
sei ();
}

//fungsi untuk menapilkan angka di 7seg
void disp7seg (int x)
{
switch (x)
{
//pin PD2 (INT0) digunakan untuk interrupt, sehingga tidak tersambung ke 7seg
default :
PORTD = 0b01111011; //7seg mati
break;

case 0 :
PORTD = 0b10000100;
break;

case 1 :
PORTD = 0b11110101;
break;

case 2 :
PORTD = 0b01001100;
break;

case 3 :
PORTD = 0b01100100;
break;

case 4 :
PORTD = 0b00110101;
break;

case 5 :
PORTD = 0b00100110;
break;

case 6 :
PORTD = 0b00000110;
break;

case 7 :
PORTD = 0b11110100;
break;

case 8 :
PORTD = 0b00000100;
break;

case 9 :
PORTD = 0b00100100;
break;

case ‘-’ :
PORTD = 0b11101111;
break;
case ‘a’ :
PORTD = 0b01000000;
break;

case ‘b’ :
PORTD = 0b00000011;
break;

case ‘=’ :
PORTD = 0b01101111;
break;
}
}

//fungsi untuk membaca keypad
int readKeypad()
{
//variabel untuk menyimpan nilai yang dibaca
int retval;

PORTB &=~ (1<<PB4); //Row 1 Low
if (bit_is_clear(PINC,3)); //buffer
else if (bit_is_clear(PINC,3)) retval=1;
else if (bit_is_clear(PINC,2)) retval=2;
else if (bit_is_clear(PINC,1)) retval=3;
else if (bit_is_clear(PINC,0)) retval=’a’;

PORTB |= (1<<PB4); //Row 1 High
PORTB &=~ (1<<PB5); //Row 2 Low
if (bit_is_clear(PINC,3)); //buffer
else if (bit_is_clear(PINC,3)) retval=4;
else if (bit_is_clear(PINC,2)) retval=5;
else if (bit_is_clear(PINC,1)) retval=6;
else if (bit_is_clear(PINC,0)) retval=’b’;

PORTB |= (1<<PB5); //Row 2 High
PORTC &=~ (1<<PC5); //Row 3 Low
if (bit_is_clear(PINC,3)); //buffer
else if (bit_is_clear(PINC,3)) retval=7;
else if (bit_is_clear(PINC,2)) retval=8;
else if (bit_is_clear(PINC,1)) retval=9;
else if (bit_is_clear(PINC,0)) retval=’c’;

PORTC |= (1<<PC5); //Row 3 High
PORTC &=~ (1<<PC4); //Row 4 Low
if (bit_is_clear(PINC,3)); //buffer
else if (bit_is_clear(PINC,3)) retval=’*’;
else if (bit_is_clear(PINC,2)) retval=0;
else if (bit_is_clear(PINC,1)) retval=’#’;
else if (bit_is_clear(PINC,0)) retval=’d’;
PORTC |= (1<<PC4);

return retval;
}

--

--