#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Stepper.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int steps = 2048;
int S_Speed = 10;
Stepper myStepper(steps, 8, 9, 10, 11);
const int redd = 4;
const int greenn = 5;
const int bluee = 6;
const int f = 2;
const int t = 3;
// Ultrasonic sensor pins
const int trigPin = 13;
const int echoPin = 12;
String questions[] = { "Mike has one eye", "Mike's a monster", "Mike is scary", "Mike works alone", "Mike flies", "Mike has a pet", "Mike hates water.", "Mike can sing", "Mike jumps high", "Mike is green." };
bool correctAnswers[] = { true, true, false, false, false, false, false, false, false, true };
int index[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int ques = 0;
int points = 0;
bool quizz = false;
bool endG = false;
bool isClose;
void setup() {
myStepper.setSpeed(80);
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);
}
void loop() {
isClose = ultra();
if (isClose && !quizz && !endG) {
// Start quiz if someone is detected
startQuiz();
} else if (!isClose && quizz) {
// Reset if no one is detected
reset();
}
if (quizz && !endG) {
if (digitalRead(t) == LOW || digitalRead(f) == LOW) {
Answer(digitalRead(t) == LOW);
delay(300);
ques++;
if (ques >= 10) {
pts();
playagain();
} else {
displayq();
}
}
}
}
void startQuiz() {
quizz = true;
setRGB(255, 255, 255);
lcd.backlight();
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("WELCOME TO");
lcd.setCursor(3, 1);
lcd.print("WAZOWSQUIZ");
delay(3000);
for (int i = 3; i > 0; i--) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(i);
lcd.print("...");
delay(1000);
}
lcd.clear();
displayq();
}
void reset() {
lcd.clear();
lcd.noBacklight();
setRGB(0, 0, 0);
points = 0;
ques = 0;
endG = false;
quizz = false;
delay(5000);
}
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);
reset();
startQuiz();
break;
} else if (digitalRead(f) == LOW) {
delay(200);
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 < 10; i++) {
int r = random(i, 10);
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");
if (steps >= 2048) {
myStepper.setSpeed(S_Speed);
myStepper.step(steps - 1792);
}
if (steps <= 2048) {
myStepper.setSpeed(S_Speed);
myStepper.step(-steps + 1536);
}
myStepper.step(steps - 1792);
}
}
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);
}