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 :)





Gan resistornya yang berapa ohm?
ReplyDelete