#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // Lebar layar OLED
#define SCREEN_HEIGHT 64 // Tinggi layar OLED
#define OLED_RESET -1 // Reset pin tidak digunakan pada display 4-wire SPI
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int state = 0; // variabel untuk melacak keadaan tampilan
unsigned long previousMillis = 0;
const long interval = 2000; // interval waktu untuk beralih ke state berikutnya
// Define the note frequencies for "Happy Birthday"
int melody[] = {
261, 261, 293, 261, 349, 329,
261, 261, 293, 261, 392, 349,
261, 261, 523, 440, 349, 329, 293,
466, 466, 440, 349, 392, 349
};
int noteDurations[] = {
4, 4, 4, 4, 4, 2,
4, 4, 4, 4, 4, 2,
4, 4, 4, 4, 4, 4, 2,
4, 4, 4, 4, 4, 2
};
int melodyIndex = 0;
unsigned long previousNoteMillis = 0;
int noteDuration = 0;
void setup() {
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
// Set font teks
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.clearDisplay();
}
void loop() {
unsigned long currentMillis = millis();
// Menangani state layar OLED
if (currentMillis - previousMillis >= interval) {
display.clearDisplay();
switch (state) {
case 0:
display.setTextSize(1); // mengembalikan ukuran teks ke nilai default
display.setCursor(0, 25);
display.println("Selamat Ulang Tahun");
display.println("El Zafran As Syakir");
break;
case 1:
display.setTextSize(1); // mengembalikan ukuran teks ke nilai default
display.setCursor(0, 25);
display.println("Semoga Cepet Besar");
display.println("Tambah Ganteng");
break;
case 2:
display.setTextSize(1); // mengembalikan ukuran teks ke nilai default
display.setCursor(0, 25);
display.println("Jadi Anak yang Sholeh");
display.println("kebanggaan orangtua");
break;
case 3:
display.setTextSize(1); // mengembalikan ukuran teks ke nilai default
display.setCursor(35, 25);
display.println("AAMIIN");
break;
case 4:
display.setTextSize(1); // mengembalikan ukuran teks ke nilai default
display.setCursor(25, 25);
display.println("Dari Om Satria");
break;
case 5:
display.setTextSize(1); // mengembalikan ukuran teks ke nilai default
display.setCursor(25, 25);
display.println("HAPPY BIRTHDAY");
break;
}
display.display();
state = (state + 1) % 6; // Beralih ke state berikutnya
previousMillis = currentMillis;
}
// Menangani musik "Happy Birthday"
if (currentMillis - previousNoteMillis >= noteDuration) {
if (melodyIndex < sizeof(melody) / sizeof(melody[0])) {
noteDuration = 1000 / noteDurations[melodyIndex];
tone(8, melody[melodyIndex], noteDuration);
previousNoteMillis = currentMillis;
delay(noteDuration * 1.30); // Menunggu sebelum menghentikan nada
noTone(8);
melodyIndex++;
} else {
melodyIndex = 0; // Mulai ulang melodi setelah selesai
}
}
}