#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Stepper.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int steps = 200;
Stepper myStepper(steps, 4, 5, 6, 7);
const int redd = 10;
const int greenn = 11;
const int bluee = 12;
const int t = A0;
const int f = A1;
// Ultrasonic sensor pins
const int trigPin = 8;
const int echoPin = A3;
String questions[] = {"Pogi si butlig?", "Mabait si butlig?", "Is 1 + 1 = 2?", "cute ba me?", "is 3 x 5 = 20?"};
bool correctAnswers[] = {false, true, true, false, false};
int index[5] = {0, 1, 2, 3, 4};
int ques = 0;
int points = 0;
bool quizz = false;
bool endG = false;
void setup() {
lcd.init();
lcd.begin(16, 2);
lcd.noBacklight();
lcd.clear();
pinMode(redd, OUTPUT);
pinMode(greenn, OUTPUT);
pinMode(bluee, OUTPUT);
pinMode(t, INPUT);
pinMode(f, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
setRGB(0, 0, 0);
randomSeed(analogRead(0));
randomq();
myStepper.setSpeed(60);
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Welcome to Quiz!");
lcd.setCursor(0, 1);
lcd.print("Get ready!");
delay(3000);
for (int i = 3; i > 0; i--) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(i);
lcd.print("...");
delay(1000);
}
lcd.clear();
lcd.noBacklight();
setRGB(0, 0, 0);
}
void loop() {
bool isClose = ultra();
if (isClose && !quizz && !endG) {
quizz = true;
lcd.backlight();
displayq();
} else if (!isClose && quizz) {
quizz = false;
lcd.noBacklight();
setRGB(0, 0, 0);
}
if (quizz && !endG) {
if (digitalRead(t) == LOW || digitalRead(f) == LOW) {
Answer(digitalRead(t) == LOW);
delay(300);
ques++;
if (ques >= 5) {
pts();
playagain();
} else {
displayq();
}
}
}
}
void playagain() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Play again?");
lcd.setCursor(0, 1);
lcd.print("T: Yes F: No");
while (true) {
if (digitalRead(t) == LOW) {
delay(200); // Debounce delay
points = 0;
ques = 0;
randomq();
lcd.clear();
displayq();
endG = false;
break;
}
else if (digitalRead(f) == LOW) {
delay(200); // Debounce delay
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("End of the game");
setRGB(255, 255, 255);
delay(2000);
endG = true;
break;
}
}
}
void randomq() {
for (int i = 0; i < 5; i++) {
int r = random(i, 5);
int temp = index[i];
index[i] = index[r];
index[r] = temp;
}
}
bool ultra() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
float distance = (duration * 0.034) / 2;
return distance < 50;
}
void Answer(bool answer) {
bool correct = correctAnswers[index[ques]] == answer;
if (correct) {
points++;
setRGB(0, 255, 0);
displayr("Correct");
} else {
setRGB(255, 0, 0);
displayr("Incorrect");
myStepper.step(steps);
delay(500);
myStepper.step(-steps);
}
}
void displayq() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(questions[index[ques]]);
setRGB(0, 0, 255);
}
void displayr(const char* result) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(result);
delay(500);
}
void pts() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("My Points:");
lcd.setCursor(0, 1);
lcd.print(points);
setRGB(255, 255, 255);
delay(3000);
endG = true;
}
void setRGB(int red, int green, int blue) {
analogWrite(redd, red);
analogWrite(greenn, green);
analogWrite(bluee, blue);
}