#include "pitches.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
int SPEAKER = 11;
int SWITCH_PIN = 2; // Pin untuk switch
bool isPlaying = true; // Variabel untuk mengetahui apakah melodi sedang dimainkan atau tidak
#define NUM_OF_NOTES 28
int NOTE_SEQ[NUM_OF_NOTES] = {
NOTE_C5, NOTE_C5, NOTE_D5, NOTE_C5, NOTE_F5, NOTE_E5,
NOTE_C5, NOTE_C5, NOTE_D5, NOTE_C5, NOTE_G5, NOTE_F5,
NOTE_C5, NOTE_C5, NOTE_C6, NOTE_A5, NOTE_F5, NOTE_E5, NOTE_D5,
NOTE_AS5, NOTE_AS5, NOTE_A5, NOTE_F5, NOTE_G5, NOTE_F5
};
int NOTE_LEN[NUM_OF_NOTES] = {
4, 4, 8, 8, 8, 16, 4,
4, 8, 8, 8, 16, 4, 4,
8, 8, 8, 8, 12, 6, 8, 12,
12, 18, 20, 8, 8, 8
};
int TEMPO = 65;
const char* BIRTHDAY_MESSAGES[] = {
"Selamat ulang tahun!",
"Semoga panjang umur",
"Sehat selalu",
"Sukses selalu",
"Bahagia selalu",
"Diberkati selalu",
"Doa terbaik untukmu",
"<3"
};
unsigned long lastMessageChangeTime = 0;
const unsigned long messageChangeInterval = 2000; // 2 detik
void playNote(int pitch, int duration) {
if (isPlaying) {
tone(SPEAKER, pitch, duration);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Happy Birthday");
lcd.setCursor(0, 1);
lcd.print(randomMessage());
delay(duration);
noTone(SPEAKER);
lcd.clear();
}
}
const char* randomMessage() {
int numMessages = sizeof(BIRTHDAY_MESSAGES) / sizeof(BIRTHDAY_MESSAGES[0]);
int index = millis() % numMessages;
return BIRTHDAY_MESSAGES[index];
}
void updateMessage() {
if (millis() - lastMessageChangeTime >= messageChangeInterval) {
lcd.setCursor(0, 1);
lcd.print(randomMessage());
lastMessageChangeTime = millis();
}
}
void setup() {
pinMode(SWITCH_PIN, INPUT_PULLUP); // Set pin sebagai input dengan pull-up resistor
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Happy Birthday");
lcd.setCursor(0, 1);
lcd.print(randomMessage());
}
void loop() {
if (digitalRead(SWITCH_PIN) == LOW) {
isPlaying = !isPlaying; // Ubah status pemutaran jika tombol ditekan
delay(500); // Debouncing, hindari multiple trigger saat tombol ditekan
}
if (isPlaying) {
for (int i = 0; i < NUM_OF_NOTES; i++) {
playNote(NOTE_SEQ[i], NOTE_LEN[i] * TEMPO);
updateMessage();
}
}
}