#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
// Inisialisasi LCD 16x2 dengan alamat I2C 0x27
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Konfigurasi pin LED
int ledPins[] = {2, 3, 4, 5}; // LED binary display (4 LED)
int ledGreen = 6; // LED Hijau untuk jawaban benar
int ledRed = 7; // LED Merah untuk jawaban salah
int ledYellow = 8; // LED Kuning untuk status menunggu jawaban
// Konfigurasi Keypad 4x4
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] = {9, 10, 11, 12};
byte colPins[COLS] = {A0, A1, A2, A3};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
int randomValue;
int playerGuess = -1;
void setup() {
lcd.begin(16,2);
lcd.backlight();
randomSeed(analogRead(0)); // Seed untuk random value
// Inisialisasi pin LED
for (int i = 0; i < 4; i++) {
pinMode(ledPins[i], OUTPUT);
}
pinMode(ledGreen, OUTPUT);
pinMode(ledRed, OUTPUT);
pinMode(ledYellow, OUTPUT);
// Pertama kali mulai game
startNewGame();
}
void loop() {
// Mendapatkan input dari keypad
char key = keypad.getKey();
if (key) {
// Cek apakah input adalah angka 0-9
if (key >= '0' && key <= '9') {
playerGuess = key - '0'; // Konversi karakter ke angka
// Cek jawaban
checkAnswer();
}
}
}
// Fungsi untuk memulai game baru
void startNewGame() {
randomValue = random(0, 10); // Hasilkan nilai acak antara 0-9
playerGuess = -1; // Reset tebakan pemain
// Menyalakan LED sesuai dengan nilai random dalam binary
for (int i = 0; i < 4; i++) {
digitalWrite(ledPins[i], (randomValue >> i) & 0x01);
}
// Menyalakan LED kuning dan tampilkan running text
digitalWrite(ledYellow, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tebak Angka:");
}
// Fungsi untuk mengecek jawaban pemain
void checkAnswer() {
// Matikan LED kuning (status menunggu selesai)
digitalWrite(ledYellow, LOW);
if (playerGuess == randomValue) {
// Jawaban benar
digitalWrite(ledGreen, HIGH);
// Running text "Jawaban Benar" di baris pertama
for (int i = 0; i <= 16; i++) {
lcd.setCursor(0, 0); // Setel ke awal baris pertama
lcd.print(" "); // Kosongkan baris pertama
lcd.setCursor(i, 0); // Setel posisi baru
lcd.print("Jawaban Benar"); // Tampilkan teks
delay(200);
}
digitalWrite(ledGreen, LOW);
} else {
// Jawaban salah
digitalWrite(ledRed, HIGH);
// Running text "Jawaban Salah" di baris pertama
for (int i = 0; i <= 16; i++) {
lcd.setCursor(0, 0); // Setel ke awal baris pertama
lcd.print(" "); // Kosongkan baris pertama
lcd.setCursor(i, 0); // Setel posisi baru
lcd.print("Jawaban Salah"); // Tampilkan teks
delay(200);
}
digitalWrite(ledRed, LOW);
}
delay(1000); // Waktu jeda sebelum game baru
startNewGame();
}