#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi LCD I2C (alamat default 0x27, ukuran 16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Custom karakter hati
byte love[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000
};
// Fungsi untuk menampilkan teks dengan animasi typewriter
void typewriter(String text, int row, int delayTime) {
for (int i = 0; i < text.length(); i++) {
lcd.setCursor((16 - text.length()) / 2 + i, row); // Tengah
lcd.print(text[i]);
delay(delayTime);
}
}
// Fungsi untuk menghapus teks satu per satu (kebalikan typewriter)
void deleteText(String text, int row, int delayTime) {
for (int i = text.length() - 1; i >= 0; i--) {
lcd.setCursor((16 - text.length()) / 2 + i, row); // Tengah
lcd.print(" ");
delay(delayTime);
}
}
void setup() {
lcd.init(); // Inisialisasi LCD
lcd.backlight(); // Aktifkan lampu latar
lcd.clear(); // Bersihkan layar
lcd.createChar(0, love); // Simpan karakter hati di slot 0
// Animasi zig-zag
for (int step = 0; step < 16; step++) {
lcd.clear();
if (step % 2 == 0) {
lcd.setCursor(step, 0);
lcd.write(byte(0)); // Tampilkan simbol hati
} else {
lcd.setCursor(step, 1);
lcd.write(byte(0)); // Tampilkan simbol hati
}
delay(200);
}
// Pola akhir: Semua kolom diisi simbol hati
lcd.clear();
for (int col = 0; col < 16; col++) {
lcd.setCursor(col, 0);
lcd.write(byte(0));
lcd.setCursor(col, 1);
lcd.write(byte(0));
}
delay(500);
// Efek blink (3 kali)
for (int i = 0; i < 3; i++) {
lcd.clear();
delay(200);
for (int col = 0; col < 16; col++) {
lcd.setCursor(col, 0);
lcd.write(byte(0));
lcd.setCursor(col, 1);
lcd.write(byte(0));
}
delay(200);
}
lcd.clear();
}
void loop() {
// Menampilkan teks dengan animasi typewriter
typewriter("Hallo Keii", 0, 200); // Baris atas
typewriter("From Rev", 1, 200); // Baris bawah
delay(2000); // Tunggu beberapa saat setelah selesai animasi
// Menghapus teks dengan animasi kebalikan
deleteText("Hallo Keii", 0, 100); // Baris atas
deleteText("From Rev", 1, 100); // Baris bawah
delay(1000); // Tunggu sebelum memulai ulang animasi
animateLove();
lcd.clear();
}
// Fungsi untuk animasi love dari kiri ke kanan di atas, dan kanan ke kiri di bawah
void animateLove() {
for (int i = 0; i < 16; i++) { // Bergerak dari kiri ke kanan (atas) & kanan ke kiri (bawah)
lcd.clear();
lcd.setCursor(i, 0);
lcd.write(byte(0));
lcd.setCursor(15 - i, 1);
lcd.write(byte(0));
delay(200);
}
delay(500);
for (int i = 0; i < 16; i++) { // Bergerak dari kanan ke kiri (atas) & kiri ke kanan (bawah)
lcd.clear();
lcd.setCursor(15 - i, 0);
lcd.write(byte(0));
lcd.setCursor(i, 1);
lcd.write(byte(0));
delay(200);
}
delay(500);
}