Monthly Archives: March 2014

Kalkulator Arduino!

Kembali lagi bersama seri Arduino, kali ini kami membuat kalkulator sederhana menggunakan keypad.

Ini dia videonya:


Source code:


const int numRows = 4; // number of rows in the keypad
const int numCols = 4; // number of columns
const int debounceTime = 20; // number of milliseconds for switch to be stable

const int keymap[numRows][numCols] = {
{ 1, 2, 3, -2} , // -2: penambahan, -3: pengurangan, -4: perkalian, -5: pembagian, -6: =
{ 4, 5, 6, -3} ,
{ 7, 8, 9, -4} ,
{ 999, 0, -6, -5}
};

const int rowPins[numRows] = { 5,4,3,2 }; // Rows 0 through 3
const int colPins[numCols] = { 9,8,7, 6 }; // Columns 0 through 2

void setup()
{
Serial.begin(9600);

for (int row = 0; row < numRows; row++)
{
pinMode(rowPins[row],INPUT); // Set row pins as input
digitalWrite(rowPins[row],HIGH); // turn on Pull-ups
}
for (int column = 0; column < numCols; column++)
{
pinMode(colPins[column],OUTPUT); // Set column pins as outputs
digitalWrite(colPins[column],HIGH); // Make all columns inactive
}
}

int angka1 = 0;
int angka2 = 0;
char operation;
boolean isOpSet = false;
void loop(){
int key = getKey();
if( key != -1) { // if the character is not 0 then
if(key != -2){
if(key != -3){
if(key != -4){
if(key != -5){
if(key != -6){
if(angka1 == 0){ //check apakah angka pertama sudah di isi belum. jika belum, mengisi angka pertama
angka1 = key;
Serial.print(angka1);
//Serial.print("angka pertama kepencet");
}else{
if(isOpSet == false){
angka1 = concatenate(angka1,key);
Serial.print(key);
}else{
if(angka2 == 0){
angka2 = key;
Serial.print(angka2);
//Serial.println("angka kedua kepencet");
}else if(key != -6){
angka2 = concatenate(angka2,key);
Serial.print(key);
}else{
}
}
}
}else{
Serial.print(" = ");
Serial.println(hitung(angka1, operation, angka2));
angka1 = 0;
angka2=0;
isOpSet = false;
}
}else{
operation = ':';
Serial.print(operation);
isOpSet = true;
}
}else{
operation = '*';
Serial.print(operation);
isOpSet = true;
}
}else{
operation = '-';
Serial.print(operation);
isOpSet = true;
}
}else{
operation = '+';
Serial.print(operation);
isOpSet = true;
}
}
}

int hitung(int a1, char op, int a2){
if(op == '+'){
return a1+a2;
}else if(op == '-'){
return a1-a2;
}else if(op == '*'){
return a1*a2;
}else if(op == ':'){
return a1/a2;
}
}

unsigned concatenate(unsigned x, unsigned y) {
unsigned pow = 10;
while(y >= pow)
pow *= 10;
return x * pow + y;
}

// returns with the key pressed, or 0 if no key is pressed
int getKey(){
int key = -1; // 0 indicates no key pressed
for(int column = 0; column < numCols; column++){
digitalWrite(colPins[column],LOW); // Activate the current column.
for(int row = 0; row < numRows; row++){
if(digitalRead(rowPins[row]) == LOW){
delay(debounceTime); // debounce
while(digitalRead(rowPins[row]) == LOW); // wait for key to be released
key = keymap[row][column]; // Remember which key
}
}

digitalWrite(colPins[column],HIGH); // De-activate the current column.
}
return key; // returns the key pressed or 0 if none
}

Screen Shot 2014-03-26 at 0.10.31

Ini dia foto-fotonya:

Foto1224 Foto1228 Foto1230 Foto1231 Foto1232 Foto1233

UTS: Membuat Termometer + LCD dengan Arduino

Salaam, kembali lagi bersama tugas kuliah Human-Machine Interaction & Interface! Kali ini tugasnya agak berbeda, karena dinilai untuk UTS (Ujian Tengah Semester). Asik juga ya ujiannya ngeblog, tidak ujian tulis seperti kebanyakan ujian di jurusan lain.

Tugas (ujian) kali ini melanjutkan tugas yang lalu (membuat termometer). Namun ternyata nilai suhu yang ditangkap oleh sensor LM350 tidak sesuai dengan aslinya (lebih tinggi/lebih rendah) sehingga harus dilakukan kalibrasi.

Alat & Bahan

Alat dan bahan masih sama seperti posting sebelumnya, yang spesial kali ini adalah penambahan alat baru: LCD (dan kabelnya makin banyak).

arduino

Source Code

Screen Shot 2014-03-18 at 17.45.59

Kode program kali ini mengubah sedikit kode program sebelumnya (termometer). Kode yang diubah adalah bagaimana si Arduino memberikan output suhu (sebelumnya melalui serial monitor) ke layar LCD.

#include  // mengimpor library untuk output LCD

const int numRows = 2; // jumlah baris LCD (16x2)
const int numCols = 16; // jumlah kolom LCD (16x2)
const int inPin = 0; // input pin analog

// inisialisasi pin LCD yang dipasang ke Arduino
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
lcd.begin(numCols, numRows); // inisialisasi LCD
lcd.print("suhu sekarang : "); // output tulisan ke LCD
}
void loop()
{
int value = analogRead(inPin); // membaca input dari sensor suhu
float millivolts = (value / 1024.0) * 5000; // input sensor dalam satuan mV
float celsius = (millivolts / 10) - 0.18; // konversi mV ke C + kalibrasi (10mV/Celcius)
lcd.print(celsius); // tambahkan nilai Celcius ke LCD
lcd.print("C "); // tambahkan "C" ke LCD
lcd.print( (celsius * 9)/ 5 + 32 ); // tambahkan hasil konversi celcius ke fahrenheit
lcd.print("F "); // tambahkan "F" ke LCD
delay(1000); // tunggu 1 detik
// set kursor LCD ke (0,1) agar teks "suhu sekarang: " tidak tertimpa
lcd.setCursor(0, 1);
}

Kalibrasi

Awalnya kami cukup bingung bagaimana cara mengkalibrasi sensor ini karena tidak ada yang memiliki termometer. Akhirnya sambil hujan-hujanan kami berjalan ke LFD (lab fisika dasar). Di sana ada termometer ruangan.

Setelah sampai sana, kami bingung lagi karena termometer ruangannya jadul (kuno), sehingga akurasinya patut dipertanyakan 🙂 Tapi ya sudahlah kami percaya saja.

Perbedaan termometer Arduino kami dengan termometer ruangan itu 0.18˚C. Arduino lebih tinggi 0.18˚C. Karena itu kami mengurangi nilai celcius suhu dari sensor dengan 0.18˚C.