#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C LCD, ganti jika berbeda
// Deklarasi pin untuk tombol
const int buttonScrollPin = 2; // Tombol untuk menggerakkan teks
const int buttonBlinkPin = 3; // Tombol untuk membuat teks berkedip
// Variabel untuk kontrol
String text = "Selamat Datang!";
int scrollIndex = 0; // Posisi scroll awal
bool isBlinking = false; // Status kedap-kedip
unsigned long lastBlinkTime = 0; // Timer untuk kedip
bool blinkState = true; // Status ON/OFF kedip
const int blinkInterval = 500; // Interval kedip (500ms)
void setup() {
lcd.begin(16, 2); // Inisialisasi LCD
lcd.backlight(); // Menyalakan lampu latar
lcd.clear(); // Membersihkan layar
pinMode(buttonScrollPin, INPUT_PULLUP); // Tombol scroll dengan pull-up internal
pinMode(buttonBlinkPin, INPUT_PULLUP); // Tombol blink dengan pull-up internal
lcd.setCursor(0, 0); // Atur kursor di awal
lcd.print(text); // Tampilkan teks awal
}
void loop() {
// Tombol scroll ditekan
if (digitalRead(buttonScrollPin) == LOW) {
scrollIndex++; // Geser teks ke kiri
if (scrollIndex > text.length()) {
scrollIndex = 0; // Kembali ke awal jika teks habis
}
displayScrollingText(); // Perbarui tampilan teks
delay(300); // Debounce tombol
}
// Tombol blink ditekan
if (digitalRead(buttonBlinkPin) == LOW) {
isBlinking = !isBlinking; // Toggle mode kedip
delay(300); // Debounce tombol
}
// Jika mode kedip aktif, jalankan animasi kedap-kedip
if (isBlinking) {
unsigned long currentTime = millis();
if (currentTime - lastBlinkTime >= blinkInterval) {
lastBlinkTime = currentTime;
blinkState = !blinkState; // Ubah status ON/OFF
if (blinkState) {
displayScrollingText(); // Tampilkan teks
} else {
lcd.clear(); // Bersihkan layar
}
}
}
}
// Fungsi untuk menampilkan teks dengan efek scroll
void displayScrollingText() {
lcd.clear();
String displayText = text.substring(scrollIndex) + " " + text.substring(0, scrollIndex);
lcd.setCursor(0, 0);
lcd.print(displayText.substring(0, 16)); // Tampilkan 16 karakter pertama
}