#include <Wire.h> // Library untuk komunikasi I2C
#include <LiquidCrystal_I2C.h> // Library LCD I2C
#include <Keypad.h> // Library keypad
LiquidCrystal_I2C lcd(0x27, 20, 4); // Inisialisasi LCD dengan alamat 0x27 dan ukuran 20x4
const int buzzerPin = 10; // Pin output buzzer
// Konfigurasi keypad
const byte ROW_NUM = 4; // Jumlah baris keypad
const byte COLUMN_NUM = 4; // Jumlah kolom keypad
// Matriks karakter untuk keypad
char keys[ROW_NUM][COLUMN_NUM] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Definisi nada frekuensi musik
const uint8_t pin = 10;
// Notasi nada dengan frekuensi dalam Hertz
#define C3 130.81
#define Db3 138.59
#define D3 146.83
#define Eb3 155.56
#define E3 164.81
#define F3 174.61
#define Gb3 185.00
#define G3 196.00
#define Ab3 207.65
#define LA3 220.00
#define Bb3 233.08
#define B3 246.94
#define C4 261.63
#define Db4 277.18
#define D4 293.66
#define Eb4 311.13
#define E4 329.63
#define F4 349.23
#define Gb4 369.99
#define G4 392.00
#define Ab4 415.30
#define LA4 440.00
#define Bb4 466.16
#define B4 493.88
#define C5 523.25
#define Db5 554.37
#define D5 587.33
#define Eb5 622.25
#define E5 659.26
#define F5 698.46
#define Gb5 739.99
#define G5 783.99
#define Ab5 830.61
#define LA5 880.00
#define Bb5 932.33
#define B5 987.77
// Durasi nada berdasarkan tempo
#define BPM 120 // Beats per Minute
#define Q 60000/BPM // Quarter note (1/4)
#define H 2*Q // Half note (2/4)
#define E Q/2 // Eighth note (1/8)
#define S Q/4 // Sixteenth note (1/16)
#define W 4*Q // Whole note (4/4)
// Konfigurasi pin untuk baris dan kolom keypad
byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; // Pin baris keypad
byte pin_column[COLUMN_NUM] = {5, 4, 3, 2}; // Pin kolom keypad
Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM);
void setup() {
lcd.begin(20, 4); // Inisialisasi LCD ukuran 20x4
lcd.backlight(); // Nyalakan backlight LCD
pinMode(buzzerPin, OUTPUT); // Set buzzerPin sebagai output
}
void loop() {
// Tampilkan menu utama
lcd.setCursor(0, 0); lcd.print("1. Custom Play");
lcd.setCursor(0, 1); lcd.print("2. Music Select");
lcd.setCursor(0, 2); lcd.print("3. Volume Setting");
lcd.setCursor(0, 3); lcd.print(" ");
char key = keypad.getKey(); // Baca tombol yang ditekan
if (key) {
handleKeyPress(key); // Panggil fungsi sesuai tombol
}
}
// Fungsi untuk menangani input tombol menu utama
void handleKeyPress(char key) {
switch (key) {
case '1': customPlay(); break;
case '2': lcd.clear(); musicSelect(); break;
case '3': volumeSetting(); break;
default: break;
}
}
// Fungsi untuk memainkan nada sesuai tombol 1–9
void customPlay() {
lcd.clear();
lcd.print("Custom Play");
lcd.setCursor(0, 1);
lcd.print("1-9: Notes, #:Exit");
while (true) {
char key = keypad.getKey(); // Baca tombol
if (key == '#') {
lcd.clear();
return; // Keluar dari mode
}
float freq = 0; // Frekuensi default
// Set frekuensi berdasarkan tombol ditekan
switch (key) {
case '1': freq = C4; break;
case '2': freq = D4; break;
case '3': freq = E4; break;
case '4': freq = F4; break;
case '5': freq = G4; break;
case '6': freq = LA4; break;
case '7': freq = B4; break;
case '8': freq = C5; break;
case '9': freq = Bb4; break;
}
if (freq > 0) {
tone(buzzerPin, freq, 200); // Mainkan nada selama 200ms
delay(220); // Tunggu sejenak
}
}
}
// Fungsi menu untuk memilih lagu
void musicSelect() {
lcd.clear();
lcd.setCursor(0, 0); lcd.print("Music Select");
lcd.setCursor(0, 1); lcd.print("1. Airtel");
lcd.setCursor(0, 2); lcd.print("2. Gundul Pacul");
lcd.setCursor(0, 3); lcd.print("3. Happy Birthday");
char key;
do {
key = keypad.getKey();
if (key == '1') {
airtel_song();
lcd.clear();
return;
} else if (key == '2') {
gungul_gungul_pacul();
lcd.clear();
return;
} else if (key == '3') {
happy_birthday();
lcd.clear();
return;
}
} while (key != '#');
}
// Fungsi pengaturan volume (simulasi tampilan)
void volumeSetting() {
lcd.clear();
lcd.print("Volume Setting");
lcd.setCursor(0, 1);
lcd.print("Use A/B keys");
int volume = 5; // Level volume awal
displayVolume(volume); // Tampilkan level
while (true) {
char key = keypad.getKey();
if (key == '#') {
lcd.clear();
return; // Keluar mode
}
if (key == 'A' && volume < 10) {
volume++;
displayVolume(volume);
} else if (key == 'B' && volume > 0) {
volume--;
displayVolume(volume);
}
}
}
// Menampilkan level volume ke LCD
void displayVolume(int volume) {
lcd.setCursor(0, 2);
lcd.print("Volume: ");
lcd.print(volume);
lcd.print(" "); // Spasi untuk menimpa sisa karakter lama
}
// Fungsi pemutar lagu Airtel
void airtel_song() {
// Mainkan nada per baris lagu (lihat komentar baris demi baris di versi sebelumnya)
// Line1
tone(pin,LA4,Q);delay(1+Q);
tone(pin,LA4,E);delay(1+E);
tone(pin,LA4,E);delay(1+E);
tone(pin,LA4,Q);delay(1+Q);
tone(pin,E5,E);delay(1+E);
delay(1+E);
tone(pin,B4,E);delay(1+E);
tone(pin,C5,E);delay(1+E);
tone(pin,B4,E);delay(1+E);
tone(pin,LA4,E);delay(1+E);
tone(pin,G4,Q);delay(1+Q);
tone(pin,B4,Q);delay(1+Q);
// Line2
tone(pin,LA4,E);delay(1+E);
tone(pin,B4,E);delay(1+E);
tone(pin,LA4,E);delay(1+E);
tone(pin,G4,E);delay(1+E);
tone(pin,LA4,E);delay(1+E);
tone(pin,B4,E);delay(1+E);
tone(pin,C5,E);delay(1+E);delay(1+E);
tone(pin,B4,H);delay(1+H);
tone(pin,LA4,E);delay(1+E);
tone(pin,G4,E);delay(1+E);
tone(pin,E4,H);delay(1+H);
//Line3
tone(pin,LA5,Q);delay(1+Q);
tone(pin,E5,Q);delay(1+Q);
tone(pin,G5,Q);delay(1+Q);
tone(pin,E5,E);delay(1+E);
delay(1+E);
tone(pin,E5,Q);delay(1+Q);
tone(pin,D5,Q);delay(1+Q);
tone(pin,C5,Q);delay(1+Q);
tone(pin,LA4,Q);delay(1+Q);
//Line4
tone(pin,C5,Q);delay(1+Q);
tone(pin,D5,Q);delay(1+Q);
tone(pin,E5,Q);delay(1+Q);
tone(pin,F5,E);delay(1+E);
delay(1+E);
tone(pin,D5,W);delay(1+W);
tone(pin,C5,E);delay(1+E);
tone(pin,B4,E);delay(1+E);
tone(pin,LA4,E);delay(1+E);
}
// Fungsi lagu Gundul Gundul Pacul
void gungul_gungul_pacul() {
// Mainkan lagu tradisional baris demi baris
lcd.clear();
lcd.print(" gundul pacul");
delay(500);
// Baris 1: Gundul gundul pacul cul (1 3 1 3 4 5 5)
tone(pin, C4, E); delay(E + 1); // 1
tone(pin, E4, E); delay(E + 1); // 3
tone(pin, C4, E); delay(E + 1); // 1
tone(pin, E4, E); delay(E + 1); // 3
tone(pin, F4, Q); delay(Q + 1); // 4
tone(pin, G4, E); delay(E + 1); // 5
delay(1+S);
tone(pin, G4, E); delay(E + 1); // 5
delay(1+E);
// Baris 2: Gembelengan (7 1' 7 1' 7 5)
tone(pin, B4, E); delay(E + 10); // 7
tone(pin, C5, E); delay(E + 10); // 1'
tone(pin, B4, E); delay(E + 10); // 7
tone(pin, C5, E); delay(E + 10); // 1'
tone(pin, B4, E); delay(E + 10); // 7
tone(pin, G4, Q); delay(Q + 10); // 5
delay(1+E);
// Baris 3: Nyunggi nyunggi wakul kul (1 3 1 3 4 5 5)
tone(pin, C4, E); delay(E + 10); // 1
tone(pin, E4, E); delay(E + 10); // 3
tone(pin, C4, E); delay(E + 10); // 1
tone(pin, E4, E); delay(E + 10); // 3
tone(pin, F4, Q); delay(Q + 10); // 4
tone(pin, G4, E); delay(E + 10); // 5
delay(1+S);
tone(pin, G4, E); delay(E + 10); // 5
delay(1+E);
// Baris 4: Gembelengan (7 1' 7 1' 7 5)
tone(pin, B4, E); delay(E + 10); // 7
tone(pin, C5, E); delay(E + 10); // 1'
tone(pin, B4, E); delay(E + 10); // 7
tone(pin, C5, E); delay(E + 10); // 1'
tone(pin, B4, E); delay(E + 10); // 7
tone(pin, G4, Q); delay(Q + 10); // 5
delay(1+E);
// Baris 5–6: Wakul ngglimpang segane dadi sak latar (diulang 2x)
int melody[] = {
C4, E4, G4, F4, // Wakul ngglimpang
F4, G4, F4, E4, // segane dadi
C4, F4, E4, C4 // sak latar
};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 4; j++) {
tone(pin, melody[j], Q);
delay(Q + 10);
}
delay(1+E);
for (int j = 4; j < 12; j++) {
tone(pin, melody[j], Q);
delay(Q + 10);
}
}
lcd.clear();
}
// Fungsi lagu Happy Birthday
void happy_birthday() {
// Mainkan lagu ulang tahun baris demi baris
lcd.clear();
lcd.print("Happy Birthday");
delay(500);
// Baris 1: 5 5 6 5 1' 7 (Happy birthday to you)
tone(pin, G4, Q); delay(Q + 10);
delay(1+S);
tone(pin, G4, Q); delay(Q + 10);
tone(pin, LA4, H); delay(H + 10); // Nada ke-3 lebih panjang
tone(pin, G4, H); delay(H + 10);
tone(pin, C5, H); delay(H + 10);
tone(pin, B4, W); delay(W + 10);
// Baris 2: 5 5 6 5 2' 1' (Happy birthday to you)
tone(pin, G4, Q); delay(Q + 10);
delay(1+S);
tone(pin, G4, Q); delay(Q + 10);
tone(pin, LA4, H); delay(H + 10);
tone(pin, G4, H); delay(H + 10);
tone(pin, D5, H); delay(H + 10);
tone(pin, C5, W); delay(W + 10);
// Baris 3: 5 5 3' 1' 1' 1' 7 6 (Happy birthday dear [nama])
tone(pin, G4, Q); delay(Q + 10);
delay(1+S);
tone(pin, G4, Q); delay(Q + 10);
tone(pin, E5, H); delay(H + 10);
tone(pin, C5, H); delay(H + 10);
delay(1+S);
tone(pin, C5, H); delay(Q + 10);
delay(1+S);
tone(pin, C5, Q); delay(Q + 10);
tone(pin, B4, Q); delay(Q + 10);
tone(pin, LA4, W); delay(W + 10);
// Baris 4: 4 4 3' 1' 2' 1' (Happy birthday to you)
tone(pin, F5, Q); delay(Q + 10);
delay(1+S);
tone(pin, F5, Q); delay(Q + 10);
tone(pin, E5, H); delay(H + 10);
tone(pin, C5, H); delay(H + 10);
tone(pin, D5, H); delay(H + 10);
tone(pin, C5, W); delay(W + 10);
lcd.clear();
}