#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi LCD dengan alamat I2C 0x27, ukuran 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Struktur data lirik
struct Lyric {
const char* text;
unsigned long startDelay; // delay awal sebelum mulai baris (ms)
unsigned int speed; // kecepatan ketik per karakter (ms)
};
Lyric lyrics[] = {
{"Come on over in my direction", 0, 70},
{"So thankful for that, it's such a blessin', yeah", 2800, 80},
{"Turn every situation into Heaven, yeah", 5600, 90},
{"Oh, you are", 8500, 70},
{"My sunrise on the darkest day", 10200, 80},
{"Got me feelin' some kind of way", 13000, 90},
{"Make me wanna savor every moment slowly, slowly", 16200, 120}
};
int totalLyrics = sizeof(lyrics) / sizeof(lyrics[0]);
unsigned long startTime;
int currentLine = 0;
int charIndex = 0;
bool finished = false;
void setup() {
lcd.init(); // inisialisasi LCD I2C
lcd.backlight(); // nyalakan lampu latar
lcd.clear();
lcd.print("Simulasi Despacito");
delay(2000);
lcd.clear();
startTime = millis();
}
void loop() {
if (finished) return;
unsigned long now = millis();
if (currentLine < totalLyrics) {
Lyric line = lyrics[currentLine];
// Tunggu sampai waktu startDelay tercapai
if (now - startTime >= line.startDelay) {
// Tampilkan per karakter
if (charIndex < strlen(line.text)) {
lcd.print(line.text[charIndex]);
charIndex++;
delay(line.speed);
} else {
// Ganti ke baris berikutnya setelah selesai
delay(1000); // jeda antar baris
lcd.clear();
charIndex = 0;
currentLine++;
}
}
} else {
// Semua lirik selesai
lcd.clear();
lcd.print("Akhir lirik!");
finished = true;
}
}