#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include "pitches.h"
#define SPEAKER_PIN 8
// Pin RGB LED
#define RED_PIN 3
#define GREEN_PIN 2
#define BLUE_PIN 1
extern "C"
{
void led_RED(byte);
void led_GREEN(byte);
void led_BLUE(byte);
}
const int numTones = 16; // Jumlah nada
// Tombol pada keypad dan nada yang sesuai
const char keymap[4][4] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
const int tones[] = {
NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4,
NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5,
NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5,
NOTE_A5, NOTE_B5, NOTE_C6, NOTE_D6
};
const char* noteNames[] = {
"C4", "D4", "E4", "F4",
"G4", "A4", "B4", "C5",
"D5", "E5", "F5", "G5",
"A5", "B5", "C6", "D6"
};
// Keypad configuration
const byte ROWS = 4;
const byte COLS = 4;
byte rowPins[ROWS] = {13, 12, 11, 10}; // Pin baris keypad
byte colPins[COLS] = {7, 6, 5, 4}; // Pin kolom keypad
Keypad keypad = Keypad(makeKeymap(keymap), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat default I2C adalah 0x27
int questionTones[4]; // Nada soal
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Guess the note!");
delay(2000);
// Setup speaker dan RGB LED
pinMode(SPEAKER_PIN, OUTPUT);
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
// Intro doremi
playIntro();
// Sesi perkenalan nada
introduceNotes();
}
void loop() {
// Generate dan tampilkan soal
generateQuestion();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Simak nada:");
led_GREEN(1);
led_RED(1);
led_BLUE(1);
delay(500); // RGB warna putih
playQuestion();
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
// Menunggu tebakan
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tebak nadanya!");
bool result = checkAnswer();
if (result) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Benar!");
led_GREEN(1); // Hijau untuk benar
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Salah!");
led_RED(1); // Merah untuk salah
}
delay(3000); // Tunggu sebelum mulai ulang
led_GREEN(0);
led_RED(0);
led_BLUE(0); // Matikan LED
delay(50);
}
void playIntro() {
// Mainkan nada satu per satu secara manual
led_RED(1);
tone(SPEAKER_PIN, NOTE_D6, 150); // Mainkan nada C6 selama 300 ms
delay(300); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_GREEN(1);
tone(SPEAKER_PIN, NOTE_E6, 150); // Mainkan nada D6 selama 300 ms
delay(300); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_GREEN(1);
led_BLUE(1);
tone(SPEAKER_PIN, NOTE_G6, 150); // Mainkan nada E6 selama 300 ms
delay(300); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_BLUE(1);
tone(SPEAKER_PIN, NOTE_B6, 2250); // Mainkan nada F6 selama 300 ms
delay(650); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_GREEN(1);
led_BLUE(1);
tone(SPEAKER_PIN, NOTE_A6, 10); // Mainkan nada F6 selama 300 ms
delay(100); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_RED(1);
led_BLUE(1);
tone(SPEAKER_PIN, NOTE_G6, 10); // Mainkan nada F6 selama 300 ms
delay(750); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
//2
led_GREEN(1);
tone(SPEAKER_PIN, NOTE_D6, 150); // Mainkan nada C6 selama 300 ms
delay(300); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_BLUE(1);
tone(SPEAKER_PIN, NOTE_E6, 150); // Mainkan nada D6 selama 300 ms
delay(300); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_GREEN(1);
tone(SPEAKER_PIN, NOTE_G6, 150); // Mainkan nada E6 selama 300 ms
delay(300); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_RED(1);
tone(SPEAKER_PIN, NOTE_B6, 2000); // Mainkan nada F6 selama 300 ms
delay(650); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_GREEN(1);
led_BLUE(1);
tone(SPEAKER_PIN, NOTE_A6, 10); // Mainkan nada F6 selama 300 ms
delay(100); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_RED(1);
tone(SPEAKER_PIN, NOTE_G6, 10); // Mainkan nada F6 selama 300 ms
delay(100); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_BLUE(1);
tone(SPEAKER_PIN, NOTE_E6, 10); // Mainkan nada F6 selama 300 ms
delay(100); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_RED(1);
tone(SPEAKER_PIN, NOTE_G6, 10); // Mainkan nada F6 selama 300 ms
delay(600); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
// 3
led_RED(1);
led_BLUE(1);
tone(SPEAKER_PIN, NOTE_D6, 150); // Mainkan nada C6 selama 300 ms
delay(300); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_GREEN(1);
tone(SPEAKER_PIN, NOTE_E6, 150); // Mainkan nada D6 selama 300 ms
delay(300); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_RED(1);
tone(SPEAKER_PIN, NOTE_G6, 150); // Mainkan nada E6 selama 300 ms
delay(300); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_BLUE(1);
tone(SPEAKER_PIN, NOTE_B6, 2000); // Mainkan nada F6 selama 300 ms
delay(600); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_RED(1);
tone(SPEAKER_PIN, NOTE_A6, 10); // Mainkan nada F6 selama 300 ms
delay(100); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_RED(1);
led_BLUE(1);
tone(SPEAKER_PIN, NOTE_G6, 10); // Mainkan nada F6 selama 300 ms
delay(600); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
// 4
led_GREEN(1);
tone(SPEAKER_PIN, NOTE_C7, 500); // Mainkan nada C6 selama 300 ms
delay(550); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_RED(1);
led_GREEN(1);
tone(SPEAKER_PIN, NOTE_C7, 500); // Mainkan nada D6 selama 300 ms
delay(550); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_BLUE(1);
tone(SPEAKER_PIN, NOTE_C7, 500); // Mainkan nada E6 selama 300 ms
delay(350); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_RED(1);
tone(SPEAKER_PIN, NOTE_D7, 500); // Mainkan nada F6 selama 300 ms
delay(300); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_RED(1);
led_BLUE(1);
tone(SPEAKER_PIN, NOTE_B6, 2750); // Mainkan nada F6 selama 300 ms
delay(500); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
led_BLUE(1);
led_GREEN(1);
tone(SPEAKER_PIN, NOTE_G6, 7000); // Mainkan nada F6 selama 300 ms
delay(800); // Tunggu 400 ms
led_GREEN(0);
led_RED(0);
led_BLUE(0);
delay(25);
noTone(SPEAKER_PIN); // Hentikan nada
}
// Fungsi untuk memperkenalkan nada
void introduceNotes() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ikuti nada:");
for (int i = 0; i < numTones; i++) {
lcd.setCursor(0, 1);
lcd.print(noteNames[i]); // Tampilkan nama nada
// Tunggu input dari user
bool correctInput = false;
while (!correctInput) {
char key = keypad.getKey();
if (key && key == keymap[i / COLS][i % COLS]) { // Jika tombol sesuai
tone(SPEAKER_PIN, tones[i], 500); // Mainkan nada
delay(600);
correctInput = true;
}
}
}
noTone(SPEAKER_PIN);
}
// Fungsi untuk mengacak soal
void generateQuestion() {
for (int i = 0; i < 4; i++) {
questionTones[i] = tones[random(numTones)];
}
}
// Fungsi untuk memainkan nada soal
void playQuestion() {
String answerNotes = ""; // String untuk menyimpan jawaban dalam bentuk note
for (int i = 0; i < 4; i++) {
tone(SPEAKER_PIN, questionTones[i], 500);
delay(600);
noTone(SPEAKER_PIN);
// Cari nama not yang sesuai dengan nada
for (int j = 0; j < numTones; j++) {
if (questionTones[i] == tones[j]) {
if (i > 0) answerNotes += "-"; // Tambahkan separator jika bukan nada pertama
answerNotes += noteNames[j];
break;
}
}
}
// Simpan dan tampilkan jawaban di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Jawaban:");
lcd.setCursor(0, 1);
lcd.print(answerNotes); // Tampilkan jawaban
delay(3000); // Tunggu agar pemain bisa melihat jawaban
}
// Fungsi untuk memeriksa jawaban
bool checkAnswer() {
for (int i = 0; i < 4; i++) {
int pitch = 0;
while (pitch == 0) {
char key = keypad.getKey();
if (key) {
for (int j = 0; j < numTones; j++) {
if (key == keymap[j / COLS][j % COLS]) {
pitch = tones[j];
tone(SPEAKER_PIN, pitch, 500);
delay(600);
break;
}
}
}
}
if (pitch != questionTones[i]) {
return false; // Jika nada berbeda
}
}
return true; // Semua nada cocok
}