Postingan kali ini saya akan membahas tugas akhir dari mata
kuliah Interaksi Manusia dengan Komputer dan Antarmuka. Yah, memang tiba-tiba
saja sudah tugas akhir. Semoga ini bukan tulisan terakhir karena ARDUINO
benar-benar asik banget buat di-oprek. Palingan kendalanya adalah di budget buat beli alat-alat buat ngoprek.
Interfacing
Jadi pada tugas akhir kali ini, proyek dibuat harus
melibatkan interfacing antara ARDUINO
dengan sesuatu. Nah, sesuatunya itu apa? bisa bermacam-macam. Kelompok lain ada
yang menggunakan interfacing antara 2
ARDUINO, memakai komunikasi Radio, GSM Shield, dll. Tetapi dari awal kelompok
sudah menentukan akan membuat interface
antara ARDUINO dan ANDROID sehingga bisa disingkat menjadi ARDUDROID.
ARDUINO - ANDROID
Bagaimana mengkomunikasikan ARDUINO dan ANDROID? Setelah googling akhirnya didapat cara yang
paling efektif adalah menggunakan perangkat Bluetooth. Pada komunikasi ini,
dipasang perangkat Bluetooth di rancangan alat kami dan nantinya smartphone kita tinggal membuat koneksi
ke Bluetooth tadi. Setelah itu dari smartphone
kita bisa mengirimkan perintah berupa
teks yang selanjutnya dikirimkan melalui Bluetooth dan bisa kami proses untuk
menjadi masukan bagi ARDUINO.
Bluetooth Module
HC-05
Perangkat Bluetooth yang kami gunakan adalah Bluetooth
Module HC-05. Perangkat kami beli di Jaya Plaza dengan harga Rp. 135.000,-.
Menurut hasil googling HC-05 ini
merupakan seri yang paling mudah digunakan dan fiturnya sudah cukup mumpuni.
Perangkat Bluetooth ini menggunakan voltase 3,3V dan serial port TX dan RX
untuk berkomunikasi dengan ARDUINO. Jadi, pesan yang diterima oleh perangkat
Bluetooth ini nantinya akan dikirimkan ke ARDUINO secara serial sehingga cara
pembacaannya melalui Serial Monitor untuk menangkap pesan yang diterima oleh
perangkat Bluetooth.
Wake! - Alarm yang
bisa dikontrol oleh banyak orang
Dengan terhubugnya ARDUINO dan ANDROID maka kita bisa
melakukan apa saja hanya melalui smartphone
kita. Karena terlalu luasnya kemampuan ini, kami sempat bingung mau bikin apa.
Akhirnya kami memutuskan akan menggabungkan ilmu tentang LCD, Lampu LED, dan
suara menjadi satu sehingga terciptalah Wake!. Sebuah alarm yang bisa dikontrol
oleh banyak orang.
Sering banget kan mahasiswa bangun telat? Nah, salah satu
sebabnya karena alarm mereka bisa dimatikan sesuka hati mereka. Jadi alarm
Wake! ini tidak punya tombol untuk snooze
mauapun dismiss, jadi alarm ini nggak
bisa dimatiin sesuka hati, sekali lagunya dimainkan maka akan terus berjalan
sampai habis. Selain itu fitur unggulan lainnya adalah alarm ini bisa
dikendalikan oleh banyak orang. Dengan memakai konsep interfacing yang dijelaskan sebelumnya, alarm ini bisa dikendalikan
melalui Bluetooth. Jadi, tinggal bagi-bagi password Bluetooth-nya ke
orang-orang yang rajin bangun pagi buat ngebangunin kita. Ditambah lagi orang
tersebut bisa mengirimkan pesan yang nantinya akan ditampilkan di layar LCD.
Berikut adalah rangkaian dari Wake!
Berikut adalah kode untuk Wake! Sedangkan untuk aplikasi android kami menggunakan Ardudroid.
/* PROJECT: ArduDroid PROGRAMMER: Hazim Bitar (techbitar at gmail dot com) DATE: Oct 31, 2013 FILE: ardudroid.ino LICENSE: Public domain diedit pada tanggal : 24-03-2014 / 28-04-2014 */ #include LiquidCrystal.h; LiquidCrystal lcd(12, 11, 5, 4, 3, 2); #define START_CMD_CHAR '*' #define END_CMD_CHAR '#' #define DIV_CMD_CHAR '|' #define CMD_DIGITALWRITE 10 #define CMD_ANALOGWRITE 11 #define CMD_TEXT 12 #define CMD_READ_ARDUDROID 13 #define MAX_COMMAND 20 // max command number code. used for error checking. #define MIN_COMMAND 10 // minimum command number code. used for error checking. #define IN_STRING_LENGHT 40 #define MAX_ANALOGWRITE 255 #define PIN_HIGH 3 #define PIN_LOW 2 String inText; const int speakerPin = 8; // mengkoneksikan PIN speker pada PIN 8 char noteNames[] = {'C','D','E','F','G','a','b'}; unsigned int frequencies[] = {262,294,330,349,392,440,494}; const byte noteCount = sizeof(noteNames); // nomor ukuran note (7 here) //notes, a space represents a rest char score[] = "CCGGaaGFFEEDDC GGFFEEDGGFFEED CCGGaaGFFEEDDC"; const byte scoreLen = sizeof(score); //jumlah note yang ada pada score boolean isPlay=false; byte beats[scoreLen] = {1,1,1,1,1,1,2, 1,1,1,1,1,1,2,1, 1,1,1,1,1,1,2, 1,1,1,1,1,1,2,1, 1,1,1,1,1,1,2, 1,1,1,1,1,1,2}; byte beat = 180; // bits per menit unsigned int speed = 30000 / beat; // waktu yang digunakan untuk melakukan sekali beats void setup() { Serial.begin(9600); Serial.println("ArduDroid 0.12 Alpha by TechBitar (2013)"); Serial.flush(); lcd.begin(16, 2); lcd.print("Hello"); pinMode(speakerPin, OUTPUT); } void loop() { Serial.flush(); int ard_command = 0; int pin_num = 0; int pin_value = 0; char get_char = ' '; //membaca nilai serial if(isPlay){ loopsong(); isPlay=false; } //Menunggu data masukan if (Serial.available() < 1) return; // if serial empty, return to loop(). // melakukan pemilihan data masukan get_char = Serial.read(); if (get_char != START_CMD_CHAR) return; // if no command start flag, return to loop(). // memilih tipe data masukan ard_command = Serial.parseInt(); // read the command // parse incoming pin# and value pin_num = Serial.parseInt(); // read the pin pin_value = Serial.parseInt(); // read the value // 1) Mendapatkan perintah berupa text if (ard_command == CMD_TEXT){ inText =""; //clears variable for new input while (Serial.available()) { char c = Serial.read(); //Membaca satu byte dari serial delay(5); if (c == END_CMD_CHAR) { // Mengakhiri pembacaan lcd.clear(); //menghapus seluruh tulisan pada LCD lcd.setCursor(0,0); // meletakkan cursor pada koordinat 0,0 lcd.print(inText); // mencetak text masukan break; } else { if (c != DIV_CMD_CHAR) { inText += c; delay(5); } } } } // 2) Membaca masukan data digital if (ard_command == CMD_DIGITALWRITE){ if (pin_value == PIN_LOW) pin_value = LOW; else if (pin_value == PIN_HIGH) pin_value = HIGH; else return; return; // Kembali ke loop utama jika tidak ada masukan data } // 3) Membaca masukan data analog if (ard_command == CMD_ANALOGWRITE) { analogWrite( pin_num, pin_value ); return; } // 4)Mengirim data ke ardudroid if (ard_command == CMD_READ_ARDUDROID) { Serial.print(" Analog 0 = "); Serial.println(analogRead(A0)); // contoh : mengirimkan data pembacaan pin analog 0 return; // kembali ke loop utama } } // 2a) mengubah nilai pin digital void set_digitalwrite(int pin_num, int pin_value) { switch (pin_num) { case 13: pinMode(13, OUTPUT); digitalWrite(13, pin_value); break; case 12: pinMode(12, OUTPUT); digitalWrite(12, pin_value); break; case 11: pinMode(11, OUTPUT); digitalWrite(11, pin_value); break; case 10: pinMode(10, OUTPUT); digitalWrite(10, pin_value); break; case 9: pinMode(9, OUTPUT); digitalWrite(9, pin_value); break; isPlay=false; // untuk mengubah state memainkan lagu case 8: pinMode(8, OUTPUT); digitalWrite(8, pin_value); isPlay=true; break; case 7: pinMode(7, OUTPUT); digitalWrite(7, pin_value); break; case 6: pinMode(6, OUTPUT); digitalWrite(6, pin_value); break; case 5: pinMode(5, OUTPUT); digitalWrite(5, pin_value); break; case 4: pinMode(4, OUTPUT); digitalWrite(4, pin_value); break; case 3: pinMode(3, OUTPUT); digitalWrite(3, pin_value); break; case 2: pinMode(2, OUTPUT); digitalWrite(2, pin_value); break; } } //fungsi untuk memainkan note yang didefinisikan void playNote(char note, int duration) { // mencocokkan nama note dan memainnkannya jika terdefinisi for (int i = 0; i < noteCount; i++) { if (noteNames[i] == note) tone(speakerPin, frequencies[i], duration); } // delay(duration); } //fungsi untuk melakukan perulangan musik yang dimainkan void loopsong(){ for (int i = 0; i < scoreLen; i++) { int duration = beats[i] * speed; // menggunkan perbandingan beats yang telah didefinisikan playNote(score[i], duration); // memainkan note } delay(4000); // waktu yang ditentukan untuk menunggu perulangan }
Berikut adalah dokumentasinya :)