#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi LCD I2C: alamat 0x27, 20 kolom, 4 baris
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Delay untuk efek per huruf (dalam milidetik, sesuaikan jika terlalu cepat/lambat)
const int LETTER_DELAY = 50; // 50ms per huruf
const int LINE_DELAY = 2000; // Delay antar baris (2 detik)
// Array lirik spesifik yang diminta (dibagi agar muat di LCD 20x4, dengan \n untuk pindah baris)
String lyrics[] = {
"Come on over in my\ndirection",
"So thankful for that,\nit's such a blessin',\nyeah",
"Turn every situation\ninto Heaven, yeah",
"Oh, you are",
"My sunrise on the\ndarkest day",
"Got me feelin' some\nkind of way",
"Make me wanna savor\nevery moment slowly,\nslowly"
};
int currentLine = 0; // Index baris lirik saat ini
int currentChar = 0; // Index huruf saat ini
bool displayingLine = false; // Flag untuk mode tampil huruf
void setup() {
// Inisialisasi LCD
lcd.init();
lcd.backlight();
// Tampilkan judul awal
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Despacito - JB");
lcd.setCursor(0, 1);
lcd.print("Lyrics Loading...");
delay(2000);
lcd.clear();
startNextLine();
}
void loop() {
if (displayingLine) {
// Tampilkan huruf demi huruf untuk baris saat ini
char nextChar = lyrics[currentLine].charAt(currentChar);
if (nextChar != '\0') { // Jika bukan akhir string
// Hitung posisi cursor berdasarkan panjang yang sudah ditampilkan
int totalPrinted = currentChar;
int row = totalPrinted / 20; // Baris LCD (0-3)
int col = totalPrinted % 20; // Kolom di baris itu
lcd.setCursor(col, row);
lcd.print(nextChar);
currentChar++;
delay(LETTER_DELAY);
} else {
// Selesai tampil baris ini, tunggu sebentar lalu lanjut ke baris berikutnya
displayingLine = false;
delay(LINE_DELAY);
startNextLine();
}
}
}
void startNextLine() {
// Mulai baris lirik baru
lcd.clear();
currentChar = 0;
displayingLine = true;
// Loop ke baris pertama jika sudah selesai semua
if (currentLine >= sizeof(lyrics) / sizeof(lyrics[0]) - 1) {
currentLine = 0; // Restart dari awal
} else {
currentLine++;
}
}