Last active
August 29, 2015 14:00
-
-
Save indrakp/5fc52763f3611636811c to your computer and use it in GitHub Desktop.
Ardudroid-edited for LED and sound + LCD
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
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 | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment