/*
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
}