#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// Deklarasi alamat I2C LCD dan inisialisasi ukuran LCD (16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2); // Pastikan alamat I2C sesuai (umumnya 0x27 atau 0x3F)
// Deklarasi pin komponen
const int ledPinKuning[] = {2, 3, 4, 5}; // 4 LED kuning pada pin 2, 3, 4, dan 5
const int ledPinMerah = 6; // LED merah pada pin 6
const int ledPinHijau = 7; // LED hijau pada pin 7
// Konfigurasi keypad (baris: A0-A3, kolom: 8-11)
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {A0, A1, A2, A3}; // Baris keypad
byte colPins[COLS] = {8, 9, 10, 11}; // Kolom keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Variabel permainan
int angkaJawaban;
int tebakanPemain;
// Pola nyala LED untuk setiap angka
int polaLED[9][4] = {
{0, 0, 0, 1}, // Angka 1
{0, 0, 1, 1}, // Angka 2
{0, 1, 1, 1}, // Angka 3
{1, 1, 1, 1}, // Angka 4
{1, 0, 0, 0}, // Angka 5
{1, 1, 0, 0}, // Angka 6
{1, 1, 1, 0}, // Angka 7
{1, 0, 1, 0}, // Angka 8
{1, 0, 0, 1} // Angka 9
};
// Variabel running text
const char* runningText = "Cocokkan angka! ";
unsigned long lastScrollTime = 0;
int scrollPosition = 0;
int scrollSpeed = 300; // Atur kecepatan teks berjalan dalam milidetik
void setup() {
lcd.begin(16, 2);
lcd.backlight();
// Inisialisasi pin LED
for (int i = 0; i < 4; i++) {
pinMode(ledPinKuning[i], OUTPUT);
}
pinMode(ledPinMerah, OUTPUT);
pinMode(ledPinHijau, OUTPUT);
randomSeed(analogRead(0)); // Seed untuk angka acak
// Pilih angka jawaban secara acak dari 1 hingga 9
angkaJawaban = random(1, 10);
tampilkanPolaLED(angkaJawaban); // Tampilkan pola LED
}
void loop() {
// Tampilkan running text secara kontinu
tampilkanRunningText();
// Cek input pemain
char key = keypad.getKey();
if (key) {
tebakanPemain = key - '0'; // Konversi char ke int
if (tebakanPemain == angkaJawaban) {
tampilkanPesan("Kamu benar!", ledPinHijau);
} else {
tampilkanPesan("Kamu salah!", ledPinMerah);
}
angkaJawaban = random(1, 10); // Pilih angka acak baru
tampilkanPolaLED(angkaJawaban); // Tampilkan pola LED baru
}
}
// Fungsi untuk menampilkan pola LED berdasarkan angka
void tampilkanPolaLED(int angka) {
int index = angka - 1; // Sesuaikan dengan indeks polaLED
for (int i = 0; i < 4; i++) {
digitalWrite(ledPinKuning[i], polaLED[index][i]);
}
}
// Fungsi running text
void tampilkanRunningText() {
if (millis() - lastScrollTime >= scrollSpeed) {
lastScrollTime = millis();
lcd.clear();
// Geser teks dari kanan ke kiri
for (int i = 0; i < 16; i++) {
int charIndex = (scrollPosition + i) % strlen(runningText);
lcd.setCursor(i, 0);
lcd.print(runningText[charIndex]);
}
scrollPosition++;
if (scrollPosition >= strlen(runningText)) {
scrollPosition = 0;
}
}
}
// Fungsi menampilkan pesan saat jawaban benar atau salah
void tampilkanPesan(const char* pesan, int ledPin) {
unsigned long startTime = millis();
while (millis() - startTime < 2000) { // Menampilkan pesan selama 2 detik
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(pesan);
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
}
lcd.clear();
}