#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "pitches.h"
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define BUZZER_PIN 8
// Gambar kue dengan lilin hidup (api menyala)
const unsigned char kue_hidup [] PROGMEM = {
0x00,0x00,0x00,0x00,0x18,0x18,0x3C,0x3C,
0x3C,0x3C,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x7E,0x7E,0xFF,0xFF,0xDB,0xDB,
0xDB,0xDB,0xFF,0xFF,0x7E,0x7E,0x00,0x00,
0x00,0x00,0x66,0x66,0xFF,0xFF,0xFF,0xFF,
0xDB,0xDB,0xDB,0xDB,0xFF,0xFF,0x66,0x66,
0x00,0x00,0x3C,0x3C,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xBD,0xBD,0xFF,0xFF,0x3C,0x3C
};
// Gambar kue lilin mati
const unsigned char kue_mati [] PROGMEM = {
0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x00,0x7E,0x7E,0xFF,0xFF,0xDB,0xDB,
0xDB,0xDB,0xFF,0xFF,0x7E,0x7E,0x00,0x00,
0x00,0x00,0x66,0x66,0xFF,0xFF,0xFF,0xFF,
0xDB,0xDB,0xDB,0xDB,0xFF,0xFF,0x66,0x66,
0x00,0x00,0x3C,0x3C,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xBD,0xBD,0xFF,0xFF,0x3C,0x3C
};
// Lagu ulang tahun (nada + durasi)
int melody[] = {
NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_F4, NOTE_E4,
NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_G4, NOTE_F4,
NOTE_C4, NOTE_C4, NOTE_C5, NOTE_A4, NOTE_F4, NOTE_E4, NOTE_D4,
NOTE_AS4, NOTE_AS4, NOTE_A4, NOTE_F4, NOTE_G4, NOTE_F4
};
int durations[] = {
4, 4, 2, 2, 2, 1,
4, 4, 2, 2, 2, 1,
4, 4, 2, 2, 2, 2, 1,
4, 4, 2, 2, 2, 1
};
void playMelody() {
for (int i = 0; i < sizeof(melody) / sizeof(int); i++) {
int duration = 1000 / durations[i];
tone(BUZZER_PIN, melody[i], duration);
delay(duration * 1.3);
noTone(BUZZER_PIN);
}
}
void setup() {
pinMode(BUZZER_PIN, OUTPUT);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
// Tampilkan gambar kue dengan api (hidup)
display.drawBitmap(48, 0, kue_hidup, 32, 32, WHITE);
display.display();
delay(2000); // Tahan gambar kue dengan api
// Tampilkan kue lilin mati
display.clearDisplay();
display.drawBitmap(48, 0, kue_mati, 32, 32, WHITE);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(20, 40);
display.print("Happy Birthday");
display.setCursor(35, 52);
display.print("To Me :)");
display.display();
delay(500); // jeda sebelum lagu
playMelody(); // Mainkan lagu ulang tahun
}
void loop() {
// Kosongin loop, karena semua terjadi di setup
}