#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Set alamat I2C LCD. Alamat 0x27 adalah yang paling umum di Wokwi untuk LCD 16x2.
// Jika tidak berfungsi, coba 0x3F.
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int buttonPin = 13; // Pin untuk push button (misalnya GPIO 13)
int messageIndex = 0; // Indeks pesan yang akan ditampilkan
// Array pesan yang akan ditampilkan
String messages[] = {
"Tekan tombol ya!",
"Pacarnya Lukman?",
"Yang Cantik Itu?",
"Yang Ceria Itu?",
"Yang Cerdas Itu?",
"Yang Jadi Alasan",
"Aku Tetap Tersenyum",
"Apakah Kamu Tau?",
"Aku Sayang Kamu",
"I LOVE YOU",
"Selamat ulang tahun Dek Aull !! semoga sehat selalu dan semoga keberuntungan selalu berpihak kepadamu !!" // Pesan terakhir untuk scrolling
};
const int numMessages = sizeof(messages) / sizeof(messages[0]); // Jumlah total pesan
void setup() {
Serial.begin(115200); // Untuk debugging, bisa dilihat di Serial Monitor Wokwi
lcd.init(); // Inisialisasi LCD
lcd.backlight(); // Nyalakan backlight LCD
// Set pin button sebagai input dengan pull-up internal.
// Ini berarti pin akan HIGH secara default, dan LOW saat tombol ditekan.
pinMode(buttonPin, INPUT_PULLUP);
// Tampilkan pesan pertama saat dinyalakan
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(messages[0]);
}
void loop() {
// Hanya membaca tombol jika belum ditekan dari sebelumnya, untuk menghindari penekanan ganda
static bool buttonPressed = false; // Status tombol sebelumnya
if (digitalRead(buttonPin) == LOW && !buttonPressed) { // Jika tombol ditekan (LOW) dan belum ada penekanan yang dicatat
delay(50); // Debounce sederhana
if (digitalRead(buttonPin) == LOW) { // Pastikan tombol masih ditekan setelah debounce
messageIndex++; // Pindah ke pesan berikutnya
// Jika sudah mencapai akhir pesan, kembali ke pesan pertama
if (messageIndex >= numMessages) {
messageIndex = 0;
}
lcd.clear(); // Hapus tampilan sebelumnya
// Jika ini pesan terakhir, lakukan scrolling
if (messageIndex == numMessages - 1) {
scrollText(messages[messageIndex]);
} else {
// Tampilkan pesan biasa
lcd.setCursor(0, 0);
lcd.print(messages[messageIndex]);
}
buttonPressed = true; // Set status tombol sudah ditekan
}
} else if (digitalRead(buttonPin) == HIGH) {
buttonPressed = false; // Reset status tombol saat dilepas
}
}
// Fungsi untuk menggulir teks di LCD
void scrollText(String text) {
int textLength = text.length();
int lcdCols = 16; // Jumlah kolom LCD Anda
// Jika teks lebih pendek dari lebar LCD, tampilkan saja di tengah
if (textLength <= lcdCols) {
lcd.setCursor((lcdCols - textLength) / 2, 0);
lcd.print(text);
delay(2000); // Tahan sebentar di tengah
return;
}
// Gulir teks dari kanan ke kiri
for (int i = 0; i <= textLength - lcdCols; i++) {
lcd.setCursor(0, 0);
lcd.print(text.substring(i, i + lcdCols));
delay(300); // Kecepatan gulir, sesuaikan
}
// Tahan sebentar di akhir setelah gulir selesai
delay(1000);
}