ARDUINO CALCULATOR
KELOMPOK
Nama Mahasiswa
: Annisa Rahmadayanti (14441003)
Muammar Hafidz
(14441010)
: Instrumentasi dan Elektronika
: Teknik Instrumentasi Kilang
: II (dua)
Jurusan
Program Studi
Diploma
KEMENTERIAN ENERGI DAN SUMBER DAYA MINERAL
BADAN PENDIDIKAN DAN PELATIHAN ENERGI DAN SUMBER DAYA MINERAL
SEKOLAH TINGGI ENERGI DAN SUMBER DAYA MINERAL Akamigas
STEM Akamigas
Cepu,
Mei 2016
ARDUINO CALCULATOR
Praktikum Ini Telah Diterima dan Disahkan Sebagai Salah
Satu Syarat kelulusan dalam mata kuliah Microprosesor
OLEH
ANNISA RAHMADAYANTI
MUAMMAR HAFIDZ
NIM 14441003
NIM 14441010
Disetujui Di Cepu
Pada Tanggal Mei 2016
Disahkan Oleh
Pembimbing
(Agus Heriyanto, S.T., M.T.)
NIP. 195508271978091001
ABSTRAK
Dalam praktikum ini dibuat suatu alat untuk melakukan perhitungan
(kalkulasi) matematika, yaitu kalkulator. Kerja sistem ini adalah melakukan
perhitungan fungsi matematika seperti penjumlahan, pengurangan, perkalian,
pembagian, trigonometri, dan kuadrat. Komponen utama dari alat ini adalah LCD
8x2, mikrokontroler ATMEGA 328 dan keypad rubber 4x4.
Hasil praktikum menunjukkan bahwa perhitungan atau kalkulasi
penjumlahan, pengurangan, perkalian, pembagian, trigonometri, dan kuadrat
adalah benar dan cukup efektif digunakan sebagai kalkulator sehari-hari karena
penggunaannya tidak rumit dan mudah dibawa.
Kata
Kunci
Arduino Calculator,
mikrokontroler ATMega 328
1i
LCD 8x2, keypad rubber 4x4,
KATA PENGANTAR
Assalamualaikum Wr. Wb.
Puji syukur kami panjatkan ke Hadirat Allah S.W.T atas berkat dan
bimbingan-Nya sehingga praktikum ini dapat kami selesaikan.
Tugas ini merupakan salah satu syarat bagi setiap mahasiswa Jurusan
Teknik Instrumentasi Kilang dan Elektronika 2 STEM Akamigas dalam
melengkapi syarat-syarat praktikum mikrokontroller semester empat dengan
judul :
ARDUINO CALCULATOR
Kami sangat menyadari bahwa terwujudnya praktikum ini tak lepas dari
bantuan dan dorongan dari berbagai pihak. Pada kesempatan ini kami
menghaturkan terima kasih yang sebesar-besarnya kepada:
1. Allah SWT, atas rahmat dan karunia-Nya kami dapat menyelesaikan
project ini.
2. Bapak Agus Heriyanto, S.T., M.T., yang telah membimbing kami
dalam pembuatan project ini.
3. Teman-teman INS-II, yang telah membantu memberikan inspirasi
dan solusi serta pemecahan masalah/kendala yang kami hadapi
dalam pembuatan project ini.
Cepu, Mei 2016
Penyusun
DAFTAR ISI
KATA PENGANTAR......................................................................................i
ABSTRAK.....................................................................................................ii
DAFTAR ISI.................................................................................................iii
DAFTAR GAMBAR.....................................................................................iv
ARDUINO CALCULATOR........................................................................1
A. TUJUAN PRAKTIKUM..............................................................1
B. DASAR TEORI............................................................................1
C. ALAT DAN BAHAN...................................................................3
D. LANGKAH PERCOBAAN.........................................................4
E. HASIL PENGAMATAN..............................................................8
F. SIMPULAN..................................................................................9
DAFTAR PUSTAKA..................................................................................10
LAMPIRAN
iii
DAFTAR GAMBAR
Gambar 1. Arduino UNO Pada Rangkaian Kontrol
Gambar 2. Rangkaian Elektronika ARDUINO CALCULATOR
Gambar 3. LCD Display 8x2
Gambar 4. Keypad Rubber Matriks 4x4
Gambar 5. Rangkaian Power Supply pada ARDUINO CALCULATOR
Gambar 6. Rangka/Body ARDUINO CALCULATOR
Gambar 7. Diagram Alir (Flowchart) Project ARDUINO CALCULATOR
Gambar 8. ARDUINO CALCULATOR
iv
ARDUINO CALCULATOR
A. Tujuan Praktikum
Setelah mengikuti praktikum alarm dan acknowledge sistem pada level
control, peserta pelatihan mampu :
1. Mengetahui prinsip kerja alarm dan acknowledge sistem pada level
control dengan Mikrokontroller Arduino Uno.
2. Melakukan instalasi pemasangan alarm dan acknowledge sistem pada
level control.
B. Landasan Teori
Mikrokontroler (ATMega 328 Arduino Uno)
Dalam
pembuatan
ATMega 328 Arduino
mikrokontroler
kontrolnya
Uno.
Arduino
digunakan
Uno
mikrokontroler
adalah
papan
berdasarkan ATmega328 (datasheet). Dalam bahasa
Itali "Uno" berarti satu, maka jangan heran jika peluncuran Arduino 1.0
diberi nama Uno.
Gambar 1. Arduino Uno pada Rangkaian Kontrol
Arduino ini berisi semua yang diperlukan untuk mendukung
mikrokontroler, untuk mengaktifkan cukup menghubungkannya ke
komputer dengan kabel USB dengan adaptor AC-DC. Berikut spesifikasi
dari Arduino Uno :
-
Mikrokontroler
: ATmega328
Operating Voltage
: 5V
Input Voltage (disarankan)
: 7-12V
Input Voltage (batas
: 6-20V
Digital I / O
: Pins 14
Analog Input
: Pins 6
DC Current per I / O
: Pin 40 mA
DC Current for 3.3V
: Pin 50 mA
Flash Memory 3 kB (Atmega328)
: digunakan sebanyak 0,5 kB
oleh bootloader
SRAM
: 2 kB (Atmega328)
EEPROM
: 1 kB (Atmega328)
Clock Speed
: 16 MHz
Input Tegangan
Arduino Uno ini dapat beroperasi pada tegangan eksternal dari 6-
20 volt. Jika diberikan tegangan kurang dari 7V, maka arduino ini
2
mungkin akan menjadi tidak stabil. Jika menggunakan lebih dari 12V,
regulator voltage bisa panas dan merusak board. Rentang yang dianjurkan
adalah 7-12 volt.
Memori
ATmega328 ini memiliki memori sebesar 32 KB (0,5 KB dari
memori tersebut digunakan untuk bootloader) dan juga memiliki memori
sebesar 2 KB dari SRAM dan 1 KB dari EEPROM.
Input/Output
Masing-masing dari 14 pin digital pada Uno dapat digunakan
sebagai input atau output, dengan menggunakan fungsi pinMode,
digitalWrite, dan digitalRead. Setiap pin dapat memberikan atau
menerima maksimum 40 mA dan memiliki resistor pull-up internal
(terputus secara default) dari 20-50 kOhms. Pada rangkaian kontrol
ini menggunakan satu buah Arduino Uno.
C. Alat dan Bahan
-
Alat :
Solder
1 buah
Timah
1 roll
Gergaji
1 buah
Bahan :
Rangkaian elektronika ARDUINO CALCULATOR menggunakan bahanbahan berikut.
Mikrokontroler Arduino Uno
1 buah
3
LCD Display 8x2 Yellow Backlight
1 buah
Keypad Rubber Matriks 4x4
1 buah
Kabel Male-to-Male
20 buah
Kabel Female-to-Male
20 buah
Breadboard (atau Protoboard Soldering)
1 buah
Baterai 9 V
1 buah
DC Battery Plug
1 buah
Kabel untuk supply power Arduino Uno
1 buah
Sakelar Toggle
1 buah
Kabel USB untuk connect Arduino dengan PC
1 buah
Sedangkan rangka/body menggunakan bahan berikut.
Kayu Triplek
Lem
Mur Baut
Cat
(ukuran menyesuaikan)
(secukupnya)
(secukupnya)
(warna menyesuaikan)
D. Langkah Percobaan
-
Membuat rangkaian elektronika ARDUINO CALCULATOR seperti
gambar berikut.
Gambar 2. Rangkaian Elektronika ARDUINO CALCULATOR
4
Tabel sambungan LCD dan keypad terlampir.
-
Menyolder konektor kabel dengan LCD dan Keypad agar benarbenar tersambung. Hal ini sangat penting karena kabel yang kendor
atau mudah goyang akan membuat pembacaan LCD dan ouput
keypad terganggu.
Gambar 3. LCD Display 8x2
Gambar 4. Keypad Matriks Rubber 4x4
5
Mengunggah kode program ke Arduino Uno. Kode program
terlampir.
Menyambungkan power supply ke Arduino Uno untuk melakukan
test.
Gambar 5. Rangkaian Power Supply pada ARDUINO CALCULATOR
Membuat rangka untuk ARDUINO CALCULATOR seperti berikut.
Gambar 6. Rangka/Body ARDUINO CALCULATOR
Adapun diagram alir dari percobaan yang telah penulis lakukan adalah
seperti berikut.
START
Perumusan Project
Pencarian Alat dan Bahan
Memenuhi kriteria
percobaan?
Pembuatan Rangkaian Elektronika
Memasukkan Kode Program
Pembuatan Kerangka atau Bodi
Uji Coba
STOP
7
Gambar 7. Diagram Alir (Flowchart) Project ARDUINO CALCULATOR
E. HASIL PERCOBAAN
Pada saat sakelar on, maka supply akan terhubung ke Arduino Uno dan
menyalakan LCD. Pada saat startup, akan muncul pesan LOADING. Untuk
memasukkan angka pertama, tekan tombol
angka pada keypad. Lalu, untuk
memasukkan fungsi matematika, tekan tombol A untuk scroll up dan B untuk
scroll down lalu klik D (enter). Setelah itu, angka kedua dimasukkan dengan
menekan tombol angka pada keypad, lalu klik D (enter) dan hasil akan muncul
pada LCD.
Adapun
fungsi
matematika
yang
terdapat
pada
ARDUINO
CALCULATOR adalah penjumlahan, pengurangan, perkalian, pembagian,
kuadrat, serta trigonometri (sin, cos, tan). ARDUINO CALCULATOR juga dapat
menghitung bilangan positif dan negatif, serta bilangan desimal.
Gambar 8. ARDUINO CALCULATOR
F. SIMPULAN
ARDUINO CALCULATOR dapat melakukan perhitungan matematika
seperti penjumlahan, pengurangan, pembagian, perkalian, kuadrat, serta
trigonometri. Hal terpenting dalam pembuatan ARDUINO CALCULATOR
adalah pengkodean, kesesuaian komponen, pengkabelan yang baik dan rapi, serta
power supply.
DAFTAR PUSTAKA
1. Kale Cloud. Arduino Calculator. [Link]
2. Gabe. Arduino Calculator : Old Version. [Link]
10
LAMPIRAN
Lampiran 1 : Datasheet Keypad Rubber Matriks 4x4
Lampiran 2 : Datasheet LCD Display 8x2 Yellow Backlight
Lampiran 3 : Tabel Penyambungan Keypad dan LCD dengan Arduino Uno
LCD 8X2
KEYPAD 4X4 RUBBER
Keypad Function
Ro
w1
Ro
w2
Ro
w3
Ro
w4
Col
1
Col
2
Col
3
Col
4
Keypad Pin
Arduino Pin
A0
A5
A4
A3
A1
A2
Pin 12
Pin 1
Lampiran 4 : Kode Program ARDUINO CALCULATOR
#include <Keypad.h>
#include <LiquidCrystal.h>
bool scroll1 = 0; //whether to
scroll on line one or not
#include <stdlib.h>
bool scroll2 = 0; //whether to
scroll on line two or not
#include <math.h>
int scroll_index = 0;
/////////////////////////////////////////////
//////////VARIABLES///////////////
////////////////////////////
int de=0;
//VARIABLES TO PARSE
FLOATING ANSWER INTO
WHOLE NUMBER AND
DECIMAL PARTS///
char input[9]; //buffer for input
characters
char outresult[20];
String OutResult;
int decimal_location;
String whole_number;
//INPUT VARIABLES//
float firstnumber = 0; //stores
first number
float secondnumber = 0;
//stores second number
float response = 0; //stores
"answer"
String decimal_number;
bool positive = 1; //indicates
positive number
//VARIABLES USED TO
SCROLL TOP LINE//
int lcdcolumnindexrow1 = 1; //
used to indicate location of
input key
long lasttime =0;
String totalarray = ""; //stores
what was input
int length = 0; //length of what
was input
int length2 = 0; //length after
the first input is added
//FUNCTION VARIABLES//
int function = 9; //stores
currently selected function
const int number_of_functions
= 10;
int mode = 2; // select normal
operation (1) or mystery
function (0)
// Connect keypad COL0,
COL1, COL2, and COL3 to
these Arduino pins.
bool toggle = 1;
byte colPins[COLS] = { 17,
18, 19, 14 };
int level = 0; // stores level for
the game
const int number_of_levels =
10;
/////////////////////////////////////////////
//////////KEYPAD
SETUP//////////////////////////////////
/////
const byte ROWS = 4; // Four
rows
const byte COLS = 4; // Four
columns
// Define the Keymap
// Create the Keypad
Keypad kpd =
Keypad( makeKeymap(keys),
rowPins, colPins, ROWS,
COLS );
/////////////////////////////////////////////
//////////LCD
SETUP//////////////////////////////////
/////
LiquidCrystal lcd(2, 3, 13, 8,
9, 10, 11, 4, 5, 6, 7);
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
void setup()
{
[Link](8,2);
{'7','8','9','C'},
{'*','0','#','D'}
};
[Link]();
[Link](0,0);
[Link]("LOADING");
// Connect keypad ROW0,
ROW1, ROW2 and ROW3 to
these Arduino pins.
byte rowPins[ROWS] = { 1,
12, 16, 15 };
for(int i=0; i<8; i++){
[Link](i,1);
[Link](255);
delay(170);
}
[Link]();
for(int i = 0; i < 8; i++)
{ input[i] = '0'; } // initialize
input as zero
[Link]();
for(int i = 0; i < 8; i++)
{ input[i] = '0'; }
lcdcolumnindexrow1 = 1;
firstnumber = 0;
secondnumber = 0;
totalarray = "";
void loop()
scroll1 = 0;
scroll2 = 0;
length = 0;
length2 = 0;
if(scroll1) // display the input
number and function(s) on the
top line if math has been done
{
de=0;
if(!mode) {function = 10;}
else {function = 9;}
positive = 1;
scrollline(750, 0, length);
}
}
else if(scroll2) // display the
input number and function(s)
on the second line if awaiting a
2nd number
{
scrollline(750, 1, length2);
}
else if(key == 'A'){
//increment function in
calculator mode
function = mod(+
+function,
number_of_functions);
displayfunction(function);
}
char key = [Link](); //
read keypad
if (key != NO_KEY)
{
if(de==1){
else if(key == 'B'){
//decrement function in
calculator mode
function = mod(-function,
number_of_functions);
displayfunction(function);
}else if(key == 'C'){ //clear
[Link]();
if(function==5 ||
function==6 || function==7 ||
function==8){
firstnumber = atof(input);
// convert input character array
to a float
for(int i = 0; i < 8; i++)
{ input[i] = '0'; }
numintototalarray();
printoperation(function);
lcdcolumnindexrow1 = 1;
firstnumber = 0;
secondnumber = 0;
response =
executefunction(function,
firstnumber, 0); // do the math
numintototalarray();
totalarray = "";
scroll1 = 0;
scroll2 = 0;
scroll1 = 1; // display the
input numbers and function on
the top line
length = 0;
length2 = 0;
[Link](0,1);
de=0;
[Link]("
if(!mode) {function = 10;}
else {function = 9;}
");
[Link](0,1);
printresponse(response);
positive = 1;
}
de=1;
else if(key == 'D') //enter
}
{
if(de==1){
}else{
else if(firstnumber == 0) //
this is the first time that enter
has been pressed and we have
a valid function
{
firstnumber = atof(input);
// convert input character array
to a float
numintototalarray();
printoperation(function);
[Link](0,0);
if(function == 3 &&
secondnumber == 0){
[Link](0,1);
[Link]("
"); //clear
first line to make space for the
second number
[Link]("ERROR");
de=1;
[Link](0,1);
[Link]("
}else{
"); //clear
[Link](0,1);
line
length2 = length;
[Link]("
scroll2 = 1; //print what
the user has entered so far on
the second line
for(int i = 0; i < 8; i++)
{ input[i] = '0'; } // reinitialize
the input buffer to make space
for the second number
"); //clear
line
[Link](0,1);
printresponse(response);
//print answer
positive = 1;
de=1;
lcdcolumnindexrow1 = 1;
}
positive = 1;
}else{
secondnumber =
atof(input); // convert input
character array to a float
response =
executefunction(function,
firstnumber,
secondnumber); // do the math
numintototalarray();
totalarray = totalarray +
"= ";
length = length + 2;
scroll1 = 1; // display the
input numbers and function on
the top line
}
}
}
else if(key == '#' &&
positive ==1) //negative
number read and number is
currently positive
{
input[0] = '-';
[Link](0,0);
[Link](input[0]); //print
negative sign
positive = 0; //indicate
number is now negative
[Link](input[7]);
++lcdcolumnindexrow1;
++length;
++length;
else if(key == '#' &&
positive ==0)
}
}
{
positive = 1; //indicate
number is now negative
input[0] = '0';
[Link](0,0);
[Link](' '); //remove
negative sign
--length;
/////////////////////Function
Returns Modulo Even for
Negative
Numbers//////////////////////////
int mod(int a, int b)
{
return (((a % b) + b) % b);
else if(lcdcolumnindexrow1
< 8) //buffer overrun
prevention
{
//read in a number or a
decimal
{
for(int i =1; i < 7; i++)
{input[i] = input[i+1]; } //shift
all the values left
if(key == '*') { input[7]
= '.'; } else { input[7] =
key; } //* is decimal
//////////////////////Function
Displays Math
Functions//////////////////////////////
///////////
void displayfunction(int
_function)
{
[Link](0,1);
switch (_function)
[Link](lcdcolumnindexr
ow1,0); //print on left of LCD
moving right
{
case 0:
[Link]("+
");
case 9:
break;
[Link]("
case 1:
[Link]("-
");
break;
");
break;
}
}
case 2:
[Link]("x
");
//////////////////////Function
Decides Whether Output Has
0, 1, 2, 3, or 4 Decimals AND
Prints Output/////////////////
");
void printresponse(float
_response)
break;
case 3:
[Link]("/
break;
case 4:
[Link]("^
");
break;
case 5:
[Link]("^2
");
else if(_response >
99999999) {[Link]("Too
Big ");}
else if(_response < -9999999)
{[Link]("-Too Big");}
break;
case 6:
[Link]("sin
if(abs(_response) < 0.0001
&& abs(_response) > 0)
{[Link]("TooSmall");}
else
");
break;
case 7:
[Link]("cos
");
break;
for(int i=0; i<19; i++) //Find
the location of the decimal
case 8:
[Link]("tan
break;
dtostrf(_response,7,4,outresult)
; //Convert Float to Character
Array
");
{
if(outresult[i] == '.')
{
decimal_location = i;
}
}
OutResult = outresult;
//Convert Character Array to
String
whole_number =
[Link](0,decimal
_location); //Read up to the
Decimal Location
decimal_number =
[Link](decimal_l
ocation+1,
decimal_location+5); //Read
After the Decimal Location
if(decimal_number[3] =='0'
&& decimal_number[2] =='0'
&& decimal_number[1] =='0'
&& decimal_number[0] =='0')
//print only the whole number
part
{
}
else if(decimal_number[3]
=='0' && decimal_number[2]
=='0') // print two decimal
places
{
OutResult =
whole_number + '.' +
decimal_number[0] +
decimal_number[1];
[Link](OutResult);
}
else if(decimal_number[3]
=='0') // print three decimal
places
{
OutResult =
whole_number + '.' +
decimal_number[0] +
decimal_number[1] +
decimal_number[2];
[Link](OutResult);
[Link](whole_number);
}
}
else if(decimal_number[3]
=='0' && decimal_number[2]
=='0' && decimal_number[1]
=='0') // print one decimal
place
else {[Link](OutResult);}
// print four decimal places
}
}
{
OutResult =
whole_number + '.' +
decimal_number[0];
[Link](OutResult);
//////////////////////FUNCTION
ADDS "+" "-" "/" TO STRING
ARRAY////////////////////////////////
/////////
void printoperation(int
_function)
{
switch (_function)
break;
case 5:
totalarray = totalarray +
"^2= ";
length = length + 4;
case 0:
break;
totalarray = totalarray +
"+";
length = length + 1;
break;
case 1:
totalarray = totalarray +
"-";
length = length + 1;
break;
case 2:
totalarray = totalarray +
"x";
length = length + 1;
break;
case 3:
totalarray = totalarray +
"/";
case 6:
totalarray = "sin(" +
totalarray + ")= ";
length = length + 7;
break;
case 7:
totalarray = "cos(" +
totalarray + ")= ";
length = length + 7;
break;
case 8:
totalarray = "tan(" +
totalarray + ")= ";
length = length + 7;
break;
case 9:
break;
length = length + 1;
break;
case 4:
totalarray = totalarray +
"^";
length = length + 1;
case 10:
totalarray = "f(" +
totalarray + ")= ";
length = length + 5;
break;
if(_secondnumber != 0)
{_output = _firstnumber /
_secondnumber;}
break;
case 4:
//////////////////////FUNCTION
DOES
MATH//////////////////////////////////
///////
float executefunction(int
_function, float _firstnumber,
float _secondnumber)
{
float _output;
_output =
pow(_firstnumber,
_secondnumber);
_output= round(_output);
break;
case 5:
_output =
pow(_firstnumber, 2);
switch (_function)
{
break;
case 6:
case 0:
_output = _firstnumber +
_secondnumber;
break;
case 1:
_output = _firstnumber _secondnumber;
break;
case 2:
_output = _firstnumber *
_secondnumber;
_output =
sin(_firstnumber);
break;
case 7:
_output =
cos(_firstnumber);
break;
case 8:
_output =
tan(_firstnumber);
break;
break;
case 9:
case 3:
break;
}
return _output;
///////////////////Function Scrolls
a Line////////////////////////////////
else // if the input is shorter
than 8 characters, no scroll is
required
{
void scrollline(int delaytime,
int line_number, int _length)
[Link](0,line_number);
{
if(length > 8) // if the input is
too long to fit on the screen,
then scroll
[Link](totalarray);
}
}
{
if(millis() - lasttime >
delaytime) // do this only
every 750 milliseconds.
{
////////////////////////////////////////Fu
nction Scans Input Number
into String Total
Array/////////////////////////
for(int i =0; i<8; i++)
void numintototalarray()
[Link](i,line_number);
if(scroll_index+i <
_length)
{[Link]([Link](scr
oll_index+i));} else
{[Link](" "); }
if(positive == 0) { totalarray
= totalarray + '-'; }
for(int i = 1; i < 8; i++)
{
if(i > (8 lcdcolumnindexrow1))
}
scroll_index =
(scroll_index + 1)%(_length6);
{
totalarray = totalarray +
input[i];
}
lasttime = millis();
}
}
}