#include <Wire.h>
#include <FMAirHorn_GFX.h>
#include <FMAirHorn_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C // Alamat I2C untuk OLED
#define R1 13 // DO
#define R2 12 // RE
#define R3 14 // MI
#define R4 27 // FA
#define R5 26 // SO
#define R6 25 // LA
#define buzz 17
#define BSTART 15
#define switchUpPin 2
#define switchDownPin 4
#define delayUpPin 18 // Tombol Jeda Naik
#define delayDownPin 19 // Tombol Jeda Turun
int LAGU = 0; // Ganti nama variabel logoMusic menjadi LAGU
int delayTime = 0; // Waktu jeda awal dalam milidetik
int buttonUpState = 0;
int lastButtonUpState = 0;
int buttonDownState = 0;
int lastButtonDownState = 0;
int delayUpState = 0;
int lastDelayUpState = 0;
int delayDownState = 0;
int lastDelayDownState = 0;
bool isPlaying = false; // Menyimpan status apakah lagu sedang dimainkan
bool lastBStartState = HIGH; // Menyimpan status terakhir tombol BSTART
bool currentBStartState; // Menyimpan status terkini tombol BSTART
bool musicPlaying = false; // Status lagu sedang diputar
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup()
{
Serial.begin(115200);
pinMode(R1, OUTPUT);
pinMode(R2, OUTPUT);
pinMode(R3, OUTPUT);
pinMode(R4, OUTPUT);
pinMode(R5, OUTPUT);
pinMode(R6, OUTPUT);
pinMode(BSTART, INPUT_PULLUP);
pinMode(switchUpPin, INPUT_PULLUP);
pinMode(switchDownPin, INPUT_PULLUP);
pinMode(delayUpPin, INPUT_PULLUP);
pinMode(delayDownPin, INPUT_PULLUP);
pinMode(buzz, OUTPUT);
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.display();
delay(500); // Pause for 2 seconds
}
void loop()
{
currentBStartState = digitalRead(BSTART);
// Jika tombol BSTART ditekan dan status tombol berubah
if (currentBStartState == LOW && lastBStartState == HIGH)
{
if (isPlaying)
{
// Hentikan lagu dan reset kondisi
stopMusic();
isPlaying = false;
updateDisplay(); // Kembalikan tampilan setelah musik dihentikan
}
else
{
// Mulai lagu sesuai dengan nilai LAGU
playMusic();
isPlaying = true;
}
delay(100); // Debounce tombol
}
lastBStartState = currentBStartState;
// Tangani tombol naik
buttonUpState = digitalRead(switchUpPin);
if (buttonUpState != lastButtonUpState)
{
if (buttonUpState == HIGH)
{
if(LAGU == 1)
{
LAGU = -1;
}
LAGU++;
Serial.println(LAGU);
delay(100);
updateDisplay();
}
else
{
Serial.println("OFF");
}
delay(50);
}
lastButtonUpState = buttonUpState;
// Tangani tombol turun
buttonDownState = digitalRead(switchDownPin);
if (buttonDownState != lastButtonDownState)
{
if (buttonDownState == HIGH)
{
if (LAGU == 0)
{
LAGU = 2;
}
LAGU--;
Serial.println(LAGU);
delay(100);
updateDisplay();
}
else
{
Serial.println("OFF");
}
delay(50);
}
lastButtonDownState = buttonDownState;
// Tangani tombol jeda naik
delayUpState = digitalRead(delayUpPin);
if (delayUpState != lastDelayUpState)
{
if (delayUpState == HIGH)
{
delayTime += 2; // Tambah 2 ms pada jeda
Serial.print("Jeda Naik: ");
Serial.println(delayTime);
updateDisplay(); // Update tampilan setelah mengubah delayTime
}
lastDelayUpState = delayUpState;
}
// Tangani tombol jeda turun
delayDownState = digitalRead(delayDownPin);
if (delayDownState != lastDelayDownState)
{
if (delayDownState == HIGH)
{
if (delayTime > -10)
{
delayTime -= 2; // Kurangi 2 ms pada jeda
Serial.print("Jeda Turun: ");
Serial.println(delayTime);
updateDisplay(); // Update tampilan setelah mengubah delayTime
}
}
lastDelayDownState = delayDownState;
}
}
void playMusic()
{
// Bersihkan display dan tampilkan tulisan "PLAY"
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(35, 25); // Posisikan teks di tengah
display.print("PLAY");
// Menggambar garis tepi di sekeliling layar
display.drawRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, SSD1306_WHITE);
// Tampilkan perubahan di display
display.display();
musicPlaying = true;
int val1 = LAGU;
switch (val1)
{
case 1: // LAGU 1
break;
case 2: // LAGU 2
break;
case 3: //LAGU3
break;
case 4:
break;
// Tambahkan lagu lainnya jika diperlukan
}
// Setelah lagu selesai, kembalikan tampilan awal
musicPlaying = false;
updateDisplay(); // Mengembalikan tampilan normal setelah lagu selesai
}
void stopMusic()
{
// Hentikan semua nada dan reset kondisi
S0();
noTone(buzz);
}
void updateDisplay()
{
display.clearDisplay();
display.setTextSize(1); // Ukuran teks untuk judul lagu
display.setTextColor(SSD1306_WHITE);
// Mengatur posisi dan menampilkan judul lagu
display.setCursor(5, 28);
display.print(getTitleForCurrentSong());
// Menggambar garis pemisah di tengah
int lineX = 60;
display.drawLine(lineX, 15, lineX, 50, SSD1306_WHITE);
// Mengatur posisi dan menampilkan Delay di sebelah kanan
display.setCursor(lineX + 7, 28); // Tambah sedikit jarak dari garis pemisah
display.print("TEMPO: ");
display.println(delayTime);
// Menambahkan teks di bagian bawah display
display.setTextSize(1); // Ukuran teks untuk bagian bawah
int bottomTextY = SCREEN_HEIGHT - 10;
display.setCursor(8, bottomTextY); // Posisi teks di bagian bawah
display.print("NO SAFETY NO BASURI");
// Menggambar garis di atas tulisan "NO SAFETY NO BASURI"
display.drawLine(0, bottomTextY - 4, SCREEN_WIDTH, bottomTextY - 4, SSD1306_WHITE);
// Menambahkan teks di bagian atas display
display.setTextSize(1); // Ukuran teks untuk bagian atas
display.setCursor(25, 5); // Posisi teks di bagian atas
display.print("OM TELOLET OM");
// Menggambar garis pembatas antara teks atas dan bawah
display.drawLine(0, 15, SCREEN_WIDTH, 15, SSD1306_WHITE);
// Menggambar garis tepi di pinggir display
display.drawRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, SSD1306_WHITE);
display.display();
}
String getTitleForCurrentSong()
{
switch (LAGU)
{
case 1: return "TEST";
case 2: return "MARSHA";
case 3: return "CILALANG";
case 4: return "KATANYA";
// Tambahkan kasus lainnya sesuai dengan LAGU
default: return "KOSONG";
}
}
void N1()
{
if (!digitalRead(R1)) {
tone(buzz, 523);
}
else {
noTone(buzz);
}
digitalWrite(R1, HIGH);
}
void N2()
{
if (!digitalRead(R2)) {
tone(buzz, 587);
}
else {
noTone(buzz);
}
digitalWrite(R2, HIGH);
}
void N3()
{
if (!digitalRead(R3)) {
tone(buzz, 659);
}
else {
noTone(buzz);
}
digitalWrite(R3, HIGH);
}
void N4()
{
if (!digitalRead(R4)) {
tone(buzz, 698);
}
else {
noTone(buzz);
}
digitalWrite(R4, HIGH);
}
void N5()
{
if (!digitalRead(R5)) {
tone(buzz, 784);
}
else {
noTone(buzz);
}
digitalWrite(R5, HIGH);
}
void N6()
{
if (!digitalRead(R6)) {
tone(buzz, 880);
}
else {
noTone(buzz);
}
digitalWrite(R6, HIGH);
}
void S0()
{
digitalWrite(R1, LOW);
digitalWrite(R2, LOW);
digitalWrite(R3, LOW);
digitalWrite(R4, LOW);
digitalWrite(R5, LOW);
digitalWrite(R6, LOW);
noTone(buzz);
}
void S1() { digitalWrite(R1, LOW); noTone(buzz); }
void S2() { digitalWrite(R2, LOW); noTone(buzz); }
void S3() { digitalWrite(R3, LOW); noTone(buzz); }
void S4() { digitalWrite(R4, LOW); noTone(buzz); }
void S5() { digitalWrite(R5, LOW); noTone(buzz); }
void S6() { digitalWrite(R6, LOW); noTone(buzz); }