#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// LCD 20x4 alamat default 0x27
LiquidCrystal_I2C lcd(0x27, 20, 4);
struct Lyric {
const char* text; // isi lirik
unsigned long startDelay; // kapan mulai tampil (ms)
unsigned int speed; // kecepatan ketik per karakter (ms)
};
Lyric lyrics[] = {
{"janganlah kau tinggalkan diri ku", 300, 100},
{"tak kan mampu menghadapi semua", 4500, 100},
{"hanya bersamamu ku akan bisa", 9300, 110},
{"kau adalah darah ku", 14100, 100},
{"kau adalah jantungku", 18800, 100},
{"kau adalah hidupku lengkapi diriku", 23000, 100},
{"oh sayangku kau begitu", 28000, 100},
{"sempurnaaaaaaaaaaaaa", 34500, 100}
};
int totalLyrics = sizeof(lyrics) / sizeof(lyrics[0]);
unsigned long startTime;
int currentLine = 0;
int charIndex = 0;
bool finished = false;
void setup() {
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Simulasi Lirik");
delay(2000);
lcd.clear();
startTime = millis();
}
void loop() {
if (finished) return;
unsigned long now = millis();
if (currentLine < totalLyrics) {
Lyric line = lyrics[currentLine];
// Tunggu sampai waktunya tampil
if (now - startTime >= line.startDelay) {
// Efek ketik per karakter
if (charIndex < strlen(line.text)) {
lcd.print(line.text[charIndex]);
charIndex++;
delay(line.speed);
} else {
// Setelah selesai 1 baris, lanjut ke baris berikutnya
delay(1000);
lcd.clear();
charIndex = 0;
currentLine++;
}
}
} else {
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Akhir Lirik!");
finished = true;
}
}